(在 Centos 上通过 Docker)
我知道我可以使用 添加 sudoer visudo
。有没有办法直接从命令行将用户添加到 sudoer 列表,这样我就不必以交互方式执行此操作?
我之所以问这个问题,是因为我正在尝试配置不具备交互功能的 Docker centos 容器。
答案1
您可以使用cat
将文本附加到 的末尾/etc/sudoers
。首先,备份文件/etc/sudoers
。然后:
cat >> /etc/sudoers
...type one or more lines here...
[control-D]
一定要确保使用二大于号(>>
),而不只是一个,否则您将覆盖文件的全部内容。
答案2
我在尝试让我的 docker 容器允许 jenkins 脚本使用 sudo 命令而不提示输入密码时遇到了类似的问题。
这是通过 Dockerfile 解决的:
RUN echo "jenkins ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
答案3
为了能够做到这一点,您应该确保您的sudoers
文件中存在以下行:
%sudo ALL=(ALL:ALL) ALL
您可以自定义上述行,以更改权限,就像%sudo
用户一样。该行将允许sudo
组中的任何用户使用sudo
。
现在为了允许<username>
使用sudo
,您只需usermod -a -G sudo <username>
以 root 身份执行操作即可,这将添加<username>
到sudo
组中。
答案4
考虑到这篇文章的年代,一种更现代的方法是将每个用户的文件放在/etc/sudoers.d/
适当的类似位置,无论操作系统是什么。只要你的sudoers
文件包含如下一行:
#includedir /etc/sudoers.d
然后可以使用这样的脚本为任何有效的用户名创建每个用户的 sudoers 文件:
#/usr/bin/env bash
SUDOERS_DIR='/etc/sudoers.d/'
if [ $# -eq 1 ]
then
printf '%s ALL=(ALL:ALL) ALL\n' "$1" > "$SUDOERS_DIR$1" && \
chmod 600 "$SUDOERS_DIR$1"
else
printf 'usage: $0 (username)\n'
printf '(username) will be given sudo privileges\n'
exit 1
fi
这样,非特权用户可以:
/home/jim> sudo -i
Password:
jim is not in the sudoers file. This incident will be reported.
可以轻松地为每个用户授予 sudo 访问权限:
/root# ./addsudo.sh
usage: $0 (username)
(username) will be given sudo privileges
/root# ./addsudo.sh jim
/root# ls -l /etc/sudoers.d/
total 1
-rw------- 1 root wheel 22 Oct 4 15:35 jim
/root# cat /etc/sudoers.d/jim
jim ALL=(ALL:ALL) ALL
瞧瞧:
/home/jim> sudo -i
Password:
/root#
当需要撤销sudo
权限时,只需rm
针对该用户执行以下文件:
# rm /etc/sudoers.d/jim