Ssh

ssh 和 bash 執行命令的奇怪語法

  • August 11, 2015

我對 shell/bash 腳本很陌生,我正在 OSX 上編寫一個腳本來自動化一些相當乏味的工作。我正在嘗試使用ssh. 兩台機器上都有一個通用腳本,我稱之為ascript. 在兩台機器上,這個腳本都在 /usr/local/bin 中。

我知道我需要ascript遠端主機上的完整路徑才能像這樣執行它:

ssh user@otherHost bash -c "/usr/local/bin/ascript --FlagToDoSomething"

但是,我發現--FlagToDoSomething只有在我的腳本中按以下方式編寫它才能正確執行:

ssh user@otherHost bash -c " /usr/local/bin/ascript --FlagToDoSomething"

(即它需要在開放引號後換行)我在終端視窗中收到一條消息bash: -c: option requires an argument,但它的其餘部分繼續執行並且我得到了我期望的輸出。如果我不這樣做,我只會得到輸出,就好像我只是輸入ascript並按輸入一樣(所以是使用資訊)。

如果我刪除bash -c它可以正常工作,但我只是這樣做,因為無論出於何種原因: ssh user@otherHost "output=$(/usr/local/bin/ascript --FlagToDoSomething; echo \$output)" 嘗試在本地主機上執行此功能,這會導致一些時髦的輸出。在終止我的 ssh 連接之前,我需要在遠端主機上執行多個命令。

謝謝!

ssh user@otherHost "output=$(/usr/local/bin/ascript --FlagToDoSomething; echo \$output)"

這到底是要做什麼? $output尚未設置,因為迴聲在$(command substitution).

此外,$()由雙引號內的外殼擴展。這就是它在本地執行的原因。使用單引號來避免它。

也許你想要

output=$(ssh u@oh '/usr/local/bin/ascript --FlagToDoSomething')

刪除“-c”並將整個shebang放在引號中:

output=$(ssh widrick@widrick.net "bash /usr/local/bin/ascript --testable=fly"); 

echo $output;

引用自:https://unix.stackexchange.com/questions/222631