Как настроить этот скрипт bash для успешного запуска команд telnet, находясь в SSH? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь написать bash-скрипт, который будет выполнять следующий рабочий процесс:

  1. Telnet к сетевому устройству через IP-адрес на порту 9100 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.

Теоретически, после *В строке 1024 * сценарий должен был выполнить команду ! U1 getvar "internal_wired.ip.timeout.value\".

Кроме того, мы должны были получить ожидаемый вывод "10".

Когда я впервые написал этот скрипт, у меня изначально не было команды END_SSH.Коллега представил это мне и сказал обернуть команды telnet в END_SSH из-за того, что Терминал технически выпрыгивает из SSH, когда вы находитесь в telnet.Я пытался использовать END_SSH, но безуспешно.

Как заставить команду telnet успешно работать и получить ожидаемое выходное значение?

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

Вы не правильно поняли, что такое "END_SSH". Это не «команда» - это то, что называется «Here-document» в bash.

По сути, текст между <<END_SSH и END_SSH является "документом здесь", который передается в стандартный ввод 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
0 голосов
/ 23 марта 2019

так вот, что я предлагаю использовать для части telnet. Connect - это функция, вызываемая позже в цикле while, который будет работать по IP, готовым из файла.

    Connect()
    {
    (
        sleep 10 # depending upon your network and device response, better to keep this first sleep value a little high

        echo "command 1"
        sleep 2
        echo "command 2"
       sleep 2
    ) | telnet $1 9100 | tee -a ${1}.log
    }

    while read -r IP 
    do 
       Connect $IP
    done < filewithIPs
...