Создание интерактивного сеанса Telnet из сценария оболочки

Я пытаюсь написать сценарий, позволяющий мне войти в систему на 48 портов консольных серверов, чтобы я мог быстро определить, какие устройства подключены к каждой последовательной линии.

По сути, я хочу иметь сценарий, который, учитывая список хостов / портов, подключается к первому устройству в списке и оставляет меня в интерактивном режиме, чтобы я мог войти в систему и подтвердить устройство, а затем, когда я закрою telnet-сеанс, подключается к следующему сеансу в списке.

Проблема, с которой я столкнулся, заключается в том, что если я запускаю сеанс telnet из исполняемого сценария bash, сеанс немедленно завершается, а не ожидает ввода.

Например, учитывая следующий код:

$ cat ./telnetTest.sh
#!/bin/bash

while read line
do
        telnet $line
done
$

Когда я запускаю команду 'echo "hostname" | testscript.sh 'Я получаю следующий результат:

$ echo "testhost" | ./telnetTest.sh
Trying 192.168.1.1...
Connected to testhost (192.168.1.1).
Escape character is '^]'.
Connection closed by foreign host.
$

Кто-нибудь знает, как остановить автоматическое закрытие сеанса telnet?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
0
34 309
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Возможно, вы могли бы попробовать bash -i, чтобы заставить сеанс перейти в интерактивный режим.

Думаю, вам стоит посмотреть программу ожидать. Он присутствует во всех современных дистрибутивах Linux. Вот пример скрипта:

#!/usr/bin/expect -f
spawn telnet $host_name
expect {
   "T0>"                {}
   -re "Connection refused|No route to host|Invalid argument|lookup failure"
                        {send_user "\r******* connection error, bye.\n";exit}
   default              {send_user "\r******* connection error (telnet timeout),
 bye.\n";exit}
}
send "command\n"
expect -timeout 1 "something"

Команда порождать запускает программу удаленного входа в систему (telnet, ssh, netcat и т. д.)

Команда expext используется для ... хм .. ожидать чего-то от удаленного сеанса

Отправить - отправка команд

send_user - для вывода комментариев на стандартный вывод

Проблема в вашем примере заключается в том, что вы связываете вход вашего скрипта (и косвенно telnet) с выходом echo. Таким образом, после завершения echo и запуска telnet больше нет ввода для чтения. Простым исправлением может быть замена echo "testhost" на { echo "testhost"; cat; }.

Обновлено: telnet, похоже, не любит вводить данные из трубы. Однако netcat подходит и, вероятно, как раз подходит в данном случае.

Ответ принят как подходящий

Вам необходимо перенаправить ввод Терминала в процесс telnet. Это должен быть /dev/tty. Итак, ваш сценарий будет выглядеть примерно так:

#!/bin/bash

for HOST in `cat`
do
  echo Connecting to $HOST...
  telnet $HOST </dev/tty
done

@muz У меня есть настройка с ssh, без telnet, поэтому я не могу проверить, связана ли ваша проблема с telnet, но запуск следующего скрипта последовательно регистрирует меня на разных машинах с запросом пароля.

for i in adele betty
do
ssh all@$i
done

Спасибо, Дэйв - мне не хватало перенаправления TTY.

Полное решение, которое я использовал, для тех, кому интересно:

#!/bin/bash

TTY=`tty` # Find out what tty we have been invoked from.
for i in `cat hostnames.csv` # List of hosts/ports
do
        # Separate port/host into separate variables
        host=`echo $i | awk -F, '{ print  }'`
        port=`echo $i | awk -F, '{ print  }'`
        telnet $host $port < $TTY # Connect to the current device
done

Telnet к серверу с использованием примера сценария оболочки:

Test3.sh Файл:

#!/bin/sh

#SSG_details is file from which script will read ip adress and uname/password
#to telnet.

SSG_detail=/opt/Telnet/SSG_detail.txt

cat $SSG_detail | while read ssg_det ; do

   ssg_ip=`echo $ssg_det|awk '{print }'`
   ssg_user=`echo $ssg_det|awk '{print }'`
   ssg_pwd=`echo $ssg_det|awk '{print }'`


   echo " IP to telnet:" $ssg_ip
   echo " ssg_user:" $ssg_user
   echo " ssg_pwd:" $ssg_pwd

   sh /opt/Telnet/Call_Telenet.sh $ssg_ip $ssg_user $ssg_pwd 

done


exit 0

Скрипт Call_Telenet.sh выглядит следующим образом:

#!/bin/sh

DELAY=1 
COMM1='config t'                 #/* 1st commands to be run*/
COMM2='show run'
COMM3=''
COMM4=''
COMM5='exit'
COMM6='wr'
COMM7='ssg service-cache refresh all'
COMM8='exit'                     #/* 8th command to be run */


telnet  >> $logfile 2>> $logfile |&
sleep $DELAY
echo -p  >> $logfile 2>> $logfile
sleep $DELAY
echo -p  >> $logfile 2>> $logfile
sleep $DELAY
echo -p  >> $logfile 2>> $logfile
sleep $DELAY
echo -p  >> $logfile 2>> $logfile
sleep $DELAY

sleep $DELAY
sleep $DELAY
sleep $DELAY
echo -p $COMM7 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $COMM8 >> $logfile 2>> $logfile
sleep $DELAY

exit 0

Запустите указанный выше файл следующим образом:

$> ./test3.sh 

Если ваша среда основана на X11, есть возможность открыть xterm с запущенным telnet:

xterm -e telnet $host $port

Операции в xterm являются интерактивными, и сценарий оболочки останавливается до завершения работы xterm.

Попробуйте эти ссылки.

http://planetozh.com/blog/2004/02/telnet-script/

http://www.unix.com/unix-dummies-questions-answers/193-telnet-script.html

#!/bin/sh
( echo open hostname
sleep 5
echo username
sleep 1
echo password
sleep 1
echo some more output, etc. ) | telnet

У меня работали: D

Другие вопросы по теме