情况:
组A
需要访问权限/path/to/dir/foo
才能通过 ssh 或 ftp 上传文件,但相关目录:/path/to/dir/foo
归组所有B
(如果你想:/path
递归地拥有B
),出于安全原因,应该保持这种状态。
我尝试解决方案:
我创建了一个指向 的符号链接/home/A
,它A
拥有。接下来,我授予权限以便A
可以访问符号链接:
sudo ln -s /path/to/dir/foo /home/A/foo
sudo chown -h A:A /home/A/foo
我认为这/path/to/dir/foo
至少应该由以下团体拥有A
:
sudo addgroup C
sudo useradd -G C A
sudo chown -R B:C /path/to/dir/foo
sudo chmod -R 774 /path/to/dir/foo
完成所有这些操作后,我以用户身份通过 FTPS 客户端连接A
并将目录更改为:/home/A
。令我惊讶的是,符号链接不可见,这很奇怪,因为 proFTPd 设置为显示符号链接。
我还尝试通过 SFTP 连接到同一目录。这次符号链接可见,但当我尝试访问它时,我收到以下提示:
无法打开远程文件‘/path/to/dir/foo’。
权限被拒绝。
错误代码:3
来自服务器的错误消息:权限被拒绝
这让我几乎没有其他选择,因为这是我能想到的最简单的解决方案。
绝望的尝试:
我授予了 全局权限/path/to/dir/foo
,但我仍然无法以用户 身份访问foo
中的符号链接。含义:将打印。/home/A
A
ls -l /path/to/dir/foo
-rwxrwxrwx
问题:
如何创建/home/A/foo
指向 的符号链接/path/to/dir/foo
。尽管的主要所有者是用户:组(所有者是),但 哪个A
可以访问?/path/to/dir/foo
B
/path
B
答案1
如果你的目录位于 ext4 文件系统中,你可以使用 ACL。最好通过例子来解释;我的用户是romano
而另一个用户是default
。
作为romano
:
[romano:~/tmp] % mkdir -p a/b/c/d
[romano:~/tmp] % cd !$
cd a/b/c/d
[romano:~/tmp/a/b/c/d] % touch f1
[romano:~/tmp/a/b/c/d] % ls -l
total 0
-rw-rw-r-- 1 romano romano 0 nov 27 17:15 f1
显然我可以写入目录d
,它是我的......但是来自default
:
default@pern:/home/romano/tmp/a/b/c/d$ touch f2
touch: cannot touch ‘f2’: Permission denied
default
是的。没有符号链接会改变无法写入的事实。
现在,romano
我向组授予额外的访问权限default
:
[romano:~/tmp/a/b/c/d] % setfacl -m g:default:rwx .
(读作:为当前目录添加rwx
组权限)default
.
...现在,如default
:
default@pern:/home/romano/tmp/a/b/c/d$ touch f2
default@pern:/home/romano/tmp/a/b/c/d$ ls -l
total 0
-rw-rw-r-- 1 romano romano 0 nov 27 17:15 f1
-rw-rw-r-- 1 default default 0 nov 27 17:17 f2
ACL 语法有点复杂,但它是一个非常强大的工具。请参阅man setfacl
和man getfacl
获取完整信息和更多示例。
在您的情况下,如果您拥有/path/to/dir/foo
A:A,并且您希望组 B 具有写访问权限,foo
您应该:
为 B 组添加
+rx
指向每个目录的权限:setfacl -m g:B:r-x /path setfacl -m g:B:r-x /path/to setfacl -m g:B:r-x /path/to/dir
将
+rwx
目录的权限添加到 B 组:setfacl -m g:B:rwx /path7to7dir/foo
注意然而,我们似乎遇到了一个令人讨厌的错误...参见http://debbugs.gnu.org/cgi/bugreport.cgi?bug=8527。我不确定后果 --- 上面的简单情况可以正常工作,但请检查一下。
答案2
这个答案是基于 Rmano 在答案结尾给出的提示,尽管文件访问控制列表方法不起作用。
它不起作用,因为完整路径,例如/path/to/dir
至少需要读取+执行权限: 。这解决了我的问题,现在我可以访问主目录sudo chmod -R g+rx /path
中的符号链接,并写入包含的文件。A