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

StackOverflow https://stackoverflow.com/questions/100829

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

#!/bin/bash

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

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

Я думаю, тебе стоит посмотреть ожидать программа.Он присутствует во всех современных дистрибутивах 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 и т. д.)

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

отправлять - отправка команд

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

Спасибо, Дэйв, мне не хватало перенаправления 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 $1 }'`
        port=`echo $i | awk -F, '{ print $2 }'`
        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 $1}'`
   ssg_user=`echo $ssg_det|awk '{print $2}'`
   ssg_pwd=`echo $ssg_det|awk '{print $3}'`


   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 $1 >> $logfile 2>> $logfile |&
sleep $DELAY
echo -p $2 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $3 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $4 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $5 >> $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 

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

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

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

@Muz У меня есть настройка с SSH, без Telnet, поэтому я не могу проверить, связана ли ваша проблема, но запуск следующих сценариев последовательно регистрирует меня на различных машинах с просьбой о пароле.

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

Если ваша среда основана на 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top