![](/img/trans.png)
[英]How to execute a local bash script on remote server via ssh with nohup
[英]how to execute an local script in remote server with parameters
我寫了一個bash腳本foo.sh
#!/usr/bin/env bash
echo "starting the script";
我想在我的遠程服務器上執行它。 我嘗試了ssh user@remote-addr < test.sh
並且它有效。
之后我改變了test.sh文件
#!/usr/bin/env bash
echo "starting the script";
echo $1;
現在我想傳遞一個本地參數來執行我的腳本但是當我輸入ssh user@remote-addr < test.sh testparam
它會返回一個錯誤。
如何用腳本傳遞參數?
bash
或ksh
作為/bin/sh
如果您的remote /bin/sh
由bash或ksh提供,您可以使用不受信任的參數列表安全地執行以下操作,這樣即使是惡意名稱(如$(rm -rf $HOME).txt
)也可以安全地作為參數傳遞:
runRemote() {
local args script
script=$1; shift
# generate eval-safe quoted version of current argument list
printf -v args '%q ' "$@"
# pass that through on the command line to bash -s
# note that $args is parsed remotely by /bin/sh, not by bash!
ssh user@remote-addr "bash -s -- $args" < "$script"
}
此后...:
runRemote test.sh testparam
/bin/sh
請注意,以下仍然需要在bash
運行,但是當ssh
進入的系統具有POSIX-baseline的/bin/sh
,只要遠程計算機安裝了bash
,它就能正常工作 。
為了防止充分惡意的參數數據(試圖利用printf %q
在bash中使用的非POSIX兼容引用,當被轉義的字符串中存在不可打印的字符時),即使使用/bin/sh
作為基線-POSIX (如dash
或ash
),它會變得更有趣:
runRemote() {
local script=$1; shift
local args
printf -v args '%q ' "$@"
ssh user@remote-addr "bash -s" <<EOF
# pass quoted arguments through for parsing by remote bash
set -- $args
# substitute literal script text into heredoc
$(< "$script")
EOF
}
類似地調用為:
runRemote test.sh testparam
使用-s
選項,它強制bash
(或任何POSIX兼容的shell)從標准輸入讀取其命令,而不是從第一個位置參數指定的文件。 所有參數都被視為腳本的參數。
ssh user@remote-addr 'bash -s arg' < test.sh
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.