我可以将数据从一个命令传输到另一个命令,例如:
$ echo test | cat
test不知道该叫什么操作我可以使用以下方法获得类似的效果:
$ cat < <(echo test)
test其中,<(echo test)是创建动态文件的基本原则。使用常规文件,如下所示:
$ cat file
test
$ cat < file
test这同样适用于ssh:
$ ssh server cat < <(echo test)
test使用ssh-示例作为基本示例,您可能会认为您可以这样做:
$ pdsh -a cat < <(echo test)但是,在连接的机器上没有数据发送给cat,并且命令永远不会终止。
tee似乎能够将它在stdin上收到的信息发送到多个地方:
$ tee >(cat) >(cat) < <(echo test)
test
test
test是否有可能在pdsh上实现同样的目标?
发布于 2019-09-30 18:53:56
我与一位pdsh开发人员取得了联系,并了解了以下内容:
您想要的是"stdin广播“,不幸的是,对此的支持从未添加到pdsh中。这将是一个很好的特性,但历史上并没有太多的需求,所以它从来没有做过。
似乎证实了在这个岗位上已经确立了什么。
然而,随之而来的是:
顺便说一句,这并不是说不可能进行广播。作为HPC调度器的一部分的并行启动程序可以这样做,比如srun(1)等等。其机制是一次读取stdin,然后将其复制到每个远程进程的缓冲区中,即复制在并行启动程序中完成。跟进的原因是在那个stackexchange职位上有一些误导性的答案。另一种解决串行for-循环问题的方法是从GNU并行或pdsh -R exec运行ssh。使用pdsh -R exec:$ pdsh -R exec -w主机bash -c 'ssh % host <(回显测试)‘当然,这里的缺点是创建临时文件用于重定向N次。最好将输出放入本地文件,然后将该文件放在每个ssh命令中。pdsh/并行在for循环上的好处是获得了并行性。
在我自己的测试中,我很难让这个精确的例子奏效:
root@master# pdsh -R exec -w host1 bash -c 'ssh %h cat < <(echo test)'
host1: bash: -c: line 0: syntax error near unexpected token `<'
host1: bash: -c: line 0: `ssh n1 cat < <(echo test)'
pdsh@master: host1: bash exited with exit code 1一个小的调整就会激活它,并且使用一个“普通”文件:
root@master# cat data.txt
test from file
root@master# pdsh -R exec -w host1 bash -c 'ssh %h cat < data.txt'
host1: test from file结论:pdsh可以增加一个功能来处理我想要的更好的东西,但是即使是现在,也有实现我所要求的东西的方法。
发布于 2022-06-30 21:38:04
由于pdsh不支持stdin转发/广播,您可以考虑使用来自集群项目的clush代替支持stdin广播的pdsh:
$ clush -a cat < <(echo test)
n1c01: test
n2c01: test
n1c02: test
n2c02: test此外,clush还具有很好的输出收集功能(例如,不需要外部管道到dshback ),如下所示:
$ clush -ab cat < <(echo test)
---------------
n[1-2]c[01-02] (4)
---------------
test发布于 2019-09-27 13:17:44
您需要引用远程命令,以便整个命令在远程主机上运行(S)。例如:
pdsh -a 'cat < <(echo test)'没有引号,只有 cat在远程主机上运行。重定向(<)和过程替代 <(echo test)在本地主机上运行。
当只有一个远程主机使用echo test的输出(例如使用ssh命令)时,当有多个远程主机想要使用该输出时(例如,因为您使用的是pdsh而不是ssh),它将无法工作。
https://unix.stackexchange.com/questions/544052
复制相似问题