在执行 sudo 时创建具有特定所有者(用户/组)的文件和目录

Ash*_*ary 33 linux root permissions chmod chown

我需要wget一些东西(在 cwd 中产生一个压缩文件),然后我必须提取它,然后做一些复制/移动/修改的事情,也许最后执行一个脚本(从下载的存档)。

现在,所有这些任务直接(wget、提取等)或间接(运行脚本)都会导致创建文件和目录(都在当前工作目录中)。我做所有这些事情root(无法与最终的所需用户一起做)。

问题是:在进程中创建的任何东西都归 root 或 sudo 用户所有。当我完成(有时在中途)时,我必须发出一系列chmodchown命令来使事情正确。

现在,如果能以某种方式告诉系统“从现在起,当我以 root 用户身份发出命令时创建的任何文件或目录,您将创建具有这样那样的所有权和权限”,那就太好了。

Dan*_*eck 32

您可以随时sudo -u username touch filename在你的脚本为执行root。它通常不需要密码,具体取决于您的sudoers配置。

或者,运行su username -c touch filename. 附加参数提供给用户的外壳程序,外壳程序的-c选项按照约定执行指定的命令。


一些命令(如mkdir)支持参数来指定权限:

mkdir -m 0700 foo
Run Code Online (Sandbox Code Playgroud)

默认情况下,文件操作尊重umaskshell的设置。它定义了哪些权限被拒绝。一个umask0022例如做为组和其他组写权限。设置为0077阻止组和其他人获得任何权限。


您可以将setgid目录设置为让所有在其中创建的文件继承其组成员身份:

chmod g+s someDir
Run Code Online (Sandbox Code Playgroud)

某些 Unix支持setuid( chmod u+s)的相同行为,但不支持 Linux。


小智 15

还有另一种方式,我认为非常优雅。使用安装(1)

例如,zabbix-agentd 需要 /var/run 中的一个子文件夹,但最近的发行版使用 tmpfs 作为 /var/run,因此该目录在重新启动后无法生存。我通过创建一个文件 /etc/sysconfig/zabbix-agentd 来解决它,其中包含:

install -g zabbix -o zabbix -d /var/run/zabbix
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`install` 创建目录**,然后** 更改所有者/组。所以有很短的时间目录没有指定的所有者/组。在某些情况下,它可能很重要。 (4认同)

pab*_*ouk 5

在类 Unix 系统上,新创建的文件和目录由创建它们的进程的所有者拥有。标准实用程序通常没有更改所创建文件的所有者的选项。

带有原始用户的 UID 和 GID 的变量

如果您重复运行某些命令,则可以使用变量$SUDO_UID$SUDO_GID引用调用的用户sudo

sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"
Run Code Online (Sandbox Code Playgroud)

自动获取创建的文件和目录列表

如果您想自动获取已创建(和可能已修改)的文件和目录的列表,您可以在strace基于ptrace()系统调用的监视下运行您的命令:

strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something
Run Code Online (Sandbox Code Playgroud)

或者您可以使用例如基于该机制的InstallwatchLD_PRELOAD

进一步工作的想法

基于上述方法,可以创建一个工具,该工具将自动更改创建/修改文件的所有者和可能的访问权限。使用可以很简单:

sudo watch-chown do_something
Run Code Online (Sandbox Code Playgroud)