进行sudoing时,使用特定所有者(用户/组)创建文件和目录


22

我需要执行wget某些操作(在cwd中生成一个压缩文件),然后我必须将其解压缩,然后执行一些复制/移动/修改操作,并可能最终执行一个脚本(从下载的档案中)。

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

问题是:进程中创建的所有内容均由root或sudo用户拥有。完成后(有时是中途),我必须发出一系列chmodand chown命令来使事情变得正确。

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

Answers:


26

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

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


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

mkdir -m 0700 foo

默认情况下,文件操作会遵守umask外壳程序集。它定义了拒绝哪些权限。一个umask0022例如做为组和其他组写权限。设置为0077防止组和其他人获得任何权限。


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

chmod g+s someDir

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


1
我认为可以肯定地说,对于您的要求没有专门的支持。只有超级用户才能将chown文件提交给其他用户,并且像这样设置默认值可能会导致用户犯错,从而给其他用户权限而root用户却没有意识到。
丹尼尔·贝克

10

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

例如,zabbix-agentd在/ var / run中需要一个子文件夹,但是最近的发行版将tmpfs用于/ var / run,因此该目录在重新启动后将无法生存。我通过创建一个包含以下内容的文件/ etc / sysconfig / zabbix-agentd解决了该问题:

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

1
-m 0700例如也添加。回答。
环Ø

3
请注意,将install创建目录,然后更改所有者/组。因此,在短时间内目录没有指定的所有者/组。在某些情况下,它可能很重要。
user368507 '16

这适用于Alpine Linux
MauricioSánchez

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()syscall的监视下运行命令:

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

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

进一步工作的想法

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

sudo watch-chown do_something
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.