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

标签 linux bash permissions mkdir

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

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

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

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

最佳答案

脚本以运行它们的用户身份运行;文件的所有者和/或其所在的目录是无关紧要的(除非用户需要对文件和目录的读取和执行权限)。二进制可执行文件可以将它们的 setuid 位设置为使它们始终以文件所有者身份运行。旧的 unixes 也允许脚本使用此功能,但这会导致安全漏洞,因此现代 unixes/Linux 的脚本会忽略 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

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

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

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

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

关于linux - 在我的 bash 脚本中使用 mkdir 并获得拒绝权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56203775/

相关文章:

android - Flutter:我如何实时收听权限

java - 使用 GPS 时出现权限错误

linux - shell 脚本中 IFS 的多个值

linux - 如何计算shell中不同列之间的值

linux - 远程 ssh 命令无法正常工作

bash - 使用 while read 循环中的变量

C++ SIGTERM 捕获后不返回

用于查看文件是否在今天创建的 Python 脚本,发送包含结果的电子邮件

bash - 如何使用 args 和 echo 命令在 sed 命令中转义双引号?

c# - IsolatedStorage 不适用于 IE 保护模式? C#