如何让用户在sudoers中执行包含引号的命令?

如何让用户在sudoers中执行包含引号的命令?

我有这个命令

chroot /chroots/box /bin/bash -c 'cd /repos/system && git pull'

我尝试在 /etc/sudoers 中写入

user ALL = (root) NOPASSWD: chroot /chroots/box /bin/bash -c 'cd /repos/system && git pull'

但那没用。在日志中我看到

sudo:      user : command not allowed ; TTY=pts/7 ; PWD=/home/user ; USER=root ; COMMAND=chroot /chroots/box /bin/bash -c cd /repos/system && git pull

我也尝试过在 sudo 调用中转义引号,例如\',它们在日志文件中出现相同的错误。

这个 repo 影响 chroot 的根文件系统,所以我无法从外部调用 git pull。

答案1

简单的解决方案是将您的命令放入脚本中,然后让您的用户通过 sudo 访问该脚本。

user ALL = (root) NOPASSWD: /path/to/yourscript

然后

#/bin/bash
chroot /chroots/box /bin/bash -c 'cd /repos/system && git pull'

确保您的用户对您的脚本没有写权限。

答案2

编辑:警告,看来 sudo 不能安全地处理命令中的空格,因此以这种方式使用 sudo 并不安全。https://unix.stackexchange.com/a/279142/39281

您可以不使用 sudoers 文件中的引号,而是使用反斜杠来转义空格:

user ALL = (root) NOPASSWD: chroot /chroots/box /bin/bash -c cd\ /repos/system\ &&\ git\ pull

您仍然可以按如下方式使用它,因为用户的 shell 无论如何都会处理引用的参数:

chroot /chroots/box /bin/bash -c 'cd /repos/system && git pull'

我个人喜欢另一个答案,将其放入脚本中,但这回答了实际问题。

相关内容