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
以及谷歌讨论中描述的方法谷歌群组 输出错误为:
[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 即可。