gpt4 book ai didi

bash - Bash Grep Quiet SSH输出

转载 作者:行者123 更新时间:2023-12-02 14:12:15 25 4
gpt4 key购买 nike

我正在尝试匹配SSH命令的输出,但是由于某种原因,它无法正常工作。我正在使用authorized_keys将登录限制为一个命令-这是一个带有参数的包装器脚本。

这是我的代码:

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,但是它一直在继续,因为所有greps都返回1而不是0。SSH命令本身(不带grep)每次都返回0。

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

最佳答案

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

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

myoutput=$( ssh system@server01 "ip 192.168.0.$i" 2>&1 )

顺便说一句,如果您可以处理 ssh 200次以上的开销,那么我会认真考虑重写如下:
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

为什么?
  • seq既没有内置在bash中,也没有POSIX指定。因此,它甚至不能保证存在,更不能保证以任何特定方式表现。
  • ssh传递到远程系统的命令行被构建为通过连接参数生成的单个字符串。因此,仅传递一个带有您希望执行的确切代码的字符串,就可以更真实地表示实际情况,并且避免了由于忘记ssh对其命令行的实际操作而可能产生的错误。
  • 当您可以直接直接测试命令是否成功时,使用$?是不好的形式。


  • 顺便说一下,如果不受 authorized_keys的限制,最好将脚本评估移至远程系统,例如:
    ip_found=$(ssh system@server01 bash -s <<'EOF'
    for ((i=2; i<254; i++)); do
    content=$(ip "192.168.0.$i" 2>&1)
    if [[ $content = *"not found"* ]]; then
    echo "192.168.0.$i"
    exit 0
    fi
    done
    exit 1
    EOF
    )

    echo "Remote system found $ip_found"

    ...由于受到如此限制,出于性能原因,您可能会考虑使用 SSH multiplexing在许多查询中重用单个经过身份验证的连接。

    关于bash - Bash Grep Quiet SSH输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35496709/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com