2015-02-11 3 views
1

Я новичок в сценарии оболочки, я пытаюсь запустить следующую команду из сценария оболочки.запуск команды ssh из сценария оболочки

diff <(ssh [email protected]_host 'cat remote_file.txt') <(ssh [email protected]_host2 'cat remote_file2.txt') 

но получаю сообщение об ошибке:

./a.sh: syntax error at line 1: `(' unexpected 

Я попробовал несколько примеров корыто googleing, который говорит использовать $() вокруг кода, но он не работает какой-либо одной, пожалуйста, помогите мне с этим.

+0

Похожи, вы используете '/ bin/sh' для вашего сценария, который не поддерживает процесс замещения. Попробуйте использовать '/ bin/bash'. –

+0

Привет, Etan, я попытался с помощью '#!/Bin.sh' и' #!/Bin/bash' в обоих случаях получить ошибку './a.sh: ошибка синтаксиса в строке 2:' vars = $ 'неожиданный'' –

+0

Как вы запускаете скрипт? Имеет ли разрешения на выполнение? Этот фрагмент имеет только одну строку. Если вы получаете ошибки из строки 2, мы не сможем помочь вам с ними (и ошибка в строке 2 означает, что 'bash' принял синтаксис' <() '). –

ответ

2

Я понимаю, что вы хотите использовать выходные данные из двух удаленных файлов в «diff». Есть много вещей, которые не так в вашем решении:

  • Вы не можете переадресовать два выходных потоков в один входной поток
  • Diff работает только на файлах, а не на стандартный ввод
  • , используя вывод одной команды в качестве входных данных для другая команда выполняется с использованием трубы. Переадресация осуществляется либо из файла в команду, либо из команды в файл.
  • скобки используются для объединения команд, например "(echo a; echo b) | cat" приведет к тому, что выходные данные 'echo a' и 'echo' b 'будут переданы в одном потоке на вход' cat ', который просто распечатает его.

Что бы я сделал (чтобы выполнить то, что я думаю, что вы хотите сделать), это включить его в три отдельных команд:

ssh [email protected]_host 'cat remote_file.txt' > file1 
ssh [email protected]_host2 'cat remote_file.txt' > file2 
diff file1 file2 
+0

Это работает благодаря Хенк –

+0

Привет, Я создал скрипт со следующей идеей, как представлено, которая выглядит следующим образом:

 ' #!/usr/local/bin/bash srchost='echo $1 | cut -d ':' -f 1' srcpath='echo $1 | cut -d ':' -f 2' dishost='echo $2 | cut -d ':' -f 1' dispath='echo $2 | cut -d ':' -f 2' echo $srchost echo $srcpath echo $dispath echo $dishost ssh $srchost 'cat $srcpath' > file1 ssh $dishost 'cat $dispath' > file2 diff file1 file2 ' 
** это скриптовый застревать ** –

+0

'<()' не перенаправления ввода , Это подстановка процесса и использование этого дважды в одной командной строке отлично. Это делает все четыре пункта в этом сообщении неправильными (как применимо здесь). –

0

Я просто сделать этот Баш скрипт без проблем

#!/bin/bash 
diff <(ssh [email protected]_host cat remote_file.txt) <(ssh [email protected]_host2 cat remote_file2.txt) 
exit 0 

Работает на следующих условиях:
-remote_host и remote_host2 остаются в списке ~/.ssh/known_hosts
-user и user2 существует и имеет разрешение
-remote_host и remote_host2 действуют и имеет SSH сервера на
-user @ remote_host и user2 @ remote_host2 настроил SSH для работы без паролей
, если вы не знаете, как это увидеть http://www.linuxproblem.org/art_9.html

может быть ваша ошибка остаться в ', но он должен работать хорошо, если вы не используете 'remote_file.txt' и использовать только remote_file.txt