2014-10-10 2 views
1

Я хотел бы видеть обе команды печати hello

$ bash -l -c "/bin/echo hello" 
hello 
$ ssh example_host bash -l -c /bin/echo hello 

$ 

Как hello быть передан в качестве параметра в команде ssh?

Требуется bash -l -c, поэтому сценарии запуска оболочки входа в систему выполнены.

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

+1

'SSH example_host 'баш -l -c "/ бен/эхо привет"'' –

ответ

2

Когда вы передаете дополнительные аргументы после -c, они помещаются в argv оболочки во время выполнения этой команды. Вы можете видеть, что как так:

bash -l -c '/bin/echo "$0" "[email protected]"' hello world 

... так, эти аргументы не помещаются в командной строке эхо (если вы не выходите из своего пути, чтобы сделать это так), но вместо этого положите в командной строке оболочки, о которой вы говорите, чтобы запустить echo без аргументов.

То есть: При запуске

bash -l -c /bin/echo hello 

... это эквивалент этого:

(exec -a hello bash -c /bin/echo) 

... который ставит hello в $0 из Баша, который работает только /bin/echo , Так как бег /bin/echo не выглядит на $0, конечно, он не собирается печатать hello.

Теперь, поскольку выполнение вещей через ssh означает, что вы проходите два этапа расширения оболочки, это добавляет дополнительную сложность. К счастью, вы можете иметь оболочку обрабатывать, что для вас автоматически, например, так:

printf -v cmd_str '%q ' bash -l -c '/bin/echo "$0" "[email protected]"' hello world 
ssh remote_host "$cmd_str" 

Это говорит Баш (printf %q является расширением баш, не доступен в POSIX Printf) процитировать вашу команду так, что она расширяется в себя, когда обрабатывается оболочкой, затем подает результат на ssh.


Все, что сказал - лечение $0 как обычный параметр является плохой практикой, и, как правило, не должно быть сделано в отсутствие конкретного и убедительных причин. Right Thing больше напоминает следующее:

printf -v cmd '%q ' /bin/echo hello world # your command 
printf -v cmd '%q ' bash -l -c "$cmd"  # your command, in a login shell 
ssh remotehost "$cmd"      # your command, in a login shell, in ssh 
+0

еще не радость при выполнении его через SSH: $ SSH example_host Баш -l -c '/ bin/echo "$ 0" "$ @"' hello world только возвращает только строку новой строки –

+0

@JoeDoyle, см. расширение ответа на вопрос, как использовать 'printf% q' для подготовки контента для' eval 'pass (как выполняется ssh, или sh -c, или в подобных сценариях). –

+0

отлично работает. надеюсь, что легко работать с одним подпроцессом Python.Popen() call –

Смежные вопросы