![SUDO:sudoers 文件中的用户名条件](https://linux22.com/image/32505/SUDO%EF%BC%9Asudoers%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E7%94%A8%E6%88%B7%E5%90%8D%E6%9D%A1%E4%BB%B6.png)
我试图允许我的用户(通过sudo
,在脚本中启动)将文件从他们的主目录复制到 Web 目录。
命令是:
sudo cp /home/$LOGNAME/file_source /var/www/$LOGNAME_file_dest
所以我在 sudoers 文件中添加了以下行:
%users ALL=(ALL)NOPASSWD:/bin/cp /home/$LOGNAME/file_source /var/www/$LOGNAME_file_dest
这不太有效,因为sudo
要求我输入密码,但它不应该。我猜这是变量的问题,$LOGNAME
该变量未在 sudoer 文件或类似文件中解释。
我差点忘了提,我是一个控制狂,这必须是一个非常严格的条件,没有*
或其他任何事情都可以容忍。
有没有人可以解决这样的问题,或者我应该采取痛苦的方式并允许 1 by 1 用户将cp
他的文件添加到/var/www
目录中?
答案1
Shell 变量由您的 shell 解释,并且 sudo 或使用它们启动的任何其他程序都不会看到它。也就是说,在执行 时foo=bar; echo "$foo"
,echo
永远不知道它传递的数据来自名为“foo”的变量,因为 shellecho
甚至在执行之前就对其进行了扩展。因此,不可能使 shell 变量在 sudoers 文件中透明地工作。
另外,由于$LOGNAME
可以是任何东西,所以您想要做的基本上相当于/home
在您的后面使用一个星号sudoers
,无论您是否使用它。我不建议这样做,因为您基本上可以以 root 身份将任何内容复制到任何地方,这是一个巨大的安全风险(因为$LOGNAME
可以包含..
)。最终,您说您不想使用*
,但您想要采取的操作同样危险。
最好的选择是允许/home/$LOGNAME/file_source
这些用户对任何内容进行读访问,并对其进行写访问/var/www
。您可以有一个www-logs
组,分别对这些路径进行组读取和组写入。
答案2
乔尔戴维斯有正确的答案,非常感谢大家的帮助!这就是“POSIX ACL 的脚本化应用程序”!
和: https://stackoverflow.com/questions/869536/linux-directory-permissions-read-write-but-not-delete
示例:(创建文件,一旦写入,它们是只读的,但可以被所有者删除,但不能被其他人删除。)
setfacl --set u::rwxs,g::rwx /controlled
setfacl -d --set u::r-x,g::r-x,o::- /controlled
这正是我需要做的。
非常感谢大家的帮助,我应该以不同的方式问这个问题。
答案3
创建一个脚本,在任何必要的检查后执行复制,并授予sudo
访问权限。
请注意,特权 shell 脚本被认为是不好的做法;您可能想要使用 Python 或 Perl 等替代方案。
创建的环境sudo
应该已经阻止用户覆盖库路径等,但您可能需要采取一些额外的步骤来固定它,以便只允许最小的系统库路径集。