リモートコンピュータでrootに変更せずにローカルコンピュータでスクリプト/コマンドを実行する方法があるかどうか疑問に思います。
いくつかの背景
Capistranoを介していくつかのタスクを設定しようとしていますが、sudo
アクセス権が必要です。約30台以上のサーバーがあり、/etc/sudoers
手動で更新するのは痛いでしょう。だから、リモートで更新する方法があるかどうか疑問に思います。
答え1
bash
リモートシステムでローカルスクリプトを実行し、スクリプトを供給してリモートで実行できます。
$ ssh user@host 'bash -s' < script.sh
編集する
sudo
リモートコンピュータで使用する必要があるコマンドを実行するには、ssh's
-t
オプションを使用してコマンドをに渡しますssh
。-t
擬似端末ユーザーが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
答え2
tee
このコマンドは、ファイルリダイレクトのsudo制限を回避するのに役立ちます。 sed を使用すると、文字エスケープの要件により不満を感じました。
これは、クラスタ内のすべてのシステムのホストを/ etc / hostsにリモート接続するために使用するコマンドです。
for i in {1..10}; do ssh [email protected].$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
答え3
複数のコマンドを実行またはリダイレクトする必要がある場合は、次の構文を使用する必要があります。
ssh server.com "sudo sh -c 'ps aux | grep jav > /root/1.txt'"
答え4
sudoersファイルを変更する前に、ルートルートパスワードまたはsudoルールで設定されたユーザーIDを介してルートレベルのアクセス権がすでに存在している必要があります。