使用需要输入的命令在脚本内部执行 sudo (bash)
sudo inside of a script with a command that needs input (bash)
我想制作一个改变屏幕亮度的脚本,除其他外,需要这个命令:
echo "$number" | sudo tee /sys/class/backlight/intel_backlight/brightness
脚本询问我的 root 密码,我认为这是不必要的,因为它只会改变亮度。我尝试添加 sudo -S
并回显密码,但我不仅混淆了输入的位置,而且脚本写出了令人讨厌的 [sudo] password for user:
提示。我如何让每个人都可以运行脚本(无论是从脚本内部还是外部,我这样做都是为了了解更多信息)?
您可以配置系统,使 sudo
不要求输入任何密码。我不建议这样做(将 ALL=NOPASSWD:
放入 /etc/sudoers
文件的适当位置),因为这是一个安全漏洞。
但您真正想要的是制作 setuid executable (BTW /usr/bin/sudo
is itself a setuid executable). It is tricky to understand, and you can make huge mistakes (opening large security holes). Read also carefully execve(2) & Advanced Linux Programming. Spend several hours to understand the setuid thing (if you misunderstand it, you'll have security issues). See also credentials(7) & capabilities(7).
出于安全原因,无法制作shell 脚本setuid。因此,您可以在 C 中编写一个小型包装器,在适当的调用后(例如 setresuid(2) 和朋友),将 运行 脚本通过 execve
,将该 C 程序编译为 setuid 可执行文件(因此 chown root
和 chmod u+s
你的可执行文件)。在您的特定情况下,您甚至不需要编写 C 程序来启动 shell 命令(您只需要 fopen
/sys/class/backlight/intel_backlight/brightness
伪文件然后 fprintf
进入它,和 fclose
它)。
实际上,我不认为做所有这些都是必要的,因为您应该能够配置您的系统,让您的屏幕亮度由非 root 用户设置。我不知道如何精确地做到这一点(但这是一个不同的问题)。
我想制作一个改变屏幕亮度的脚本,除其他外,需要这个命令:
echo "$number" | sudo tee /sys/class/backlight/intel_backlight/brightness
脚本询问我的 root 密码,我认为这是不必要的,因为它只会改变亮度。我尝试添加 sudo -S
并回显密码,但我不仅混淆了输入的位置,而且脚本写出了令人讨厌的 [sudo] password for user:
提示。我如何让每个人都可以运行脚本(无论是从脚本内部还是外部,我这样做都是为了了解更多信息)?
您可以配置系统,使 sudo
不要求输入任何密码。我不建议这样做(将 ALL=NOPASSWD:
放入 /etc/sudoers
文件的适当位置),因为这是一个安全漏洞。
但您真正想要的是制作 setuid executable (BTW /usr/bin/sudo
is itself a setuid executable). It is tricky to understand, and you can make huge mistakes (opening large security holes). Read also carefully execve(2) & Advanced Linux Programming. Spend several hours to understand the setuid thing (if you misunderstand it, you'll have security issues). See also credentials(7) & capabilities(7).
出于安全原因,无法制作shell 脚本setuid。因此,您可以在 C 中编写一个小型包装器,在适当的调用后(例如 setresuid(2) 和朋友),将 运行 脚本通过 execve
,将该 C 程序编译为 setuid 可执行文件(因此 chown root
和 chmod u+s
你的可执行文件)。在您的特定情况下,您甚至不需要编写 C 程序来启动 shell 命令(您只需要 fopen
/sys/class/backlight/intel_backlight/brightness
伪文件然后 fprintf
进入它,和 fclose
它)。
实际上,我不认为做所有这些都是必要的,因为您应该能够配置您的系统,让您的屏幕亮度由非 root 用户设置。我不知道如何精确地做到这一点(但这是一个不同的问题)。