bash ssh脚本没有将结果输出到文件

时间:2014-10-17 10:07:45

标签: bash loops for-loop ssh ping

在工作中做一个简单的脚本,我无法弄清楚为什么它不会将结果输出到另一个文件中。

/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

3 个答案:

答案 0 :(得分:2)

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

echo file.txt

只打印'file.txt',而不是文件的内容。因此,您的代码只会在文件中写入换行符。您可以使用cat将stdin打印到stdout,但这里没用,因为您可以将grep输出直接传递给文件:

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

答案 1 :(得分:0)

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

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

前:

 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

尝试在测试bash classictest

中使用-ne 祝你好运

答案 2 :(得分:0)

有几个错误。首先,不要迭代这样的文件。其次,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