Выполнить удаленный скрипт с локальным значением параметра

Выполнить удаленный скрипт с локальным значением параметра

Как можно автоматизировать эту задачу?

1) Вы находитесь в точке A. 2) Вы подключаетесь по ssh к точке B. 3) Вы запускаете скрипт в точке B, которому нужен параметр, известный в точке A.

Сначала я подумал, что, возможно, я мог бы отправить значение, когда я открывал соединение с помощью ssh. Затем, вероятно, проще, между 1) и 2), scp весь скрипт в то же место в B (заменяя старый). Но все же, как мневыполнятьскрипт в B? (То есть, как автоматизировать этот последний шаг. Конечно, я мог бы запустить его вручную после ssh.)

Еще одна мысль, может быть, вообще отказаться от ssh - у меня есть веб-страница в B, так можно ли как-то вызвать скрипт через веб-интерфейс «изнутри»?

Или вы бы сделали это совершенно по-другому?

решение1

myparameter=foobar
ssh user@server "myscript $myparameter"

Это будет выполнено myscript foobarна сервере.

решение2

(Это продолжениемой комментарий к принятому ответу.)

Обратите внимание, что если $myparameterсодержит пробелы, то он будет разделен на стороне сервера. Bash printf имеет %qформат, который вы можете использовать. Пример:

$ myparameter='hello; rm somefile'
$ ssh user@server "echo $myparameter"
hello
rm: cannot remove `somefile': No such file or directory

$ ssh user@server "echo $(printf '%q' "$myparameter")"
hello; rm somefile

решение3

Если можно с уверенностью предположить, что это $myparameterбудетнетсодержат одинарные кавычки (в противном случае см.здесьили используйте printf '%q' ...решение janmoesen), вы можете просто заключить данные в одинарные кавычки, $myparameterчтобы избежать проблемы разделения пространства на стороне сервера.

myparameter="foo \" bar"
#myparameter="foo \" ' bar"

ssh localhost "set -xv; printf '%s\n' myscript '${myparameter}'"
ssh localhost "set -xv; echo $(set -xv; printf '%q' "$myparameter")"

решение4

Я не решаюсь отвечать на вопрос 10-летнего ребенка, особенно когда уже есть вполне хороший ответ, но заметьте, что «удаленный» сценарий на самом деле ненуждатьсявообще находиться на B. Это (a) делает замену параметров тривиальной и (b) устраняет сложность, связанную с тем, является ли вообще хорошей идеей иметь скрипт на удаленной системе (вопросы безопасности или что-то еще).

Альтернативой является просто запуск ssh с помощьюздесь докввод. В этом случае подстановка параметров производитсялокально, а не на удаленной системе (если только вы не заключите разделитель doc в кавычки, в данном случае EOF):

portnum=1234
[email protected]
mydir=/var/www/bar
param=foo

ssh -p$portnum $target /bin/bash <<EOF
  set -e;
  cd $mydir;
  # create remote 3-character file '/var/www/bar/myfile' containing 'foo'
  echo -n $param > myfile
EOF

Связанный контент