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

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

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

有没有办法在 rsync 进程写入这些文件时创建具有这些所有权的文件,而不必在事后使用 chown 来检查和更改它们? 文件如此之多,以至于以后浏览它们所花费的时间令人望而却步。

我必须为多个用户组执行此操作,因此我不应该将 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

答案1

如果您想创建一个文件作为特定用户和组而不使用chown,您可以使用sudo并指定用户和组:

sudo -u \#49 -g \#58 touch /tmp/something

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


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

sudo runuser "$USER" -g somegroup

我在 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 ~]$ 

尽管“vagrant”用户不属于“floppy”组,但仍然如此。

答案2

$ sudo install -o angelo -g apache /dev/null angelo-file

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

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

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

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

答案3

只要您以提升的权限运行脚本,就不会有问题。例如:

#!/usr/bin/env bash 
touch foobar
chown www-data:sudo foobar

如果以普通用户运行,会失败:

$ ./foo.sh 
chown: changing ownership of `foobar': Operation not permitted

但如果你以 root 身份运行它,它就可以正常工作:

$ sudo foo.sh
$ ls -l foobar
-rw-r--r-- 1 www-data sudo 26M Sep 17 17:34 foobar

答案4

您可以在 ac 包装器上使用“setuid”来对其进行 chmod,但不建议这样做,因为这是一个非常巨大的安全漏洞,除非它在编程中受到严格限制。

相关内容