我试图将文件复制到我的用户帐户不是目录所有者但属于目录组所有者的组的目录中。这些是我已采取的步骤:
创建一个群组并将我添加到该群组
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
请问有人可以向我解释发生了什么事吗?
答案1
当你这样做时:
sudo usermod -a -G test-group stephen
/etc/group
仅修改了组数据库(您的情况下的内容)。相应的 gid 不会自动添加到运行 shell 的进程(或任何以stephen
's uid 作为其有效或真实 uid 的进程)的补充 gid 列表中。
如果您运行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()
或等同于为目标用户设置 gids 列表。与相同sudo zsh -c 'USERNAME=stephen; id -Gn'
还,如单独提到的, 你需要搜索( x
) 目录权限能够访问(包括创建)其任何条目。
因此,在这里,无需注销并重新登录,您仍然可以执行以下操作:
# add search permissions for `a`ll:
sudo chmod a+x /var/www/testdir
# copy as the new you:
sudo -u stephen cp example.txt /var/www/testdir/
您还可以使用它newgrp test-group
来启动一个新的 shell 进程作为test-group
其真实有效的 gid,并将其添加到补充 gid 列表中。
newgrp
将允许它,因为您已被授予组数据库中该组的成员资格。在这种情况下不需要管理员权限。
或者sg test-group -c 'some command'
运行 shell 之外的其他东西。这样做的sg test-group -c 'newgrp stephen'
效果是仅添加test-group
到您的补充 gid,同时恢复您的原始 (e)gid。
还可以使用该实用程序制作文件的副本并同时指定所有者、组和权限install
:
sudo install -o stephen -g test-group -m a=r,ug+w example.txt /var/www/testdir/
要复制example.txt
,请将其归 拥有stephen
,并具有组test-group
和rw-rw-r--
权限。
要复制除内容之外的时间戳、所有权和权限,您还可以使用cp -p
. GNUcp
还必须cp -a
复制尽可能多的元数据( 的缩写--recursive --no-dereference --preserve=all
)。
答案2
您需要目录的搜索权限:
chmod 775 /var/www/testdir
如果您希望在目录中创建的文件由该目录的组拥有,您还需要 sgid:
chmod 2775 /var/www/testdir
看了解 UNIX 权限和文件类型了解详情。