ssh 和 bash 執行命令的奇怪語法
我對 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;