如何使用並行 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群組 輸出錯誤為:

[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

為了盡可能安全地提供密碼,請嘗試此版本(pssh在 CentOS、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+停止它C。它將顯示[FAILURE] <HOST> Interrupted,但這只是因為 tcpdump 會無限運行 - 輸出仍然在通常的位置。此-t 0選項是為了確保連線不會逾時。我還可以使用 tmux 或 screen 並稍後收集轉儲。

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 使用者並且您先前已連接到這些伺服器。本機測試通常可以防止關閉整個伺服器群組。您可以使用 127.0.0.X 位址而不是 localhost 來近似多個主機。

答案2

您是否嘗試過透過在 shell 中回顯密碼來運行它?

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

答案3

我想推薦我的簡單工具“spssh.sh”(https://github.com/tangruize/spssh) ,這很簡單(只有 36 個 sloc),但足夠有用。與並行 ssh 不同,spssh.sh 是互動的,並且支援並行/單獨的 cmd 執行。希望能幫助你!

答案4

我同意@satch_boogie評論上面 -ansible當你需要時使用,當你不需要時SUDO使用-在IMO 中它更乾淨,儘管初始設定更複雜。psshSUDOansible

簡短回答:更新和升級包的範例apt

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

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

長答案和設定: 對於我的情況,我在本地使用 MacOS 來管理我的遠端 Linux 電腦。我做了以下操作,如果您使用 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 群組中都有第二個用戶,因此我必須暫時從 SUDO 群組中刪除該用戶以避免出現提示(就像使用sudo systemctl它時要求選擇 SUDO 用戶一樣):ansible myservers -a "sudo deluser otheruser sudo" --become -K
  2. 現在運行您想要的實際 SUDO 命令。例子:ansible myservers -a "sudo apt -y update" --become -K
  3. (可選)將其他使用者重新新增回 SUDO 群組:ansible myservers -a "sudo adduser otheruser sudo" --become -K

現在,每次我需要跨機器執行 SUDO 命令時,我只需重複步驟 8-10 即可。

相關內容