我正在为Linux开发一个桌面应用程序,该应用程序可以与一些Ubuntu系统文件进行交互。因此,在最终用户安装我的软件期间,我需要生成一个文件,以/etc/sudoers.d/
使许多脚本可以访问系统文件而无需知道密码。用户将在安装过程中输入密码,但是此后不必输入密码。在安装过程中,它们将运行give-sudo.sh
,其中包含以下Bash代码行:
echo '$USER ALL=(ALL) NOPASSWD: power_off.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: reboot.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: timeout_moss.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: timeout_default.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: set_next_os.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: boot_os_1.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: boot_os_2.sh' >> /etc/sudoers.d/moss-priv
echo '$USER ALL=(ALL) NOPASSWD: give_sudo.sh' >> /etc/sudoers.d/moss-priv
应该创建一个名为的文件moss-priv
,并添加使我的脚本运行而无需密码的必要行。我有8个脚本,所以我追加了8行代码。该echo
命令做工精细,moss-priv
生成其内容如下:
$USER ALL=(ALL) NOPASSWD: power_off.sh
$USER ALL=(ALL) NOPASSWD: reboot.sh
$USER ALL=(ALL) NOPASSWD: timeout_moss.sh
$USER ALL=(ALL) NOPASSWD: timeout_default.sh
$USER ALL=(ALL) NOPASSWD: set_next_os.sh
$USER ALL=(ALL) NOPASSWD: boot_os_1.sh
$USER ALL=(ALL) NOPASSWD: boot_os_2.sh
$USER ALL=(ALL) NOPASSWD: give_sudo.sh
这是发生问题的时间。sudo
它没有给脚本提供无密码的保护,而是打印一个堆栈跟踪,指出在每一行(1-8)发生了错误。不仅如此,如果我sudo
出于任何原因尝试调用它,它会显示“授权失败”和堆栈跟踪。因此,我完全失去了sudo
访问权限,甚至无法回去删除引起此问题的文件。我最终不得不重新安装整个操作系统,以使其恢复正常。
现在我已经sudo
回来了,一旦发现moss-priv
文件出了什么问题,我准备好再次尝试。不过我无法弄清楚,我认为它看起来不错。帮帮我?
对于该问题的解决方案或良好的替代方法,我将感到满意。
错误:
\>>> /etc/sudoers.d/moss-priv: syntax error near line 1 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 2 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 3 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 4 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 5 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 6 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 7 <<<
\>>> /etc/sudoers.d/moss-priv: syntax error near line 8 <<<
\sudo: parse error in /etc/sudoers.d/moss-priv near line 1
\sudo: no valid sudoers sources found, quitting
\sudo: unable to initialize policy plugin1\\
更新:从建议的修复程序,我有一个文件give_sudo.sh
:
echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/power_off.sh" >> /etc/sudoers.d/moss-priv echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/reboot.sh" >> /etc/sudoers.d/moss-priv echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/timeout_moss.sh" >> /etc/sudoers.d/moss-priv echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/timeout_default.sh" >> /etc/sudoers.d/moss-priv echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/set_next_os.sh" >> /etc/sudoers.d/moss-priv echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/boot_os_1.sh" >> /etc/sudoers.d/moss-priv echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/boot_os_2.sh" >> /etc/sudoers.d/moss-priv echo "$SUDO_USER ALL=(ALL) NOPASSWD: /home/jeremiahdgage/Desktop/MOSS/give_sudo" >> /etc/sudoers.d/moss-priv
其中一个脚本说timeout_moss.sh
:
sudo sed -i 's/GRUB_HIDDEN_TIMEOUT=10/GRUB_HIDDEN_TIMEOUT=0.01/g' /etc/default/grub
当我运行它时bash timeout_moss.sh
(当我在当前目录中时),它仍然要求输入密码...为什么?
echo '$USER ALL=(ALL) NOPASSWD: power_off.sh' >> /etc/sudoers.d/moss-priv
此后,文件看起来不正常。您需要提供完全限定的文件名(以下假设/sbin/power_off.sh
)。另外$USER
,单引号没有扩展,它以文字形式到达文件$USER
;我想这不是您想要的。使用双引号并指定完整路径:
echo "$USER ALL=(ALL) NOPASSWD: /sbin/power_off.sh" >> /etc/sudoers.d/moss-priv
文件中的行将如下所示:
kamil ALL=(ALL) NOPASSWD: /sbin/power_off.sh
提示:
/sbin/power_off.sh
无法执行,则无法使用。使用使其可执行chmod
。$USER
按预期扩展。如果您的安装脚本与一起运行,sudo
则可能需要$SUDO_USER
(请参阅参考资料man 8 sudo
)。无论如何,建议在写入文件之前检查扩展值是否合理。使用此处文档(因为您想扩展,所以使用无引号的单词$SUDO_USER
)以更优雅的方式写入文件。本示例将重新创建文件:
cat >/etc/sudoers.d/moss-priv <<EOF
$SUDO_USER ALL=(ALL) NOPASSWD: /sbin/power_off.sh
$SUDO_USER ALL=(ALL) NOPASSWD: /sbin/reboot.sh
$SUDO_USER ALL=(ALL) NOPASSWD: /sbin/timeout_moss.sh
$SUDO_USER ALL=(ALL) NOPASSWD: /sbin/timeout_default.sh
$SUDO_USER ALL=(ALL) NOPASSWD: /sbin/set_next_os.sh
$SUDO_USER ALL=(ALL) NOPASSWD: /sbin/boot_os_1.sh
$SUDO_USER ALL=(ALL) NOPASSWD: /sbin/boot_os_2.sh
$SUDO_USER ALL=(ALL) NOPASSWD: /sbin/give_sudo.sh
EOF
sudoers
允许您指定整个目录(通过完整路径,它应以开头/
和结尾/
)。将脚本移动到专用目录,您只需向添加一行/etc/sudoers.d/moss-priv
。但是,如果您需要通过这些工具可以访问工具PATH
,请记住sudo
可以使用单独的工具PATH
。sudo su -
),并一直保持打开状态。sudo
更改后可以在常规外壳中进行测试。如果您sudo
无法访问,请使用提升的外壳来解决问题(在您的情况下,/etc/sudoers.d/moss-priv
应该这样做)。tmux
或screen
作为普通用户使用,然后从那里打开高架外壳。这样,即使您在要修复sudo
访问权限的最关键时刻暂时失去连接,shell也将生存。您无需sudo
重新连接到tmux
/即可跳入高架外壳screen
。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句