リモートマシンでrootとして変更を行わずにローカルマシンからスクリプト/コマンドを実行する方法があるかどうか疑問に思いますか?
いくつかの背景
カピストラーノ経由でいくつかのタスクをセットアップしようとしていますが、sudo
アクセスが必要です。約30台以上のサーバーがあり、手動で更新/etc/sudoers
するのは面倒なので、このファイルをリモートで更新する方法があるかどうか疑問に思っていましたか?
リモートマシンでrootとして変更を行わずにローカルマシンからスクリプト/コマンドを実行する方法があるかどうか疑問に思いますか?
いくつかの背景
カピストラーノ経由でいくつかのタスクをセットアップしようとしていますが、sudo
アクセスが必要です。約30台以上のサーバーがあり、手動で更新/etc/sudoers
するのは面倒なので、このファイルをリモートで更新する方法があるかどうか疑問に思っていましたか?
回答:
bash
リモートシステムで実行してスクリプトをフィードすることにより、ローカルスクリプトをリモートで実行できます。
$ ssh user@host 'bash -s' < script.sh
編集する
sudo
リモートマシンでの使用が必要なコマンドを実行するには、ssh's
-t
optionを使用してコマンドをに渡します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/sudoers
root権限のためにファイルを変更したい場合、失敗します。
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.sed
method を使用すると、並行して対話することなく同じことができます。