在没有密码的情况下授予sudo访问权限后解析sudoers中的错误

ragnvaldr.js

我正在为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(当我在当前目录中时),它仍然要求输入密码...为什么?

卡米尔·马乔洛夫斯基(Kamil Maciorowski)
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应该这样做)。
  • 如果是远程工作,则在测试中使用tmuxscreen作为普通用户使用,然后从那里打开高架外壳。这样,即使您在要修复sudo访问权限的最关键时刻暂时失去连接,shell也将生存。您无需sudo重新连接到tmux/即可跳入高架外壳screen

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在没有 sudo 和 root 访问权限的情况下卸载 Linux 中的程序

如何在没有订阅权限的情况下授予对资源组的访问权限以部署服务?

在不输入密码的情况下授予sudo二进制权限

如何在不向/ etc / sudoers添加`sudo -l`的情况下启用无密码的sudo权限列表(`sudo -l`)?

允许用户在没有密码的情况下使用sudo

在没有密码的情况下执行sudo?

sudo su在没有密码提示的情况下运行?

如何在没有密钥文件的情况下授予Cloud Run服务访问服务帐户凭据的权限?

如何在不将用户添加到 sudoers 文件的情况下授予用户对 root 拥有的文件夹的访问权限?

禁止在没有root用户访问权限的情况下通过密码SSH访问您自己的帐户

在没有root访问权限的情况下安装SCONS

在没有 root 访问权限的情况下构建 FLTK

在没有``sudo''的情况下访问(树莓派的)GPIO

在discord.py中如何在没有管理角色权限的情况下授予用户角色

如何在不授予对 gitlab 中 repo 的访问权限的情况下向用户授予拉取请求权限

在没有本地访问权限的情况下从 Repo 中删除节点模块

是否可以在本地计算机上没有sudo访问权限的情况下使用Juju?

是否可以在没有 RBAC 的情况下授予通过 AAD 创建 Azure 资源组的权限?

在没有密钥的情况下切换 numlock - 没有 sudo 权限

如何为git设置权限,使其在没有sudo的情况下运行

如何在没有密码的情况下sudo -i -u user_xx?

让单个用户在没有 sudo 密码的情况下执行命令

如何在没有密码的情况下运行sudo命令?

我可以在没有su的情况下通过sudo更改root密码吗?

是否可以在没有密码的情况下以 root 身份运行命令并输入 sudo?

如何在没有密码的情况下远程执行ssh命令和sudo命令

如何在没有密码的情况下运行特定的sudo命令?

无法在没有密码的情况下重新启动sudo

有没有一种方法可以在不授予用户权限的情况下更新Firestore的文档?