目标情况:
data/file.txt
拥有者我的用户:我的用户和“-rw-rw-rw-”(chmod 666)- 符号链接
/tmp/file.txt
拥有者postgres:postgres和“-rw-rw-rw-”
因此,我可以使用我的用户编辑该文件,其他用户(postgres)也可以读取和写入该文件,但链接和文件由不同的用户拥有。
现实世界的情况:与另一个问题的步骤相同,
sudo rm /tmp/file.txt # if exist, remove
cd ~
sudo chmod 666 data/file.txt
ls -l data/file.txt # "-rw-rw-rw-" as expected
more data/file.txt # working fine
sudo ln -sf $PWD/data/file.txt /tmp/file.txt # fine
ls -l /tmp/file.txt # "lrwxrwxrwx", /tmp/file.txt -> /home/thisUser/file.txt
more /tmp/file.txt # fine
sudo chown -h postgres:postgres /tmp/file.txt
sudo more /tmp/file.txt # NOT WORK!
解决方法是sysctl -w fs.protected_symlinks=0
(然后more /tmp/file.txt
会很好地工作),但它不安全;我需要另一个解决方案。
答案1
目录/home
和/tmp
并不真正适合于此,也不使用符号链接。创建一个目录来存储文件并使用 ACL 为其设置权限。假设您的用户名是peter
。下面的一些命令可能是多余的,给出这些命令只是为了明确。
# Make a new directory to store the `file.txt`.
#
sudo mkdir /var/my_dir
# Change ownership and group ownership to root.
#
sudo chown root:root /var/my_dir
# Only allow root and members of root to read the directory.
#
sudo chmod 0750 /var/my_dir
# Begin to augment standard permissions with ACLs.
# Below, allow peter rwx for all new file system objects in /var/my_dir.
# (-d means "default" and -m means "mask")
#
setfacl -d -m u:peter:rwx /var/my_dir
# Set the same mask for the directory itself.
#
setfacl -m u:peter:rwx /var/my_dir
# Below, allow postgres r-x for all new file system objects in /var/my_dir.
#
setfacl -d -m u:postgres:r-x /var/my_dir
# Set the same mask for the directory itself.
#
setfacl -m u:postgres:r-x /var/my_dir
现在,peter
可以在 中创建文件/var/my_dir
,并postgres
可以读取它们。
链接主目录中的目录也可能很方便。
cd && ln -s /var/my_dir .
重新启动后,其中的文件/tmp
应该消失。一般来说,或者也许可以说,链接到主目录中的文件并不是一个好的做法。如果你还不明白的话,我可以解释一下这个说法。用于此目的的更好位置可能是/usr/local/var/my_dir
,但要点是尝试获得正确的权限,而不是为此目的使用/tmp
and符号链接。/home
更新
这也可以通过标准、更简单的方式来完成,这样与 SFTP/SCP 客户端等其他软件更加兼容。
sudo mkdir /var/my_dir
sudo chown peter:postgres /var/my_dir
sudo chmod 0750 /var/my_dir
现在,无论 中存在什么文件,/var/my_dir
都只能由root
、peter
和读取postgres
,而只有peter
和root
可以写入。
然后确保您umask
创建的文件postgres
可以读取。
cd
touch test
ls -l test
如果结果显示r
为“其他”,则将postgres
能够读取/var/my_dir
.
还有另一种方法...
sudo touch /usr/local/var/file.txt
sudo chown peter:postgres /usr/local/var/file.txt
sudo chmod 0640 /usr/local/var/file.txt
cd
ln -s /usr/local/var/file.txt .
上面,我们使用单个文件,没有目录。再次强调,所有这些都只是设置权限。你只需要决定如何处理这种情况,对你正在做的事情有比我们在问题中读到的更多的了解。
答案2
这里有一个误解。更改符号链接的权限是没有意义的。引用chmod
联机帮助页(粗体是我的):
chmod
从不更改符号链接的权限;系统chmod
调用无法更改其权限。这不是问题,因为符号链接的权限从未被使用。
不需要符号链接。要与 PostgreSQL 共享文件,您必须将文件的组所有者更改为用户组postgres
(postgres
在类似 Debian 的系统上),然后更改chmod g+rw
您的文件。