Я пытаюсь написать сценарий bash, который будет выполнять следующий рабочий процесс:
telnet x.x.x.x 9100
! U1 getvar \"internal_wired.ip.timeout.value\"
."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
— нелепый перебор для этого.
Вы неправильно понимаете, что такое "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
Спасибо за вашу запись. Чтобы ответить на ваш вопрос: я пытаюсь проверить свой список сетевых устройств, чтобы убедиться, что их значения времени ожидания установлены на 10. По умолчанию для многих из них установлено значение 50. Вы правы, переменная IP
должна быть массивом. позже, но сейчас я использую один IP-адрес, чтобы сначала лучше понять логику. Я попробовал ваш код и получил "?"
вместо "10"
. Вы случайно не знаете, почему он делает это вместо того, чтобы выводить ожидаемое значение?
Я ничего не знаю об устройствах Zebra, поэтому введенная мной команда может быть неверной. Я протестировал этот код в качестве HTTP-клиента, и он работал хорошо. Убедитесь, что команда ! U1 ...
верна, а также попробуйте настроить значения сна.
Итак, вот что я предлагаю использовать для части 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
Спасибо за вашу запись. Возможно, мне придется уточнить, что я сначала SSH
подключаюсь к серверу, локальному для этих сетевых устройств, и, уже находясь в SSH
, я делаю telnet x.x.x.x 9100
, что не требует передачи имен пользователей или паролей.
Итак, можно ли разместить скрипт на этом сервере, чтобы вы могли запускать его оттуда? Или просто попробуйте добавить функцию Connect
в свой исходный скрипт, а затем назовите ее в нужном вам месте. Я обновил функцию и удалил имя пользователя/пароль. Это довольно простой способ запуска команд на удаленном устройстве.
Да, исходя из того, как настроена наша инфраструктура, нам рекомендуется SSH
сначала подключиться к серверам, локальным для сетевых устройств в этой области. Я scp
.sh
сначала на сервер, затем SSH
внутрь, затем bash myscript.sh
когда я вхожу.
Загляните в
expect
.