从命令行非交互地添加 sudoer

从命令行非交互地添加 sudoer

(在 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

相关内容