文件与文件不同的组的符号链接的最佳解决方法

文件与文件不同的组的符号链接的最佳解决方法

目标情况

  • 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,但要点是尝试获得正确的权限,而不是为此目的使用/tmpand符号链接。/home

更新

这也可以通过标准、更简单的方式来完成,这样与 SFTP/SCP 客户端等其他软件更加兼容。

sudo mkdir /var/my_dir
sudo chown peter:postgres /var/my_dir
sudo chmod 0750 /var/my_dir

现在,无论 中存在什么文件,/var/my_dir都只能由rootpeter和读取postgres,而只有peterroot可以写入。

然后确保您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 共享文件,您必须将文件的组所有者更改为用户组postgrespostgres在类似 Debian 的系统上),然后更改chmod g+rw您的文件。

相关内容