我需要运行一个需要以 root 权限远程运行的脚本。因此我在脚本的开头添加了“sudo su”命令。然而 ssh 只是登录远程服务器并停留在 sudo su 命令,并且它不会从脚本的下一行继续。
<块引用>server.sh
sudo -s
sudo apt-get update
sudo apt-get upgrade
<块引用>
client.sh
scp -i "$key.pem" server.sh "$dns:/tmp"
ssh -tt -i "$key.pem" $dns "bash /tmp/server.sh"
server.sh 和 client.sh 位于同一个本地目录。当我运行 ./client.sh 时,远程运行的 server.sh 卡在第一行并且不继续执行“sudo apt-get update”命令。出现这种行为的原因是什么,有解决办法吗?
答案 0 :(得分:0)
sudo -s
没有命令会启动一个新的交互式 shell。以下命令在退出之前不会执行。请参阅man sudo
。
如果您已经通过 apt-get
运行 sudo
,并且 sudo
不需要密码,为什么还需要 sudo -s
?
答案 1 :(得分:0)
你可以使用
ssh user@ip '[command]'
在远程主机上运行 [command]。如果您有一个具有 root 权限的用户(又名 sudo)并且您可以使用没有密码的命令(NOPASSWD:[command,list or ALL]),这是我可以建议的最安全的方法,但是如果您希望脚本在远程服务器并由本地计算机触发,您可以随时
ssh user@ip 'sudo /bin/bash /home/[user]/server.sh'
这也可以。您也可以使用“scp”命令复制脚本,然后再次使用 ssh 将其删除,以实现自动化的单脚本方法。
答案 2 :(得分:0)
当您运行命令 sudo -s
时,您更改了用户,脚本的其余部分将丢失,因为它在一个新的 shell 中。
删除行 sudo -s
并再次尝试运行脚本。
注意:请务必记住,运行 sudo
的用户必须位于具有 /etc/sudoers
权限的 username ALL=(ALL) NOPASSWD:ALL
文件中。