【问题标题】:SSH Shell Script multiple commands outputSSH Shell Script 多条命令输出
【发布时间】:2011-08-10 03:43:55
【问题描述】:

问候,

我想在一个 shell 脚本中在 ssh 上执行 2 个命令并将输出检索到我的本地机器

例子

ssh user@host "command1" > /local/1.txt

ssh user@host "command2" > /local/2.txt

我想要这个,但是只有一个连接是可能的

请不要用“期待”的解决方案来回答...

非常感谢;)

【问题讨论】:

    标签: shell ssh


    【解决方案1】:

    如果您不介意使用相同的文件来存储输出;那么:

    ssh user@host "command1; command2" > /local/1-2.txt
    

    如果这很重要,请尝试以下方法:

    ssh user@host "command1 > /somepath/1.txt; command2 > /somepath/2.txt; ..."
    scp user@host:/somepath/*.txt somelocalpath/
    

    如果您仍然只想要一个连接,也许这对您有用:

    ssh user@host "command1; echo "this_is_a_separator"; command2" > /local/1-2.txt
    sed -n '1,/this_is_a_separator/ {p}' /local/1-2.txt > /local/1.txt
    sed -n '/this_is_a_separator/,$ {p}' /local/1-2.txt > /local/2.txt
    

    本地文件拆分可以通过其他几种方式完成,这只是其中之一。

    【讨论】:

    • sed 命令不好,因为它在两个文件和换行符上都留下了分隔符:P
    • 如果 command1 的输出没有以新行结束,请注意:您可以在数据行的末尾添加分隔符。
    【解决方案2】:

    编辑:如果command1 的输出不以新行结尾,则无法正常工作。

    编辑:如果一个或两个命令不产生输出,也不起作用。需要更灵活的工具 --> awk。查看其他解决方案。

    做同样的事情:

    ssh user@host "command1" > /local/1.txt
    ssh user@host "command2" > /local/2.txt
    

    在单个连接中,并且没有临时文件,您可以这样做:

    ssh user@host "command1 | sed -e 's/^/1/' ; command2 | sed -e 's/^/2/'" | \
    sed -n -e '/^1/{s/^.//;w /local/1.txt
    };/^2/{s/^.//;w /local/2.txt
    }'
    

    您需要在/local/1.txt/local/2.txt 之后添加新行,因为如果它们不存在,sed 会一直认为您正在编写文件名。

    【讨论】:

      【解决方案3】:

      由于行尾处理导致之前使用 sed 的解决方案被破坏,因此该解决方案使用 awk。

      所以做同样的事情:

      ssh user@host "command1" > /local/1.txt
      ssh user@host "command2" > /local/2.txt
      

      在单个连接中,并且没有临时文件,您可以这样做:

      ssh user@host "command1 | sed -e 's/^/1/'; echo -e '\na'; command2 | sed -e 's/^/2/'; echo" | \
      awk -v f1=/local/1.txt -v f2=/local/2.txt \
      'BEGIN{state=0; printf "" > f1}
      /^1/ {printf "%s%s", state == 1 ? "\n" : "", substr($0, 2) > f1; state=1}
      /^$/ && state == 1 {printf "\n" > f1}
      /^a$/ {state=2; close (f1); printf "" > f2}
      /^2/ {printf "%s%s", state == 3 ? "\n" : "", substr($0, 2) > f2; state=3}
      /^$/ && state == 3 {printf "\n" > f2}
      END{close (f2)}'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-01
        • 2015-02-11
        • 1970-01-01
        • 2017-05-18
        • 2012-06-29
        • 2014-06-21
        • 2016-04-21
        相关资源
        最近更新 更多