gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:38:55 26 4
gpt4 key购买 nike

我使用此并行 调用以用户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)
  • 须藤版本 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 一个脚本,第二个调用这个脚本。

最佳答案

我想这样就可以了:

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帮助查看每个命令接收的参数。

关于linux - Shell:通过 root 用户 postgres 执行的并行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37660229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com