簡體   English   中英

如何使用參數在遠程服務器中執行本地腳本

[英]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它會返回一個錯誤。

如何用腳本傳遞參數?

使用bashksh作為/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

使用任何POSIX兼容/bin/sh

請注意,以下仍然需要在bash運行,但是當ssh進入的系統具有POSIX-baseline的/bin/sh ,只要遠程計算機安裝了bash ,它就能正常工作

為了防止充分惡意的參數數據(試圖利用printf %q在bash中使用的非POSIX兼容引用,當被轉義的字符串中存在不可打印的字符時),即使使用/bin/sh作為基線-POSIX (如dashash ),它會變得更有趣:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM