首页 > 解决方案 > 在我的 bash 脚本中使用 mkdir 并拒绝获得权限

问题描述

我在root拥有的目录中有root拥有的脚本。脚本的一部分是创建一个目录来保存该脚本的输入/输出。我还有一个指向该脚本的 sim 链接,因此任何用户都可以从任何地方运行它。我不使用临时目录,因此以后可以将此信息用作日志。问题:当用户尝试运行脚本时,他们收到一个错误,即由于权限被拒绝而无法创建目录。问题:为什么脚本不让根目录独立于运行它的用户而拥有它?脚本如何使目录拥有它而不是运行它的用户?只有脚本需要此信息,而不是用户。

附加信息:目录是:drws--s--x。脚本是:-rwxr-xr-x。(如果您需要知道)脚本中的行很简单: mkdir $tempdirname

我正在匹配同一台服务器上正确输出文本文件的其他脚本的权限,但由于我的目录是一个目录,所以我遇到了权限错误。我尝试添加 suid 和 sgid 的权限。suid 听起来像是正确的解决方案,因为它应该使脚本运行,就好像它是由拥有该脚本的用户运行一样。(为什么这不是正确的解决方案?)

我希望任何用户都能够输入 sim 链接名称,这将在 root 拥有的目录中运行 root 拥有的脚本,并且该脚本创建的目录将保留在其自己的目录中。并且最终用户不了解或无法访问此过程的内部运作。(因此归根拥有)

标签: linuxbashpermissionsmkdir

解决方案


脚本以运行它们的用户身份运行;文件的所有者和/或它所在的目录是不相关的(除了用户需要对文件和目录的读取和执行权限)。二进制可执行文件可以设置其 setuid 位,以使它们始终以文件所有者身份运行。旧的 unix 也允许对脚本执行此操作,但这会导致安全漏洞,因此在现代 unix/Linux 中的脚本上会忽略 setuid。

如果您需要让普通用户以 root 身份运行脚本,还有其他几种方法可以做到这一点。一种是将脚本添加到您的 /etc/sudoers 文件中,以便用户可以sudo以 root 身份运行它。警告:如果您弄乱了 /etc/sudoers 文件,则可能很难恢复访问以清理它并恢复正常。首先进行备份,不要使用visudosudo. 您需要添加的行将是这样的:

%everyone ALL=NOPASSWD: /path/to/script

如果你想让这个自动化,这样用户就不必显式地使用sudo来运行脚本,你可以像这样启动脚本:

#!/bin/bash

if [[ $EUID -ne 0 ]];
then
    exec sudo "$BASH_SOURCE" "$@"
fi

编辑:我想到了一个更简单的版本;而不是让脚本在 下重新运行sudo,只需用这样的存根脚本替换符号链接:

#!/bin/bash
exec sudo /path/to/real/script "$@"

请注意,使用此选项,/etc/sudoers 条目必须引用真实脚本的路径,而不是符号链接的路径。此外,如果脚本不接受参数,您可以"$@"关闭。或者使用它,它也不会造成任何伤害。

如果弄乱 /etc/sudoers 听起来太吓人,还有另一种选择:您可以使用“编译”脚本shc(实际上只是在其周围创建一个二进制可执行包装器),然后将该 setuid 设为 root ( chmod 4755 /path/to/compiled-script; chown root /path/to/compiled-script)。由于它位于二进制包装器中,因此 setuid 将起作用。


推荐阅读