Ubuntu下PostgreSQL的plsh函数写入文件权限配置问题
问题分析与解决方案
核心原因
PostgreSQL的触发器函数(包括你用plsh编写的getimage)是由**PostgreSQL服务的系统用户(默认是postgres)**执行的,和数据库用户kalle、触发插入操作的用户无关。这就是为什么你设置kalle为目录所有者时无效,且用777权限写入的文件所有者是postgres的原因。
安全权限配置方案
不需要使用危险的777权限,以下两种方案都能实现安全写入:
方案1:将postgres用户加入目录所属组
- 把系统用户
postgres添加到目录的用户组www-data中:
(执行后需要重启PostgreSQL服务,让组权限生效:sudo usermod -aG www-data postgressudo systemctl restart postgresql) - 设置目录权限为
775(所有者和组用户拥有读写执行权限,其他用户仅读执行):
若要更严格,可设置为sudo chmod 775 /bla/blabla/my_image_directory770(仅所有者和组用户有权限,其他用户无任何权限),但需确保www-data组的其他需求(比如Web服务读取图片)不受影响。
方案2:修改目录所有者为postgres
- 将目录所有者改为
postgres:www-data:sudo chown postgres:www-data /bla/blabla/my_image_directory - 设置目录权限为
750(所有者拥有读写执行权限,组用户仅读执行,其他用户无权限):
这种方式权限范围最小,安全性最高,适合仅PostgreSQL需要写入、Web服务仅需读取的场景。sudo chmod 750 /bla/blabla/my_image_directory
额外注意事项
- 确保目录的所有父目录(比如
/bla/blabla/)对postgres用户有执行权限(即x权限),否则即使目标目录权限正确,也会因父目录访问受限报错。 - 验证权限是否生效:切换到
postgres用户尝试创建文件,确认无权限问题:
若能成功创建,说明权限配置正确,删除测试文件即可:sudo -u postgres touch /bla/blabla/my_image_directory/test_perm.txtsudo -u postgres rm /bla/blabla/my_image_directory/test_perm.txt
内容的提问来源于stack exchange,提问作者Kai Behncke
相关产品推荐
相关产品推荐

