Shell

帶引號的 ssh 命令

  • February 19, 2022

我有一個奇怪的錯誤,我一直無法在這方面找到任何東西。我想使用以下命令更改使用者評論。

$ 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命令的參數之間用空格連接。的參數sshsudo, usermod, -c,New Commentuser,所以遠端 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 自動執行命令

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