Bash Grep安静SSH输出

Bash Grep安静SSH输出,bash,ssh,Bash,Ssh,我正在尝试匹配SSH命令的输出,但由于某些原因,它不起作用。我正在使用authorized_键将登录限制为一个命令,这是一个接受参数的包装器脚本 这是我的密码: for i in `seq 2 254`; do myoutput=$( ssh system@server01 ip 192.168.0.$i ) echo "$myoutput" echo "$myoutput" | grep -q "not found" if [ $? -eq 0 ]; then echo

我正在尝试匹配SSH命令的输出,但由于某些原因,它不起作用。我正在使用authorized_键将登录限制为一个命令,这是一个接受参数的包装器脚本

这是我的密码:

for i in `seq 2 254`; do
  myoutput=$( ssh system@server01 ip 192.168.0.$i )
  echo "$myoutput"
  echo "$myoutput" | grep -q "not found"
  if [ $? -eq 0 ]; then
    echo 192.168.0.$i
    exit
  fi
done
以下是脚本的输出:

192.168.0.2 not found in DB.  Try searching live (--forcelive)
192.168.0.3 not found in DB.  Try searching live (--forcelive)
192.168.0.4 not found in DB.  Try searching live (--forcelive)
这应该在第一个实例停止并回显IP,但它仍在继续,因为所有grep都返回1而不是0。不带grep的SSH命令本身每次返回0


为什么grep错误地编码了响应?有没有更好的方法来完成我想要做的事情?

您尝试搜索的内容几乎肯定在stderr上,因此您的替换根本无法捕获它;因此,它是由调用ssh的同一命令而不是放在myoutput变量中发送到控制台的

考虑使用重定向2>&1将stderr重定向到stdout,如下所示:

myoutput=$( ssh system@server01 "ip 192.168.0.$i" 2>&1 )
顺便说一下,如果你对调用SSH超过二百次的开销没问题,我会认真考虑重写这一点:

for ((i=2; i<254; i++)); do
  if ssh system@server01 "ip 192.168.0.$i" 2>&1 | grep -q 'not found'; then
    echo "192.168.0.$i"
    exit
  fi
done

…因为你受到了限制,你可能会因为性能原因考虑在多个查询中重用一个经过身份验证的连接。

你要搜索的内容几乎肯定在STDRR上,所以你的替代品根本就没有捕获它。因此,它是由调用ssh的同一命令而不是放在myoutput变量中发送到控制台的

考虑使用重定向2>&1将stderr重定向到stdout,如下所示:

myoutput=$( ssh system@server01 "ip 192.168.0.$i" 2>&1 )
顺便说一下,如果你对调用SSH超过二百次的开销没问题,我会认真考虑重写这一点:

for ((i=2; i<254; i++)); do
  if ssh system@server01 "ip 192.168.0.$i" 2>&1 | grep -q 'not found'; then
    echo "192.168.0.$i"
    exit
  fi
done

…由于您受到限制,可能出于性能原因,考虑在多个查询中重用一个经过身份验证的连接。

1。您错过了代码末尾完成的操作。2、请缩进for循环。3、不要使用return作为变量名,因为它显然与shell内置名冲突。4而不是if[$?-eq 0];如果未找到echo$return | grep-q,则尝试执行此操作;如果grep-q if检查命令的返回值,则更好。只是我们已经习惯于看到test命令[或shell内置][[我们忘记了任何返回代码都可以。很可能此内容在stderr上,而不是stdout.BTW上。顺便说一句,您知道您正在使用的ip命令的退出状态是否根据它是否找到了什么而有所不同吗?一般来说,检查命令的退出状态比试图解释其输出要好得多。1.您错过了t结尾处完成的操作代码为.2,请缩进for循环。3,不要使用return作为变量名,因为它显然与shell内置名冲突。4而不是if[$?-eq 0];然后尝试在echo$return | grep-q未找到时执行;如果grep-q if检查命令的返回值,则更好。只是我们已经习惯于看到test命令[或是贝壳内置物][[我们忘记了任何返回代码都可以。很可能此内容在stderr上,而不是stdout.BTW上。顺便说一句,您知道您正在使用的ip命令的退出状态是否会根据它是否找到了什么而有所不同吗?通常,检查命令的退出状态比尝试解释其输出要好得多。如果输出是co,则不可能是真的从echo$myoutputSure行开始,我的观点是OP几乎肯定是错误的,因为他们认为输出来自echo。除非他们使用set-x运行脚本,否则他们不确定。这是有道理的。即使stdout不是因为$..echo会添加额外的新行b吗但是在每个条目之间?哦,这的确是一个我没有好答案的问题。谢谢你的回答和建议!如果输出来自echo$myoutputSure行,那就不可能是真的,但我的观点是OP几乎肯定错误地认为输出来自echo。除非他们运行了scri对于set-x,他们还不确定。这是有道理的。即使stdout不是因为美元,stderr也会被打印出来。但是echo不会在每个条目之间添加额外的换行符吗?哦,这是一个我没有很好答案的问题。谢谢你的回答和建议!