使用 sudo 时以特定所有者(用户/组)创建文件和目录

使用 sudo 时以特定所有者(用户/组)创建文件和目录

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

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

问题是:在此过程中创建的所有内容都归 root 或 sudo 用户所有。当我完成操作时(有时在操作过程中),我必须发出一系列chmodchown命令来纠正错误。

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

答案1

sudo -u username touch filename当脚本以 身份执行时,您始终可以这样做root。它通常不需要密码,具体取决于您的sudoers配置。

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


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

mkdir -m 0700 foo

默认情况下,文件操作遵循umaskshell 的设置。它定义了哪些权限被否认umask例如0022不是为组和其他人设置写入权限。设置为0077以防止组和其他人获得任何权限。


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

chmod g+s someDir

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

答案2

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

例如,zabbix-agentd 需要 /var/run 内的子文件夹,但最近的发行版使用 tmpfs 作为 /var/run,因此目录在重启后无法保留。我通过创建文件 /etc/sysconfig/zabbix-agentd 解决了这个问题,文件内容如下:

install -g zabbix -o zabbix -d /var/run/zabbix

答案3

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

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

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

sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"

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

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

strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something

或者你可以使用例如安装监视这是基于LD_PRELOAD机制的。

进一步工作的想法

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

sudo watch-chown do_something

相关内容