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


8

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

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

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

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

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


Ответы:


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

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


Просто как тот! Работает отлично. (Я должен был поставить «./» перед именем сценария, потому что в противном случае его искали ~/.elm/aliases.)
Эмануэль Берг

6
Как небольшое предупреждение, здесь важно использовать двойные кавычки ( "), а не одиночные ( '). Использование double означает, что оболочка на вашем локальном компьютере расширит переменную, а затем выполнит sshкоманду. Если бы использовались единичные, локальная оболочка не коснулась бы команды, которая отправляется дословно, но все еще распространяется в удаленной оболочке.
Тило Виклунд,

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

7

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

Обратите внимание, что если $myparameterсодержит пробелы, он будет разделен на стороне сервера. У printf Bash есть %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

1

Если можно с уверенностью предположить, что $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")"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.