目的是在机器未收到用户的中止命令时重新启动机器。问题在于终端的设置方式,用户必须为shutdown
、init
、reboot
等命令提供 SU 密码。我们想知道是否可以在 bash 脚本本身中提供密码,也许使用 stdin。即:
#!/bin/bash
# (script)
echo "Terminal will restart in 60s, Ctrl+C to cancel."
sleep 60
su - root -c "init 6" < "password"
我们将尝试将密码放入文件中并将其作为标准输入。
编辑:sudo
和expect
不是解决方案,因为由于需要大量的许可文书工作和有限的时间,安装它们是不可能的。此外,我们希望使用init 6
或shutdown -r
而不是reboot
。
答案1
您可以配置sudo
允许任何用户以 root 身份运行您指定的某些命令,而无需输入密码。请参阅这篇 Server Fault 文章有关如何配置的描述sudo
。
然后,在脚本中使用 sudo 而不是 su:
sudo 重启
答案2
据我所知,您无法执行所要求的操作。当您使用stdin
with 时<
,密码将在 shell 实际要求输入密码之前通过 stdin 输入。您应该尝试使用 sudo。如果不行,最好的办法是chmod reboot
并授予自己执行权限。
答案3
你可以使用 socat 来完成:
user@host$ (sleep 1; echo SuperSecr3t) | socat - EXEC:'su -c id',pty
Password: ### No input here, just wait 1sec
uid=0(root) gid=0(root) groups=0(root)