リモートマシンでrootとして変更を行わずにローカルマシンからスクリプト/コマンドを実行する方法があるかどうか疑問に思いますか?
いくつかの背景
カピストラーノ経由でいくつかのタスクをセットアップしようとしていますが、sudoアクセスが必要です。約30台以上のサーバーがあり、手動で更新/etc/sudoersするのは面倒なので、このファイルをリモートで更新する方法があるかどうか疑問に思っていましたか?
リモートマシンでrootとして変更を行わずにローカルマシンからスクリプト/コマンドを実行する方法があるかどうか疑問に思いますか?
いくつかの背景
カピストラーノ経由でいくつかのタスクをセットアップしようとしていますが、sudoアクセスが必要です。約30台以上のサーバーがあり、手動で更新/etc/sudoersするのは面倒なので、このファイルをリモートで更新する方法があるかどうか疑問に思っていましたか?
回答:
bashリモートシステムで実行してスクリプトをフィードすることにより、ローカルスクリプトをリモートで実行できます。
$ ssh user@host 'bash -s' < script.sh
編集する
sudoリモートマシンでの使用が必要なコマンドを実行するには、ssh's -toptionを使用してコマンドをに渡しますssh。この-tオプションは、疑似ttyを割り当て、が実行するコマンドをユーザーが操作できるsshようにします(パスワードの入力など)。sudo
$ ssh user@host -t 'sudo foo'
シェルリダイレクトではを使用するときにファイルを書き込むことができないためsed、この方法を使用してファイルを変更する>ことはリダイレクトよりも推奨されますsudo。さらに、sedコマンドに渡されるすべての変数は、エスケープする必要がありますssh。
$ ssh user@host -t 'sudo sed -i "\$a text to insert" /path/to/file'
すべてを自動化するには:
#!/bin/bash
SERVERS=( server1 server2 server3 )
for HOST in ${SERVERS[@]}; do
ssh user@${HOST} -t 'sudo sed -i "\$a text to insert" /path/to/file'
if [[ $? -ne 0 ]]; then
echo "ERROR: $HOST did not complete"
else
echo "$HOST complete"
fi
done
/etc/sudoersroot権限のためにファイルを変更したい場合、失敗します。
sudo私が理解しているところから設定されているパスワードの入力を求められます/etc/sudoers
sudoにこれらのマシンに対する権限がない場合、変更/etc/sudoersするには、sshを使用してとしてログインする必要がありますroot。したがって、コマンドは次のようになりますssh root@host -t 'sed -i "\$a text to insert" /path/to/file'
このteeコマンドは、ファイルのリダイレクトに関するsudoの制限を回避するのに役立つことがわかりました。sedを使用すると、文字のエスケープ要件のためにイライラすることがわかりました。
これは、クラスタ内のすべてのマシンのホストを/ etc / hostsにリモートで追加するために使用したコマンドです。
for i in {1..10}; do ssh ubuntu@10.1.1.$i -t "echo '10.1.1.1 dev-1
10.1.1.4 dev-4
10.1.1.3 dev-3
10.1.1.2 dev-2
10.1.1.6 dev-6
10.1.1.8 dev-8
10.1.1.5 dev-5
10.1.1.10 dev-10
10.1.1.9 dev-9
10.1.1.7 dev-7' | sudo tee -a /etc/hosts >/dev/null"
各反復の出力は次のようになります。
0+1 records in
0+1 records out
255 bytes (255 B) copied, 4.1338e-05 s, 6.2 MB/s
このSUの答えは、私の最終的なソリューションを構築する上で極めて重要でした:https : //superuser.com/a/1026359/587485
fabric.contrib.files.sedmethod を使用すると、並行して対話することなく同じことができます。