我需要做wget
一些事情(在 cwd 中生成一个压缩文件),然后我必须提取它,然后进行一些复制/移动/修改操作,最后执行一个脚本(从下载的档案中)。
现在,所有这些任务都直接(wget
、提取等)或间接(运行脚本)导致创建文件和目录(全部在当前工作目录中)。我以这样的方式做所有这些事情root
(无法与最终的期望用户一起做)。
问题是:在此过程中创建的所有内容都归 root 或 sudo 用户所有。当我完成操作时(有时在操作过程中),我必须发出一系列chmod
和chown
命令来纠正错误。
现在,如果能以某种方式告诉系统“从现在开始,当我以 root 身份发出命令时,您创建的任何文件或目录,您都将以这样的所有权和权限创建”,那就太好了。
答案1
sudo -u username touch filename
当脚本以 身份执行时,您始终可以这样做root
。它通常不需要密码,具体取决于您的sudoers
配置。
或者,运行su username -c touch filename
。附加参数将提供给用户的 shell,-c
shell 的选项将按照约定执行指定的命令。
一些命令(如mkdir
)支持参数来指定权限:
mkdir -m 0700 foo
默认情况下,文件操作遵循umask
shell 的设置。它定义了哪些权限被否认。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