リモートサーバーでrootに変更を実行するにはどうすればよいですか?

リモートサーバーでrootに変更を実行するにはどうすればよいですか?

リモートコンピュータで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を介してルートレベルのアクセス権がすでに存在している必要があります。

関連情報