如何以减少的特权运行脚本的一部分?


7

我有以下问题:在运行Postgresql的每台计算机上,都有一个特殊的用户postgres。该用户具有对数据库服务器的管理访问权限。

现在,我想编写一个Bash脚本,该脚本以psql用户postgres的身份执行数据库命令(psql应以postgres用户的身份执行,而不是脚本)。到目前为止,这将不是问题:我可以以用户postgres的身份运行脚本。

但是,我想将psql的输出写入到postgres没有写访问权的目录中的文件中。

我怎样才能做到这一点?

我考虑过在脚本本身中更改EUID,但是:

  1. 我找不到在Bash脚本中更改EUID的方法
  2. 使用类似方法时,如何更改EUID
    psql -U postgres -c "<command>" > file

我如何在子外壳中更改密码postgres用户(su -c'psql -U postgres -c“ ALTER USER forip PASSWORD \'password \';”'postgres)
Fndiaz 2014年

Answers:


5

使用子shell: (su -c 'psql -U postgres -c "<command>"' postgres) > file

在子Shell内,您可以删除权限以执行工作,但是输出将重定向到仍具有原始权限的原始Shell。


5

您可能要使用此技巧:

{ anycommand } | su -c 'tee file' user

tee(1) 是POSIX实用程序,因此您可能依赖于它的可用性。


或者,使用sudo

{ anycommand } | sudo -u user 'tee file'

谢谢你的想法。但是,我遇到了两个问题:su至少在我的机器上没有-u选项。正确运行它(su -c命令用户)会导致另一个问题,即su必须从终端运行。由于su使用该​​命令打开了一个新的子外壳,因此它可能仍然无法正常工作。

@Legate您在系统上有sudo吗?
ulidtko 2011年

@ulidtko:是的,我愿意。

1
然后只需使用sudo -u postgres psql -c '...' > file和编辑sudoers即可禁用此命令的密码提示
gelraen

1

您可以使用具有更好写入权限的用户(例如root)运行shell脚本,并且在输出数据时应将数据写入数据库用户postgres可以写入的文件夹(例如/ tmp)

数据写入完成后,将其移至您的Shell脚本有权写入的目录(例如root用户可以在任何地方写入)


0

如果您想出一些棘手的方法来规避安全性限制,那么最好问问自己自己的目标是否真的明智。我对postgresql一无所知-您是否真的需要使用管理员帐户登录才能执行您要执行的操作,或者是否可以通过某种方式为普通用户帐户授予只读权限?


谢谢您的回答。但是,以root用户身份运行脚本没有问题,因此不会发生安全性限制的情况。

0

你为什么不这样做呢sudo su postgres -c "psql ..." >/path/to/file


感谢您的回答。但是,通过快速测试sudo su postgres -c "echo test"发现,该命令不会打印任何内容。切换到root sudo -s并执行su postgres -c "echo test"打印测试,因此似乎是以sudo某种方式吞噬了输出。我不知道为什么,虽然,我的猜测是,sudosu -c使用子shell,其标准输出都拉不通过我自己的壳。
Christoph Wurm,

您一定缺少什么。在我的盒子上sudo su postgres -c "echo \$USER"打印postgres
alex

好吧,它可以在我的Ubuntu笔记本上使用,但不能在必须运行脚本的Debian服务器上使用。
Christoph Wurm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.