Создание интерактивного сеанса Telnet из сценария оболочки - PullRequest
11 голосов
/ 19 сентября 2008

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

По сути, я хочу иметь возможность иметь скрипт, который, учитывая список хостов / портов, telnets на первое устройство в списке и оставляет меня в интерактивном режиме, чтобы я мог войти в систему и подтвердить устройство, а затем Я закрываю сеанс 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?

Ответы [ 9 ]

7 голосов
/ 19 сентября 2008

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

#!/bin/bash

for HOST in `cat`
do
  echo Connecting to $HOST...
  telnet $HOST </dev/tty
done
5 голосов
/ 19 сентября 2008

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

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

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

отправка - отправка команд

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

1 голос
/ 02 ноября 2009

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 
1 голос
/ 19 сентября 2008

Спасибо, Дейв, - мне не хватало перенаправления 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
0 голосов
/ 15 сентября 2011

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

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

0 голосов
/ 02 ноября 2009

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

xterm -e telnet $host $port

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

0 голосов
/ 19 сентября 2008

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

for i in adele betty
do
ssh all@$i
done
0 голосов
/ 19 сентября 2008

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

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

0 голосов
/ 19 сентября 2008

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

...