如何使用并行 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

以及谷歌讨论中描述的方法谷歌群组 输出错误为:

[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 即可。

相关内容