我有这个命令
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'
我个人喜欢另一个答案,将其放入脚本中,但这回答了实际问题。