【问题标题】:Creating a single line from output of multiple shell commands从多个 shell 命令的输出创建单行
【发布时间】:2018-01-01 02:27:42
【问题描述】:

我尝试 ssh 到多个主机(数千个),捕获一些命令输出并写入文件。但是所有命令的输出应该在同一行,逗号分隔,空格分隔,每个主机都不能在同一行。

所以我的命令就像“:

ssh $host "hostname; uname -r; echo mypassword| sudo -S ipmitool mc info | grep 'Firmware Revision' " > ssh.out

但如果我这样使用,它会将所有命令输出写入单独的行。 (每个主机 3 行)。但我只想要每个主机一行,比方说:

myserver,3.2.45-0.6.wd.514,4.3 (comma or any field separator is fine)

我该怎么做?

【问题讨论】:

    标签: linux shell ssh


    【解决方案1】:

    你可以将ssh的输出保存到一个变量中,然后打印出来:

    ssh_output=$(ssh $host "hostname; uname -r; echo mypassword | sudo -S ipmitool mc info | grep 'Firmware Revision' ")
    printf '%s\n' "$ssh_output"
    

    【讨论】:

      【解决方案2】:

      使用 bash Array variables。将每个 ssh 命令的输出附加到数组中。最后,echo 数组的所有元素。结果将是单行上的所有数组元素。将IFS(内部字段分隔符)设置为所需的每个主机分隔符。 (我使用了,。)要在同一个 ssh 会话中处理来自多个命令的多行输出,请使用 tr 将换行符替换为分隔符。 (我用了一个空格。)

      代码

      sshoutput=()
      
      for host in host01 host02 host03; do
          sshoutput+=($(ssh $host 'echo $(hostname; uname -a; echo mypassword) | tr "\n" " "'))
      done
      
      IFS=,; echo "${sshoutput[*]}";
      

      输出

      host01.domain.com Linux host01.domain.com 2.6.32-696.3.1.el6.x86_64 #1 SMP Thu Apr 20 11:30:02 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux mypassword ,host02.domain.com Linux host02.domain.com 2.6.32-696.3.1.el6.x86_64 #1 SMP Thu Apr 20 11:30:02 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux mypassword ,host03.domain.com Linux host03.domain.com 2.6.32-696.3.1.el6.x86_64 #1 SMP Thu Apr 20 11:30:02 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux mypassword 
      

      【讨论】:

        【解决方案3】:

        这不是很整洁,但使用printf 可以。 hostnameuname -r 经验证可以正常工作。我不知道ipmitool 输出什么,所以无法验证。

        ssh $host "printf $(hostname),$(uname -r),$(echo mypassword| sudo -S ipmitool mc info | grep 'Firmware Revision')\n" > ssh.out
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-11
          • 1970-01-01
          • 2020-09-08
          • 2018-09-19
          • 1970-01-01
          • 2013-05-30
          相关资源
          最近更新 更多