私はこれについて何も見つけることができなかったという奇妙なエラーがあります。以下のコマンドでユーザーコメントを変更したいのですが。
$ 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
同様のループ内でファイルを編集します。
私がこれをループできない理由を誰かが知っていますか?
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はシェルでリモートコマンドを実行します。引数のリストではなく、文字列をリモートシェルに渡します。 ssh
コマンドに渡す引数は、間にスペースを入れて連結されます。 ssh
の引数はSudo
、usermod
、-c
、New 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経由でコマンドを自動的に実行