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





Возможно, вы могли бы попробовать 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