web-dev-qa-db-ja.com

引用符付きの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のmanページを見てみると-tおよび-t -tフラグですが、機能しませんでした。

Perl -p -i -e同様のループ内でファイルを編集します。

私がこれをループできない理由を誰かが知っていますか?

11
SpruceTips
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
6
Mel

SSHはシェルでリモートコマンドを実行します。引数のリストではなく、文字列をリモートシェルに渡します。 sshコマンドに渡す引数は、間にスペースを入れて連結されます。 sshの引数はSudousermod-cNew Commentおよびuserであるため、リモートシェルはコマンドを認識します

Sudo usermod -c New Comment user

usermodは、Commentをユーザー名として、userを偽の追加パラメーターとして解析します。

コメントが文字列として扱われるように、リモートシェルに引用符を渡す必要があります。最も簡単な方法は、リモートコマンド全体を単一引用符で囲むことです。そのコマンドで単一引用符が必要な場合は、'\''を使用します。

ssh "$i" 'Sudo usermod -c "Jack O'\''Brian" user'

ループでsshを呼び出してエラーを無視する代わりに、pssh、mussh、clustersshなどの複数のサーバーでコマンドを実行するように設計されたツールを使用してください。 多くのサーバーでSSH経由でコマンドを自動的に実行