2014-10-17 72 views
0

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

/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 

回答

2

回波不从标准输入打印而是它的参数(或换行符如果无参数)。所以

echo file.txt 

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

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

是的我试过,以及只是为了涵盖每个角度,仍然无法正常工作。谢谢您的帮助! – 2014-10-17 10:37:05

+0

“echo”在这里并不是很有用,但这并不完全正确,如果你想在远程机器上执行come命令并得到你应该引用命令的输出 – bachN 2014-10-17 10:46:27

0

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

当你想存储变量不使用“$” symbole,这symbole用于获取变量的值

前值

1:

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

2-总是给你的价值观,特别是如果该值从另一个命令

3-要解决你的脚本,你需要引用远程机器上执行命令正在添加,然后 将输出重定向到文件

例如:

ssh [email protected] "ls > file.txt" "file.txt is created on machineA" 
ssh [email protected] "ls" > file.txt "file.txt is created on YOUR machine" 

如此简单,你CA通过

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

尝试ñ取代你的最后一行在您的测试bash classictest

好运

0

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