使用本地參數值執行遠端腳本

使用本地參數值執行遠端腳本

我怎麼才能自動化這個任務?

1) 您位於 A。

首先,我想也許當我用 ssh 打開連接時可以發送該值。然後,可能更簡單,在 1) 和 2) 之間,將整個腳本 scp 到 B 的相同位置(替換舊位置)。但我還是怎麼辦執行B處的腳本? (也就是說,如何自動化最後一步。當然,我可以在 ssh 之後手動運行它。)

另一個想法,也許完全放棄 ssh - 我在 B 處有一個網頁,那麼該腳本是否可以透過「幕後」Web 介面呼叫?

或者你會以完全不同的方式來做這件事嗎?

答案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這裡是文檔輸入。在這種情況下,參數替換完成本地,而不是在遠端系統上(只要您不引用文檔分隔符,在本例中為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

相關內容