在启动时运行 sudo 命令的另一种方法

在启动时运行 sudo 命令的另一种方法

我正在尝试编写一个脚本,让 Ubuntu 系统在电池剩余电量(例如)5% 时进入休眠状态。此脚本将在启动时运行。

我可以使用

upower -d |grep perc

然后我想使用

sudo pm-hibernate

每当电池电量低于 5% 时。但这需要超级用户权限。我不想每次登录后都一遍又一遍地输入密码。

一种方法是在 /etc/sudoers 中添加以下行

yourlogin ALL=(ALL) NOPASSWD: command_here 

但大多数人不建议这么做。

另一种方法是在中添加自定义启动脚本/etc/init.d。但我不确定这是否是一个安全的选择。

此外,还有其他最适合我的目的的替代方案吗?

答案1

比添加脚本更简单的init.d是编写 Upstart 配置。我最赞成这样做。在(例如)中创建一个.conf文件,包含:/etc/init/etc/init/sleep-on-suspend.conf

description "Automatic suspend"

start on runlevel [2345]
stop on runlevel [016]

exec /path/to/script

这将在重启时自动启动。

您甚至可以将脚本集成到此文件中。exec使用以下代码代替:

script
    while sleep 1; do
    upower -d | awk -F'[ %]*' '/perc/ && ($3 < 5) { exit 1 }' || pm-hibernate
    done
end script

答案2

运行sudo crontab -e -u root并将该行附加@reboot /path/to/script到文件底部,然后 root 用户将在登录时自动以 root 身份运行您的脚本。温馨提醒,确保除了您和 root 之外没有人可以访问该脚本,否则人们可以以 root 身份运行任何命令。

答案3

该脚本将在启动时运行。

如果您真的是这个意思那么您已经在谈论 root 权限了。

你的脚本的其余部分是什么样的?我们无法真正从孤立的命令来判断其安全性或缺乏安全性。

一个替代方案是,比如说,每 5 分钟运行一次rootcrontab如果您担心安全后果,可以创建一个专用用户,该用户除了电源管理之外具有有限的权限。

将其添加到新文件:

*/5 * * * * root /usr/local/sbin/hibernate-on-power-low

root如果您愿意,可以将其中的内容替换为专用用户)并将其安装在 中/etc/cron.d/hibernate-maybe。显然,执行实际工作的脚本必须安装在 中,/usr/local/sbin/hibernate-on-power-low并经过适当的安全性和效率审核(可能使用直接内核接口会比 更强大、更高效grep),并且显然,如果您已经以足够的权限运行,则无需sudo运行pm-hibernate

答案4

另一种选择是使用sudo -S(这也不安全)。

-Sswitchsudo将从 STDIN 读取密码。因此,你可以像这样使用它:

echo 'password' | sudo -S <command>

相关内容