带有需要输入的命令的脚本内的sudo(bash)

时间:2016-07-02 00:23:56

标签: linux bash sudo

我想制作一个可以改变屏幕亮度的脚本,其中需要这个命令:

echo "$number" | sudo tee /sys/class/backlight/intel_backlight/brightness

脚本要求我提供root密码,我认为这是不必要的,因为它只会改变亮度。我尝试添加sudo -S并回显密码,但不仅让我对输入的内容感到困惑,而且脚本写出了[sudo] password for user:提示,这很烦人。我如何使每个人都可以运行脚本(从脚本内部和外部,我这样做是为了练习更多)?

1 个答案:

答案 0 :(得分:3)

您可以配置系统,以便sudo不要求任何密码。我不建议这样做(将ALL=NOPASSWD:放在适当位置的/etc/sudoers文件中),因为这是一个安全漏洞。

但你真正想要的是制作一个setuid可执行文件(BTW /usr/bin/sudo本身就是一个setuid可执行文件)。这很难理解,你可以犯很大的错误(打开大的安全漏洞)。请仔细阅读execve(2)& Advanced Linux Programming。花几个小时来理解 setuid 的事情(如果你误解它,你就会遇到安全问题)。另见credentials(7)& capabilities(7)

出于安全原因,无法将shell脚本设为 setuid 。因此,您可以在C中编写一个小包装器,在适当的调用(例如setresuid(2)和朋友)之后运行脚本execve,将该C程序编译为setuid可执行文件(所以chown rootchmod u+s你的可执行文件)。在您的特定情况下,您甚至不需要编写启动shell命令的C程序(您应该fopen /sys/class/backlight/intel_backlight/brightness伪文件然后fprintf进入它,{{1它)。

实际上,我不相信做所有必要的事情,因为你应该能够配置你的系统让你的屏幕亮度由非root设置。我不知道如何准确地做到这一点(但这是一个不同的问题)。