我想在本地运行一个脚本,通过 ssh 在多个远程主机上调用“sudo ./up”。
其中 ./up 简单来说就是:
---- /home/user/up ----
#!/bin/bash
sudo apt update && sudo apt -y upgrade
-----------------------
所有主机上的用户名都是“用户”,并且该用户已被授予 sudoers 权限(在所有主机上)来调用该脚本。
密钥是通过 ssh 添加的,通常我不需要通过 ssh 连接到另一台主机时输入任何密码。
我可以从终端执行此操作:
ssh 用户@remotehost1 sudo ./up
ssh 用户@remotehost2 sudo ./up
ETC
但是,当我尝试将命令放在一个脚本中时,远程调用失败,因为系统要求我输入 root@remotehost 的密码(我不仅不想使用 root,而且“用户”已经有权在没有密码的情况下执行该脚本)
即:这个有效:
(在控制台中输入)
ssh user@remotehost1 sudo ./up
ssh user@remotehost2 sudo ./up
但这个失败了:
--- /home/user/up ---
#!/bin/bash
sudo ./up # does work, as expected
ssh user@remotehost1 sudo ./up # fails with password query
ssh user@remotehost2 sudo ./up # fails with password query
---------------------
这也失败了
--- /home/user/up ---
#!/bin/bash
sudo ./up # does work, as expected
ssh user@remotehost1 sudo --user user ./up # fails with password query
ssh user@remotehost2 sudo --user user ./up # fails with password query
---------------------
并且失败的意思是它暂停查询密码而不是完成并退出:
user@localhost:~$ sudo ./up
root@remotehost1's password:
- - - - 解决了 - - - -
---- /home/user/update ----
#!/bin/bash
sudo ./up
ssh host1 sudo ./up
ssh host2 sudo ./up
---- /home/user/up (on all machines) ----
#!/bin/bash
#user ALL=(ALL) NOPASSWD: /home/user/up
#
sudo apt update && sudo apt -y upgrade
[[ -f /var/run/reboot-required ]] && echo -ne "\\n\033[1;31m====== $HOSTNAME REBOOT REQUIRED =======\033[0m\\n"
[[ -f /var/run/reboot-required.pkgs ]] && cat /var/run/reboot-required.pkgs
echo "================ FINISHED ================"
然后只需在终端中执行./update
哦,谢谢 Ginnungagap。
答案1
您正在使用 sudo 调用一个包含 sudo 命令本身的脚本。
实际上,您所做的事情类似于sudo bash -c "sudo apt update && sudo apt -y upgrade"
。
第一个 sudo 运行良好,其他的则不太好。但它们完全没有意义,所以只需删除它们即可。
./up
由于调用是其第一个命令,因此您还遇到了无限循环./up
,但我认为这是由于混淆超级秘密脚本名称造成的。