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-ssh
Ubuntu、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 中它更乾淨,儘管初始設定更複雜。pssh
SUDO
ansible
簡短回答:更新和升級包的範例apt
:
ansible myservers -a "sudo apt -y update" --become -K
ansible myservers -a "sudo apt -y upgrade" --become -K
長答案和設定: 對於我的情況,我在本地使用 MacOS 來管理我的遠端 Linux 電腦。我做了以下操作,如果您使用 Linux,可能會略有不同:
- 確保您在本機和所有目標電腦上建立了相同的使用者:
sudo adduser username
- 將使用者新增至每台目標電腦上的 SUDO 群組:
usermod -aG sudo username
- (也許是可選的)設置無密碼 ssh雖然我不清楚是否需要這樣做,但我的環境已經設定好了。首先嘗試以下步驟,因為無密碼 ssh 可能不需要。
- 在本機上安裝 ansible:(
brew install ansible
或 linuxsudo apt install ansible
) - 在本機電腦上為 ansible 建立預設的主機檔案:
sudo mkdir /etc/ansible && sudo touch /etc/ansible/hosts
- 編輯文件
sudo nano /etc/ansible/hosts
- 將目標機器加入群組(ip 或機器名稱)下:
[myservers] blah1.local blah2.local blah3.local
- (可選)我在所有目標電腦上的 SUDO 群組中都有第二個用戶,因此我必須暫時從 SUDO 群組中刪除該用戶以避免出現提示(就像使用
sudo systemctl
它時要求選擇 SUDO 用戶一樣):ansible myservers -a "sudo deluser otheruser sudo" --become -K
- 現在運行您想要的實際 SUDO 命令。例子:
ansible myservers -a "sudo apt -y update" --become -K
- (可選)將其他使用者重新新增回 SUDO 群組:
ansible myservers -a "sudo adduser otheruser sudo" --become -K
現在,每次我需要跨機器執行 SUDO 命令時,我只需重複步驟 8-10 即可。