我想允许系统上的所有用户挂载以用户名命名的磁盘。同时,我不想允许用户 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