Ssh

在腳本中連結 ssh 更新命令失敗

  • November 27, 2020

我想在本地執行一個腳本,通過 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,而且“使用者”已經有權在沒有密碼的情況下執行該腳本)

即:這有效:

(在 konsole 中輸入)

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。

您正在使用包含 sudo 命令本身的 sudo 呼叫腳本。

實際上,您所做的類似於sudo bash -c "sudo apt update && sudo apt -y upgrade" .

第一個 sudo 工作正常,其他的不是那麼多。但是,它們完全沒有意義,因此請擺脫它們。

./up自從呼叫作為它的第一個命令以來,您也有一個無限循環./up,但我假設這是混淆超級騙子秘密腳本名稱的結果。

引用自:https://serverfault.com/questions/1044088