【问题标题】:bash ssh script not outputting results to filebash ssh脚本没有将结果输出到文件
【发布时间】:2014-12-12 21:34:51
【问题描述】:

在工作中做一个简单的脚本,我不知道为什么它不会在另一个文件中输出结果。

/tmp/system存储节点列表

#!/bin/bash
$results=restest.txt
for i in  $(cat /tmp/system); do
ping -c 1 $i
if [ $i = 0 ]; then
ssh $i ps -ef | grep ops | echo > $results
fi
done

【问题讨论】:

    标签: bash loops for-loop ssh ping


    【解决方案1】:

    echo 不是从标准输入打印,而是从它的参数打印(如果没有参数,则为换行符)。所以

    echo file.txt
    

    只打印'file.txt',而不是文件的内容。因此,您的代码只会将换行符写入文件。您可以使用 cat 将标准输入打印到标准输出,但在这里它是无用的,因为您可以将 grep 输出直接通过管道传输到文件:

    ssh $i ps -ef | grep ops > $results
    

    【讨论】:

    • 是的,我也尝试过,只是为了涵盖各个角度,但仍然无法正常工作。感谢您的帮助!
    • “echo”在这里没有用,但这并不完全正确,如果你想在远程机器上执行命令并获得输出,你应该引用你的命令
    【解决方案2】:

    首先感谢您编辑您的代码(这样更清楚:) 我有 2 或 3 条建议:

    1-当你想在变量中存储一个值时不要使用“$”符号,这个符号用于获取变量的值

    例如:

     MYVAR=3
     echo MYVAR        "this will print MYVAR"
     echo $MYVAR       "this will print 3"
    

    2- 总是引用你的值,特别是当值来自另一个命令时

    3- 要修复您的脚本,您需要引用在远程机器上执行的命令, 然后将输出重定向到您的文件

    例如:

    ssh user@MachineA "ls > file.txt"    "file.txt is created on machineA"
    ssh user@machineA "ls" > file.txt    "file.txt is created on YOUR machine"
    

    所以你可以简单地将你的最后一行替换为

    ssh $i "ps -ef | grep ops" > $results
    

    尝试在您的测试中使用 -ne bash classictest

    祝你好运

    【讨论】:

      【解决方案3】:

      有几个错误。首先,不要遍历这样的文件。其次,i是主机名,不是ping的退出状态。第三,echo 是不必要的(并且不会从标准输入中读取)。最后,$ 仅用于扩展参数,而不是分配给它。

      #!/bin/bash
      results=restest.txt
      while read -r host; do
          if ping -c 1 "$host"; then
              ssh "$host" ps -ef | grep ops > "$results"
          fi
      done < /tmp/system
      

      【讨论】:

        猜你喜欢
        • 2020-02-06
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        相关资源
        最近更新 更多