如果sudo可以配置为不需要密码比如:
bob ALL=NOPASSWD: ALL
那么如何配置 sudo 以便能够对任何用户执行 sudo 而不需要密码?
以便
sudo -u domainnameuser.com mkdir www
适用于 sudo 用户,无需提示输入 [sudo] 密码?
是否可以允许此功能而不在 /etc/sudoers.d 中为每个用户明确启用它,而只允许切换到所有用户并使用所有命令?
答案1
创建这样的规则:
ALL ALL=(ALL:ALL) NOPASSWD: /bin/mkdir www ""
其内容类似于:“允许任何域上的任何用户以任何用户:组的身份运行精确命令“mkdir www”,而无需输入密码(仅使用/bin/mkdir
,而不是其他命令mkdir
)。结尾的引号表示sudo
不允许任何进一步的参数。
(规则按顺序确定,最后匹配的规则生效。如果在此规则之后还有另一条规则涵盖相同的命令(例如 ALL),则该规则将生效。我在自己的配置中遇到了问题,当时我在之后指定%sudo ALL=(ALL:ALL) ALL
。由于此规则与情况相符,但需要密码,因此会要求输入密码。)
确实,这不是做这种事情的方法。您的部分描述暗示您以一种奇怪的方式设置了一些东西。我不会深入讨论这个问题,因为它超出了范围,但为了实现您想要的目标并获得更大的灵活性,可能有更好的方法。您似乎想让用户创建具有特定名称的子目录,该子目录由父目录的所有者拥有。相反,创建一个脚本来执行您想要的操作(查找当前目录,确定其所有者和组,www
在此处创建一个目录,chmod
将新目录分配给确定的用户和组),并在配置中允许该脚本由 root 运行而无需密码sudo
。这样做意味着用户只需导航到目录sudo create-www
或其他什么。您还可以在脚本中配置其他规则,例如仅允许www
在某些目录中创建的规则。
答案2
下面是我使用基础镜像设置非 root 用户的方法ubuntu:18.04
:
RUN \
groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "Customized the sudoers file for passwordless access to the foo user!" && \
echo "foo user:"; su - foo -c id
上述代码会发生什么情况:
- 用户和组
foo
已创建。 - 该用户
foo
被添加到foo
和sudo
组中。 - 和
uid
被gid
设置为 的值999
。 - 主目录设置为
/home/foo
。 - 外壳设置为
/bin/bash
。 - 该
sed
命令对文件进行内联更新,/etc/sudoers
以允许foo
用户root
无密码访问该sudo
组。 - 该
sed
命令禁用#includedir
允许子目录中的任何文件覆盖这些内联更新的指令。
如果 Docker 不需要它,可以通过删除&&
命令后的尾部斜杠来非交互地完成此操作:
groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo &&
sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' &&
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' &&
sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' &&
echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers &&
echo "Customized the sudoers file for passwordless access to the foo user!" &&
echo "foo user:"; su - foo -c id