
我怎麼才能自動化這個任務?
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