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

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/

    10-12 22:15
    查看更多