![在启动时运行 sudo 命令的另一种方法](https://linux22.com/image/978540/%E5%9C%A8%E5%90%AF%E5%8A%A8%E6%97%B6%E8%BF%90%E8%A1%8C%20sudo%20%E5%91%BD%E4%BB%A4%E7%9A%84%E5%8F%A6%E4%B8%80%E7%A7%8D%E6%96%B9%E6%B3%95.png)
我正在尝试编写一个脚本,让 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 分钟运行一次root
。crontab
如果您担心安全后果,可以创建一个专用用户,该用户除了电源管理之外具有有限的权限。
将其添加到新文件:
*/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
(这也不安全)。
-S
switchsudo
将从 STDIN 读取密码。因此,你可以像这样使用它:
echo 'password' | sudo -S <command>