Helpers - компьютеры, интернет, программирование

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

Я пытаюсь написать сценарий 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-заполнитель, который просто нужно добавить.

По идее, после строки Escape character is '^]'. скрипт должен был запустить команду ! U1 getvar "internal_wired.ip.timeout.value\".

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

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

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


  • Загляните в expect. 23.03.2019
  • expect для этого нелепо. 23.03.2019

Ответы:


1

Вы неправильно понимаете, что такое "END_SSH". Это не «команда» — это то, что в 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
23.03.2019
  • Спасибо за вашу запись. Чтобы ответить на ваш вопрос: я пытаюсь проверить свой список сетевых устройств, чтобы убедиться, что их значения времени ожидания установлены на 10. По умолчанию многие из них установлены на 50. Вы правы, переменная IP должна быть массивом позже, но сейчас я использую один IP-адрес, чтобы сначала лучше понять логику. Я попробовал ваш код и получил "?" в качестве вывода вместо "10". Вы случайно не знаете, почему он делает это вместо того, чтобы выводить ожидаемое значение? 23.03.2019
  • Я ничего не знаю об устройствах Zebra, поэтому введенная мной команда может быть неверной. Я протестировал этот код в качестве HTTP-клиента, и он работал хорошо. Убедитесь, что команда ! U1 ... верна, а также попробуйте настроить значения сна. 23.03.2019

  • 2

    Итак, вот что я предлагаю использовать для части 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
    
    23.03.2019
  • Спасибо за вашу запись. Возможно, мне придется уточнить, что я сначала SSH подключаюсь к серверу, локальному для этих сетевых устройств, и, уже находясь в SSH, я делаю telnet x.x.x.x 9100, который не требует передачи каких-либо имен пользователей или паролей. 23.03.2019
  • Итак, можно ли разместить скрипт на этом сервере, чтобы вы могли запускать его оттуда? Или просто попробуйте добавить функцию Connect в свой исходный скрипт, а затем вызвать ее в нужном вам месте. Я обновил функцию и удалил имя пользователя/пароль. Это довольно простой способ запуска команд на удаленном устройстве. 24.03.2019
  • Да, исходя из того, как настроена наша инфраструктура, нам рекомендуется сначала SSH подключиться к серверам, локальным для сетевых устройств в этой области. Я scp сначала .sh на сервер, затем SSH вхожу, затем bash myscript.sh когда я вхожу. 25.03.2019
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..