我正在尝试将文件复制到我的用户帐户不是目录所有者但属于目录组所有者的组的目录中。这些是我采取的步骤:
创建一个组并将我添加到该组
stephen@pi:~ $ sudo groupadd test-group
stephen@pi:~ $ sudo usermod -a -G test-group stephen
stephen@pi:~ $ grep 'test-group' /etc/group
test-group:x:1002:stephen
创建文件并列出权限
stephen@pi:~ $ touch example.txt
stephen@pi:~ $ ls -l example.txt
-rw-r--r-- 1 stephen stephen 0 Feb 9 10:46 example.txt
创建目录,将组属主修改为新组并更改目录权限以授予组写入权限
stephen@pi:~ $ sudo mkdir /var/www/testdir
stephen@pi:~ $ sudo chown :test-group /var/www/testdir/
stephen@pi:~ $ sudo chmod 664 /var/www/testdir/
stephen@pi:~ $ sudo ls -l /var/www
total 8
drwxr-xr-x 2 root root 4096 Oct 31 12:17 html
drw-rw-r-- 2 root test-group 4096 Feb 9 10:48 testdir
将新创建的文件复制到此目录
stephen@pi:~ $ cp example.txt /var/www/testdir/straight-copy.txt
cp: failed to access '/var/www/testdir/straight-copy.txt': Permission denied
对我来说,这应该是成功的;我是拥有此目录所有权的组的成员,并且组权限设置为 rw。最终,我希望复制到此目录的任何文件都继承父目录(/var/www/testdir)的权限。
我可以用 复制sudo
,但这不会从父目录继承所有者或权限,也不会保留原始所有权(可能因为我被提升为 root 进行复制):
复制sudo
并列出文件的所有权/权限
stephen@pi:~ $ sudo cp example.txt /var/www/testdir/straight-copy.txt
stephen@pi:~ $ sudo ls -l /var/www/testdir/
total 0
-rw-r--r-- 1 root root 0 Feb 9 11:06 straight-copy.txt
请问有人可以向我解释发生了什么吗?
当你这样做时:
仅修改了组数据库(
/etc/group
在您的情况下为内容)。相应的 gid 不会自动添加到运行 shell 的进程的补充 gid 列表中(或任何以stephen
' uid 作为其有效或真实 uid 的进程)。如果你运行
id -Gn
(它启动一个新进程(继承 uids/gids)并id
在其中执行),或者ps -o user,group,supgrp -p "$$"
(如果你的支持ps
)列出 shell 进程的那些,你会看到test-group
不在列表中。您需要注销并再次登录以使用更新的组列表(
login
(或其他登录应用程序)调用启动新进程,该调用initgroups()
查看passwd
和group
数据库以设置登录的祖先进程的 gid 列表会议)。如果你这样做
sudo -u stephen id -Gn
了,你会发现它test-group
也在那里sudo
使用initgroups()
或等效于为目标用户设置 gid 列表。与sudo zsh -c 'USERNAME=stephen; id -Gn'
此外,如单独提到的,您需要对目录具有搜索(
x
) 权限才能访问(包括创建)其任何条目。因此,在这里,无需注销并重新登录,您仍然可以执行以下操作:
您还可以使用它
newgrp test-group
来启动一个新的 shell 进程,test-group
并将其作为其真实有效的 gid,并将其添加到补充 gid 列表中。newgrp
将允许它,因为您已被授予组数据库中该组的成员资格。在这种情况下不需要管理员权限。或者
sg test-group -c 'some command'
运行shell以外的东西。这样做sg test-group -c 'newgrp stephen'
的效果是在恢复原始 (e)gid 的同时仅添加test-group
到您的补充 gid。还可以使用该
install
实用程序制作文件副本并同时指定所有者、组和权限:要复制
example.txt
,使其归 拥有stephen
,具有组test-group
和rw-rw-r--
权限。除了内容之外,要复制时间戳、所有权和权限,您还可以使用
cp -p
. GNUcp
还必须cp -a
尽可能多地复制元数据(简称--recursive --no-dereference --preserve=all
)。您需要目录的搜索权限:
如果您希望在目录中创建的文件归目录组所有,您还需要 sgid:
有关详细信息,请参阅了解 UNIX 权限和文件类型。