並列 ssh で sudo を実行する方法

並列 ssh で sudo を実行する方法

Linux: Ubuntu 14.04.3 LTS

cat /tmp/passfile
ABCxyz123

sshpass -f /tmp/passfile parallel-ssh -I -A -h hostlist.txt "sudo -S ls -l /root" < /tmp/passfile

そして、ここでGoogleのディスカッションで説明されている方法グループ.google 次のようにエラーを出力します:

[1] 01:07:25 [FAILURE] 10.0.4.194 Exited with error code 255
[2] 01:07:25 [FAILURE] 10.0.4.205 Exited with error code 255

接続しようとしているリモートサーバーの/var/log/auth.logには以下のメッセージがあります

Sep 24 19:20:52 ubu1401 sshd[5765]: Accepted password for ubuntu from 10.0.4.1 port 55019 ssh2
Sep 24 19:20:52 ubu1401 sshd[5765]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
Sep 24 19:21:26 ubu1401 sshd[5765]: pam_unix(sshd:session): session closed for user ubuntu
Sep 24 19:21:26 ubu1401 sudo: pam_unix(sudo:auth): conversation failed
Sep 24 19:21:26 ubu1401 sudo: pam_unix(sudo:auth): auth could not identify password for [ubuntu]
Sep 24 19:22:25 ubu1401 sshd[5791]: Connection closed by 10.0.4.1 [preauth]

答え1

パスワードをできるだけ安全に提供するには、このバージョン ( psshCentOS、Fedora、parallel-sshUbuntu、Debian) を試してください。

stty -echo; printf "Password: "; read PASS; stty echo; echo "${PASS}" | \ ssh <USER>@localhost "sudo -S dmesg"

更新(@chutzに感謝):

read -s -p "Password: "; echo "${REPLY}" | \ ssh <USER>@localhost "sudo -S dmesg"

そしてこれをpsshに次のように適応させます(それに応じて更新):

read -s -p "Password: "; echo "${REPLY}" | \ pssh -H <USER>@localhost -o /tmp/output -I "sudo -S dmesg"

複数のサーバーからダンプをアドホックに収集する場合も同じ方法を使用します。通常どおりCtrl+を使用して停止します。 が表示されますが、これは tcpdump が無限に実行されるためです。出力は通常の場所にあります。オプションは、接続がタイムアウトしないようにするためです。tmux または screen を使用して、後でダンプを収集することもできます。C[FAILURE] <HOST> Interrupted-t 0

read -s -p "Password: "; echo "${REPLY}" | \ pssh -h <HOSTFILE> -o /tmp/output -t 0 -I "sudo -S tcpdump -l -nn -vv -i any not port 22"

正しい ssh ユーザーが含まれていること、および以前にそれらのサーバーに接続したことがあることを確認してください。ローカルでテストを行うことで、通常、サーバー群全体のダウンを防ぐことができます。複数のホストを近似するには、localhost の代わりに 127.0.0.X アドレスを使用できます。

答え2

シェルでパスワードをエコーし​​てこれを実行してみましたか?

echo "echo 'yourpassword'; sudo -S -c 'ls -l /root'"|pssh -I -H hostlist.txt

答え3

私は私のシンプルなツール「spssh.sh」(https://github.com/tangruize/spssh) はシンプルですが (36 sloc のみ)、十分に便利です。parallel-ssh とは異なり、spssh.sh は対話型であり、並列/個別の cmd 実行をサポートします。お役に立てば幸いです。

答え4

@satch_boogieに同意しますコメント上記 -ansible必要なときに使用しSUDOpssh必要でないときに使用します -初期設定はより複雑ですが、私の意見SUDOではよりクリーンです。ansible

短い答え:パッケージの更新とアップグレードの例apt:

ansible myservers -a "sudo apt -y update" --become -K

ansible myservers -a "sudo apt -y upgrade" --become -K

長い回答とセットアップ: 私の場合、リモート Linux マシンを管理するためにローカルで MacOS を使用していました。次の操作を実行しましたが、Linux を使用している場合は若干異なる可能性があります。

  1. ローカルとすべてのターゲット マシンに同じユーザーが作成されていることを確認します。sudo adduser username
  2. 各ターゲット マシンの SUDO グループにユーザーを追加します。usermod -aG sudo username
  3. (オプション)セットアップパスワードなしの SSHこれが必要かどうかは不明ですが、私の環境ではすでにこれが設定されていました。パスワードなしの SSH では必要ないかもしれないので、まずは以下の手順を試してください。
  4. ローカルマシンに ansible をインストールします: brew install ansible(または Linux sudo apt install ansible)
  5. ローカル マシンに Ansible のデフォルトのホスト ファイルを作成します。sudo mkdir /etc/ansible && sudo touch /etc/ansible/hosts
  6. ファイルを編集するsudo nano /etc/ansible/hosts
  7. ターゲット マシンをグループ (IP またはマシン名) の下に追加します。
[myservers]
blah1.local
blah2.local
blah3.local
  1. (オプション) すべてのターゲット マシンの SUDO グループに 2 番目のユーザーがいたので、プロンプト (使用時にsudo systemctlSUDO ユーザーの選択を求められるなど) を回避するために、このユーザーを SUDO グループから一時的に削除する必要がありました。ansible myservers -a "sudo deluser otheruser sudo" --become -K
  2. 次に、実際に必要な SUDO コマンドを実行します。例:ansible myservers -a "sudo apt -y update" --become -K
  3. (オプション) otheruser を SUDO グループに再度追加します。ansible myservers -a "sudo adduser otheruser sudo" --become -K

これで、マシン間で SUDO コマンドを実行する必要があるたびに、手順 8 ~ 10 を繰り返すだけです。

関連情報