Shell:通过root用户postgres执行的并行命令

时间:2016-06-06 14:37:23

标签: linux bash postgresql shell quoting

我使用此parallel调用以用户postgres通过用户root的无密码ssh访问来执行某些操作:

parallel -q -j0 ssh {} -l root "sudo -u postgres  -i psql -tAc 
    \"select current_user, current_database()\" -d \$(echo {}| cut -d@ -f1) "
     ::: db_foo@host1 db_bar@host2 ...

...除了运行旧版Linux系统的主机外,它的工作原理。

我从旧系统收到此消息:

psql: warning: extra command-line argument "current_database()" ignored
psql: FATAL:  Peer authentication failed for user "current_user,"

版本:

  • GNU bash,版本4.1.10(1)
  • Sudo版本1.7.6p2

如何获得正确的引用以使其在旧的Linux系统上运行?

更新

引用Paul A Jungwirth的回答,结果发生了:

===> parallel -q -j0 ssh {} -l root "echo \$BASH_VERSION; rpm -qf /usr/bin/sudo; sudo -u postgres  -i psql -tAc '\"select current_user, current_database()\"' -d \$(echo {}| cut -d@ -f1); echo " ::: ...

4.2.53(1)-release
sudo-1.8.6p3-3.13.1.x86_64

ERROR:  syntax error at or near ""select current_user, current_database()""
ZEILE 1: "select current_user, current_database()"
         ^
4.1.10(1)-release
sudo-1.7.6p2-0.16.1.x86_64

psql: warning: extra command-line argument "current_database()"" ignored
psql: FATAL:  Peer authentication failed for user "current_user,"

....我想我会放弃并使用两个循环。第一个scp脚本,第二个调用这个脚本。

1 个答案:

答案 0 :(得分:1)

我认为这样做会:

parallel -q -j0 ssh {} -l root "sudo -u postgres  -i psql -tAc 
    '\"select current_user, current_database()\"' -d \$(echo {}| cut -d@ -f1) "
     ::: db_foo@host1 db_bar@host2 ...

使用原始版本时,在调用sudo时会解释内部双引号,以便sudo获取这些参数:

1: -u
2: postgres
3: -i
4: psql
5: -tAc
6: select current_user, current_database()

在更新版本的sudo中,它会自动转义"命令"中的非字母数字字符。将事物保持在一起的论据,但你需要自己为旧版本做这件事。所以更新的版本基本上会运行这个:

psql -tAc select\ current_user\,\ current_database\(\)

但旧版本没有帮助。对于那些,你想确保当sudo运行它的命令时,查询仍然是psql的一个重要参数。通过用单引号括起来,你可以确保sudo得到这个:

1: -u
2: postgres
3: -i
4: psql
5: -tAc
6: "select current_user, current_database()"

那么它将运行

psql -tAc "select current_user, current_database()"

而不是

psql -tAc select current_user, current_database()

顺便说一下,我发现this commit to sudo看似相关(从2010年开始),虽然理论上它应该是1.7.6(tagged in 2011)的一部分。也许以后会有另一个变化。

不幸的是,我认为这个新版本现在将破坏最近的版本的sudo!很抱歉.....我还不确定如何编写一个适用于这两个命令的命令。

编辑:顺便说一句,为了好玩,我写了一篇little utility来帮助看看每个命令收到的是什么。