我有以下问题:在每台运行 Postgresql 的机器上都有一个特殊用户postgres。该用户具有数据库服务器的管理访问权限。
现在我想编写一个 Bash 脚本,以 psql 作为用户执行数据库命令postgres(psql 应以用户身份执行postgres,而不是脚本)。到目前为止,这不是问题:我可以以用户身份运行脚本postgres。
但是,我想将 psql 的输出写入以下目录中的文件:postgres没有写权限。
我怎样才能做到这一点?
然而,我考虑过更改脚本本身中的 EUID:
- 我找不到在 Bash 脚本中更改 EUID 的方法
- 使用类似的东西时如何更改 EUID
psql -U postgres -c "<command>" > file
?
答案1
使用子外壳:(su -c 'psql -U postgres -c "<command>"' postgres) > file
在子 shell 内,您可以删除执行工作的权限,但输出将重定向到仍具有原始权限的原始 shell。
答案2
你可能想使用这个技巧:
{ anycommand } | su -c 'tee file' user
tee(1)
是 POSIX 实用程序,因此您可以依赖它的可用性。
或者,与sudo
:
{ anycommand } | sudo -u user 'tee file'
答案3
您可以使用具有更好写入权限的用户(例如root)运行shell脚本,并且在输出数据时应写入数据库用户postgres可以写入的文件夹(例如/tmp)
数据写入完成后,将其移至您的shell脚本有权限写入的目录(如root用户可以在任何地方写入)
答案4
你为什么不这样做:sudo su postgres -c "psql ..." >/path/to/file
?