首页 > 解决方案 > 如何调整此 bash 脚本以在 SSH 中成功运行 telnet 命令?

问题描述

我正在尝试编写一个 bash 脚本来执行以下工作流程:

  1. 通过端口 9100 上的 IP 地址 Telnet 进入联网设备telnet x.x.x.x 9100
  2. 运行 SGD 命令! U1 getvar \"internal_wired.ip.timeout.value\"
  3. 期望输出值为"10"

这是我到目前为止编写的 bash 脚本:

#!/bin/bash

IP=(x.x.x.x) 


    for i in ${IP}
    do
      echo " "
      echo "Welcome! This script will check the timeout value of this networked device."
      echo "The expected output should be `"10`". Let's get started!!"
      echo " "
      sleep 4
      echo "5....."
      sleep 1
      echo "4...."
      sleep 1
      echo "3..."
      sleep 1
      echo "2.."
      sleep 1
      echo "1."
      sleep 1
      echo " "
      telnet ${i} 9100 << END_SSH
        sleep 5
        getvar \"internal_wired.ip.timeout.value\"
        sleep 5
    END_SSH
    done

当我通过 运行此脚本时bash mycode.sh,我在 Terminal.app 中得到以下输出:

$ bash mycode.sh 

Welcome! This script will check the timeout value of this networked device.
The expected output should be "10". Let's get started!!

5.....
4....
3...
2..
1.

Trying x.x.x.x...
Connected to x.x.x.x.
Escape character is '^]'.
Connection closed by foreign host.
[user@server ~]$ 

x.x.x.x是要添加的 IP 占位符。

理论上,在该Escape character is '^]'.行之后,脚本应该已经运行了! U1 getvar "internal_wired.ip.timeout.value\"命令。

此外,我们应该有一个预期的输出"10"

当我第一次编写这个脚本时,我最初并没有END_SSH命令。一位同事向我介绍了这一点,并说将telnet命令包装END_SSH在 telnet 中时,终端在技术上是如何跳出 SSH 的。我试过利用END_SSH,但没有成功。

如何让 telnet 命令成功运行并获得预期的输出值?

标签: bashshellsshtelnetzebra-printers

解决方案


您误解了“END_SSH”是什么。这不是一个“命令”——它是 bash 中所谓的“Here-document”。

本质上, the<<END_SSH和 the之间的文本END_SSH是一个“here-document”,它通过管道传输到telnet ${i} 9100. 因此,这些sleep 5命令从未真正执行过,并且输入甚至在连接建立之前就达到了 EOF。

我不知道你到底想要完成什么,但我想下面的工作会更好。哦,那个奇怪的IP=(x.x.x.x)声明是怎么回事?那应该是一个数组吗?

#!/bin/bash

declare -a IP=(1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4)

for i in "${IP[@]}"; do
    echo " "
    echo "Welcome! This script will check the timeout value of this networked device."
    echo "The expected output should be \"10\". Let's get started!!"
    sleep 4
    for j in {5..1}; do
        echo $j
        sleep 1
    done

    { sleep 5; echo -n $'! U1 getvar "internal_wired.ip_timeout.value"\n'; sleep 5; } | telnet ${i} 9100
done

推荐阅读