允许所有用户使用 sudo 执行特定命令

允许所有用户使用 sudo 执行特定命令

我想允许系统上的所有用户挂载以用户名命名的磁盘。同时,我不想允许用户 A 挂载用户 B 的磁盘。我的磁盘名称将在 /dev/disk/by-id/user-disk-${USER} 处可用

在我的 sudoers 文件中添加了以下内容,但无济于事

ALL ALL=(ALL) NOPASSWD: /usr/bin/mount /dev/disk/by-id/user-disk-${SUDO_USER} /mnt/${SUDO_USER}

这很好用 testuser ALL=(ALL) NOPASSWD: /usr/bin/mount /dev/disk/by-id/testuser /mnt/testuser

我尝试创建一个执行挂载的脚本,并允许使用 sudo 执行该脚本。这很有效。

我想知道是否可以在 sudoers 文件本身中使用变量扩展,而不是维护另一个脚本。

答案1

创建一个“受信任”的 shell 脚本,该脚本会自动根据环境变量构建命令,这是可行的方法。

sudo 中定义的命令不进行环境变量扩展。使用上面的示例,人们可以运行此文字命令(您必须转义美元符号或将其放在单引号中):

/usr/bin/mount /dev/disk/by-id/user-disk-${SUDO_USER} /mnt/${SUDO_USER}

它仅支持 shell 样式的通配符 (globs)。从手册页中可以看到:

通配符

sudo 允许在 sudoers 文件中的主机名、路径名和命令行参数中使用 shell 样式的通配符(又称元字符或 glob 字符)。通配符匹配是通过 IEEE Std 1003.1(“POSIX.1”)指定的 glob(3) 和 fnmatch(3) 函数完成的。

 *         Matches any set of zero or more characters (including white space).

 ?         Matches any single character (including white space).

 [...]     Matches any character in the specified range.

 [!...]    Matches any character not in the specified range.

 \x        For any character ‘x’, evaluates to ‘x’.  This is used to escape special characters such as: ‘*’, ‘?’, ‘[’, and ‘]’.

答案2

请注意,用户可以属于多个组。

假设所有有效用户都列在一个公共组“用户”中,然后使用组名执行以下操作:

%用户 ALL=(全部) NOPASSWD:/usr/bin/mount /dev/disk/by-id/testuser /mnt/testuser

相关内容