在我的 bash 脚本中使用 mkdir 并获得拒绝权限

Using mkdir in my bash script and getting permission denied

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

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

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

我希望任何用户都能够输入 sim link 名称,这将 运行 root 拥有的脚本位于 root 拥有的目录中,并且该脚本创建的目录将保留在它自己的目录中。最终用户不知道或无法访问此过程的内部工作原理。 (因此归 root 所有)

脚本 运行 作为 运行 的用户;文件的所有者 and/or 它所在的目录是无关紧要的(除非用户需要对文件和目录的读取和执行权限)。二进制可执行文件可以将它们的 setuid 位设置为使它们始终 运行 作为文件的所有者。旧的 unix 也允许脚本这样做,但这会导致安全漏洞,因此现代 unixes/Linuxes.

中的脚本会忽略 setuid

如果您需要让普通用户 运行 作为 root 执行脚本,还有其他几种方法可以做到这一点。一种是将脚本添加到您的 /etc/sudoers 文件中,以便用户可以使用 sudo 到 运行 作为 root 用户。警告:如果您弄乱了 /etc/sudoers 文件,可能很难恢复访问权限以清理它并恢复正常。首先做一个备份,不要用 visudo 以外的任何东西编辑它,我建议打开一个 root shell,这样如果出现问题,你将拥有 root 访问权限,你需要修复它而无需通过 sudo 进行宣传。您需要添加的行如下所示:

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

如果你想让这个自动执行,这样用户就不必明确地使用 sudo 到 运行 脚本,你可以像这样启动脚本:

#!/bin/bash

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

编辑:我想到了一个更简单的版本;而不是将脚本 re-run 本身放在 sudo 下,只需将符号链接替换为这样的存根脚本:

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

请注意,使用此选项时,/etc/sudoers 条目必须引用真实脚本的路径,而不是符号链接的路径。此外,如果脚本不带参数,您可以将 "$@" 关闭。还是用吧,也没什么坏处。

如果弄乱 /etc/sudoers 听起来太可怕了,还有另一种选择:您可以 "compile" 脚本 shc (实际上只是围绕它制作了一个二进制可执行包装器),并且使该 setuid 根 (chmod 4755 /path/to/compiled-script; chown root /path/to/compiled-script)。由于它在二进制包装器中,setuid 将起作用。