以不同的用户和组创建文件

Ang*_*elo 7 bash permissions su chown

我有一个 bash 脚本,它必须 rsync 才能下载在本地写入文件的文件,然后需要将所有者设置为 apache,并将组设置为特定用户组(该 apache 不是其成员)。

有没有办法创建具有这些所有权的文件,因为它们是由 rsync 进程写入的,而无需在事后使用 chmod 进行更改? 文件太多,以后浏览它们所花费的时间令人望而却步。

我必须为多个用户组执行此操作,因此我不应该将 apache 添加到这些组中,当然也不能将它们全部设为默认组。

换句话说:当 X 不是 Y 的成员时,root 是否可以以用户 X 和组 Y 的身份创建文件?

我试过使用 runuser,但我无法设置组(大概是因为 apache 不属于该组)。

我知道您可以使用 chmod 更改权限并添加任何用户/组组合。我要问的是是否有一种方法可以打开文件进行写入并在创建文件时使用任何用户/组组合。

尝试使用 sudo:

[root@centos7 tmp]# groups angelo
angelo : angelo wheel
[root@centos7 tmp]# groups apache
apache : apache
[root@centos7 tmp]# sudo -u angelo -g apache touch angelo-file
Sorry, user root is not allowed to execute '/bin/touch angelo-file' as angelo:apache on centos7
[root@centos7 tmp]# ls -ld angelo-file
ls: cannot access angelo-file: No such file or directory
[root@centos7 tmp]# sudo -u angelo -g angelo touch angelo-file
[root@centos7 tmp]# ls -ld angelo-file
-rw-r--r-- 1 angelo angelo 0 Nov 12 03:13 angelo-file
Run Code Online (Sandbox Code Playgroud)

Wil*_*ard 11

如果要在不使用 的情况下将文件创建为特定用户和组chown,则可以使用sudo并指定用户和组:

sudo -u \#49 -g \#58 touch /tmp/something
Run Code Online (Sandbox Code Playgroud)

请注意,您指定的用户必须有权写入您尝试执行此操作的目录。


或者,您可以以当前用户身份启动 shell,并将组设置为其他内容:

sudo runuser "$USER" -g somegroup
Run Code Online (Sandbox Code Playgroud)

我在 Vagrant 盒子上尝试了这个并成功:

[vagrant@localhost ~]$ sudo runuser "$USER" -g floppy
[vagrant@localhost ~]$ touch testfile
[vagrant@localhost ~]$ ls -l testfile
-rw-r--r--. 1 vagrant floppy 0 Nov  9 15:57 testfile
[vagrant@localhost ~]$ 
Run Code Online (Sandbox Code Playgroud)

尽管“流浪”用户不属于“软盘”组。


bk-*_*-se 5

$ sudo install -o angelo -g apache /dev/null angelo-file
Run Code Online (Sandbox Code Playgroud)

适用于我centos 6,安装版本 8.4。这里的安装是将(已知始终为空)/dev/null文件“复制”到目标,从而创建空文件,同时在同一/单个命令中设置目标文件的所有者和组,因为它是通过 sudo 以 root 身份运行的。

通过以下方式了解更多信息:man installinstall --help。它可以在同一个/单个命令中创建目录,并设置权限模式。install 命令经常在构建工具中使用,例如 makefile。

您可能也喜欢使用选项-T,因此如果目标预先存在但是一个目录,它将因错误而失败,而不是创建空angelo-file/null

编辑:OP询问了rsync,呃。--chmod从 rsync 3.1.2 开始,可以看到、--chown--usermap、 等选项--groupmap。(因为centos 6我可以从 iUS 存储库获取更新的 rsync)。