在脚本中链接 ssh 更新命令失败

在脚本中链接 ssh 更新命令失败

我想在本地运行一个脚本,通过 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,但我认为这是由于混淆超级秘密脚本名称造成的。

相关内容