Linux系统的关机/重启的Shell脚本

3

有没有适合关闭或重新启动Linux机器的Shell脚本?我已经尝试了一个关机的Shell脚本,但是当我输入sudo shutdown时,它会要求输入密码。我们如何在脚本中输入密码?


使用脚本输入密码通常不是一个好主意,因为脚本的泄露(例如通过松散的权限、不安全的备份等)可能会暴露您的根密码。考虑采用不同的设计 - 例如作为“root”启动的守护进程。 - nneonneo
@Oldskool:感谢提供的信息。但是我想使用一个shell脚本来关闭机器。为此,我们需要输入密码。 - Bibin Jose
3个回答

7

我认为更加干净的方法是:

/etc/sudoers.d/中创建一个新文件,内容如下:

%users ALL=NOPASSWD: /sbin/shutdown
%users ALL=NOPASSWD: /sbin/reboot

这会使得sudo在任何"users"用户或组尝试执行关机或重启时不会要求输入密码。当然,你也可以指定其他组,如一个新创建的组来更精细地控制重启权限。
有关sudo的其他可能设置的更多信息,请参阅Manpage

@bratkartoffel:文件应该取什么名字? - Bibin Jose
您可以按照自己的意愿来命名它,例如简单地命名为“重新启动”或“电源控制”。更多信息可以在该目录内的README文件中找到。 - bratkartoffel

3

是的,使用-S开关可以从标准输入读取密码:

$echo <password> | sudo -S <command>

所以要关闭机器,您的命令应该是这样的(只需用您的密码替换<password>):
$echo <password> | sudo -S poweroff

泄露密码通常是个坏主意,寻找一些可以保护/隐藏密码的东西。过去我使用Jenkins插件在定期执行脚本时进行该操作。


@ Wald:你能否解释一下如何使用Shell脚本关闭Linux机器? - Bibin Jose
就像 Wald 所说的那样 $echo <password> | sudo -S reboot 或者 $echo <password> | sudo -S poweroff - Samuel
在我提供的那行代码中,你只需要将<password>更改为你的密码(你也可以回显一个系统变量,虽然它不是完全隐藏的密码,但仍然比直接从shell脚本中获取好)。同时,你还需要将<command>更改为你想要执行的sudo命令,而不是简单地使用“sudo”登录。 - Wald
1
我建议使用字符串重定向,因为它至少不会在进程列表中列出:sudo -S <command> <<< password - ColOfAbRiX
@ColOfAbRiX 是的,这可能更好,但最好使用其他程序对其进行加密。 - Wald

0
如果你真的想要实现它,你应该编写一个包含“关闭”命令的脚本;让“root”成为它的所有者,然后使用“chmod”命令设置SUID位,并为每个人赋予可执行权限。当执行时,脚本的所有者将变为“root”,不需要输入密码。

我喜欢这种方法。有人能验证它是否有效吗? - Patrick Michaelsen
许多操作系统会忽略对可执行 shell 脚本应用 setuid 属性,出于安全考虑。(来自维基百科:https://en.wikipedia.org/wiki/Setuid) - Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接