我花了几个小时试图找出为什么事情出错了,但现在我放弃了,所以我来到这里。
我的设置/问题:我有一个远程 VPS,我通过 SSH(公钥/私钥,无密码)连接到它。
用户是 debian。
在这个 VPS 上,我运行一个postgres:14.3-alpine
docker 容器。
这个docker在/home/debian中挂载了两个卷:
postgres-certs
postgres-data
docker 中用户的用户/组 id 为 70。更多信息这里:
您可能知道证书有安全规则,因此,如上面的链接所述,我已将权限 640 设置为postgres-certs
文件夹:
drw-r----- 2 0 70 4096 jun 7 22:45 postgres-certs
drwxr----- 19 70 1000 4096 jun 11 20:40 postgres-data
如您所见,两个文件夹都具有组读取权限。
请找到我的组:
debian@db-dev:~$ id
uid=1000(debian) gid=1000(debian) groups=1000(debian),70(docker-pg-alpine),998(docker)
如你所见,我位于第 70 组和第 1000 组中,这两个文件夹中的定义相同
如果我尝试在其中一个文件夹中 cat 一个文件,我会得到以下结果(当然,如果我使用 sudo 的话,它会起作用):
debian@db-dev:~$ cat postgres-certs/server.crt
cat: postgres-certs/server.crt: Permission denied
只是为了证明该文件具有与他的目录相同的权限:
debian@db-dev:~$ sudo ls -ln postgres-certs/server.crt
-rw-r----- 1 0 70 2903 jun 7 22:44 postgres-certs/server.crt
是的,我已经注销(断开 ssh,甚至重新启动),我也停止了我的容器以确保它不会造成任何麻烦。
我只是不明白为什么我不能在这些文件夹中 cat 一个文件,而他们有组读取权限并且我在这些组中......
如果你们能找出问题所在,那就太好了。
答案1
要访问文件,您需要x
设置目录。
对于文件,如果文件是程序,则 (x) 允许您执行。
对于目录,(x)允许您进入目录并访问文件。
根据手册chmod
页,(x)允许目录的搜索权限。
字母 rwxXst 为受影响的用户选择文件模式位:读取(r)、写入(w)、执行(或搜索目录)(x)、仅当文件是目录或某些用户已经具有执行权限时才执行/搜索(X)、在执行时设置用户或组 ID(s)、限制删除标志或粘滞位(t)。
根据这个Unix 文件系统文档,(x) 允许您进入目录并访问文件。
对于目录,执行权限允许您进入该目录(即,通过 cd 进入该目录),并访问其中的任何文件。
备查,你可以使用:
sudo chmod g+x ~/postgres-certs
为目录的组添加(x)权限。
但是,您不应该将权限更改为 650,而应该使用:
sudo cat postgres-certs/server.crt
这样您就可以维护目录的默认权限集。