引用符付きのsshコマンド


11

私はこれについて何も見つけることができなかったという奇妙なエラーがあります。以下のコマンドでユーザーコメントを変更したいのですが。

$ 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同様のループ内でファイルを編集することに成功しました。

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

回答:


6
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

14

SSHはシェルでリモートコマンドを実行します。引数のリストではなく、文字列をリモートシェルに渡します。sshコマンドに渡す引数は、間にスペースを入れて連結されます。引数はしsshているsudousermod-cNew Commentuser、なるように、リモートシェルはコマンドを見て

sudo usermod -c New Comment user

usermodCommentユーザーの名前およびuser偽の余分なパラメーターとして解析されます。

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.