这是一个关于寻找处理特定情况的理想方法的问题。
在我的主文件夹下的一个文件夹中有一组sql\include_relative
通过元命令相互引用的脚本文件。有时需要运行这些脚本sql作为数据库超级用户。因为postgres已经过同行验证,我必须致电sql和sudo --user postgres
。但由于这些文件位于我的主文件夹中,操作系统用户postgres无权访问它们。现在,如果只有一个脚本文件要读取,我可以简单地使用 shell 重定向,如 中所示sudo -u postgres psql < ~/psql/myscript.psql
,但一旦myscript.psql
包含另一个文件,那么sql不会找到它。
有多种简单而琐碎的方法可以实现这项工作。但是,我排除每次需要运行脚本时手动复制/移动/删除文件,并且我希望保留自由移动和重命名源文件夹和脚本文件而不破坏内容的能力。此外,这是一个关键任务生产服务器,因此干扰 PostgreSQL 服务(例如更改集群的配置,例如创建其他超级用户或更改身份验证设置)是不可能的。理想情况下,我们希望这对服务器的其余部分是透明的,这不包括涉及预配置(例如ftab、systemd-mount)绑定安装和覆盖的解决方案,或对服务器配置的其他更改。
我正在专门寻找一个命令,使脚本文件夹可以即时使用sql,并且仅在脚本运行期间有效。到目前为止我的解决方案是这样的:
$ sudo mount --bind -o ro,X-mount.mkdir=777 ./psql ~postgres/tmp && \
sudo -iu postgres psql -f ~postgres/tmp/myscript.psql; \
sudo umount ~postgres/tmp && \
sudo rmdir ~postgres/tmp
但我仍然觉得它很冗长,我正在努力改进它。而且我不喜欢tmp
在~postgres
.有人有更好的想法吗?
编辑:根据@larsks 下面的评论,我意识到我的上述解决方案在多个用户有权访问的系统中存在隐私缺陷postgres用户。
答案1
run-with-tempdir
我们创建一个如下所示的shell 脚本:
#!/bin/sh
tmpdir=$(mktemp -d ~postgres/tmp/psqlXXXXXX)
trap "rm -rf $tmpdir" EXIT
tar -C "$tmpdir" -xf- &&
psql -f "$tmpdir/$1"
然后我们像这样运行它:
tar -C psql -cf- . | sudo -u postgres run-with-tempdir myscript.psql
(a) 不会将您的主目录暴露给 postgres 用户,(b) 不会将您的脚本暴露给系统上的任何其他用户(因为 tmpdir 是使用 mode 创建的700
),(c) 不需要绑定安装(如果错误阻止卸载发生,则可能会导致问题),并且 (d) 自动自行清理。