
Как можно автоматизировать эту задачу?
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