Shell
帶引號的 ssh 命令
我有一個奇怪的錯誤,我一直無法在這方面找到任何東西。我想使用以下命令更改使用者評論。
$ sudo usermod -c "New Comment" user
這將在登錄到伺服器時工作,但我想在 20 多台伺服器上自動化它。通常我可以使用一個列表並遍歷伺服器並執行一個命令,但在這種情況下我得到一個錯誤。
$ for i in `cat servlist` ; do echo $i ; ssh $i sudo usermod -c "New Comment" user ; done serv1 Usage: usermod [options] LOGIN Options: lists usermod options serv2 Usage: usermod [options] LOGIN Options: lists usermod options . . .
當我執行這個循環時,它會拋出一個錯誤,就像我錯誤地使用了命令一樣,但它會在單個伺服器上執行得很好。
瀏覽 ssh 手冊頁,我確實嘗試過
-t
標記-t -t
,但這些都不起作用。我已經成功地
perl -p -i -e
在類似的循環中使用來編輯文件。有誰知道我無法循環播放的原因?
for i in `cat servlist`;do echo $i;ssh $i 'sudo usermod -c "New Comment" user';done
或者
for i in `cat servlist`;do echo $i;ssh $i "sudo usermod -c \"New Comment\" user";done
SSH 在 shell 中執行遠端命令。它將字元串傳遞給遠端 shell,而不是參數列表。傳遞給
ssh
命令的參數之間用空格連接。的參數ssh
是sudo
,usermod
,-c
,New Comment
和user
,所以遠端 shell 可以看到命令sudo usermod -c New Comment user
usermod
解析Comment
為使用者名和user
虛假的額外參數。您需要將引號傳遞給遠端 shell,以便將註釋視為字元串。最簡單的方法是將整個遠端命令放在單引號中。如果您需要在該命令中使用單引號,請使用
'\''
.ssh "$i" 'sudo usermod -c "Jack O'\''Brian" user'
不要在循環中呼叫
ssh
並忽略錯誤,而是使用旨在在多個伺服器上執行命令的工具,例如 pssh、mussh、clusterssh 等。請參閱在許多伺服器上通過 SSH 自動執行命令