从Shell脚本生成交互式telnet会话

时间:2020-03-06 14:25:20  来源:igfitidea点击:

我正在尝试编写一个脚本,以允许我登录到控制台服务器的48个端口,以便可以快速确定将哪些设备连接到每个串行线路。

从本质上讲,我希望能够有一个脚本,给定主机/端口的列表,然后远程登录到列表中的第一个设备,并使我处于交互模式,以便我可以登录并确认设备,然后在关闭主机时telnet会话,连接到列表中的下一个会话。

我面临的问题是,如果我从可执行的bash脚本中启动telnet会话,则该会话将立即终止,而不是等待输入。

例如,给出以下代码:

$ 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"

spawn命令启动远程登录程序(telnet,ssh,netcat等)

expext命令用于... hm ..希望从远程会话获得一些信息

发送发送命令

send_user将评论打印到标准输出

示例中的问题是我们将脚本的输入(以及telnet的间接输入)链接到echo的输出。因此,在完成" echo"并启动" telnet"之后,没有更多的输入可读取了。一个简单的解决方法是用{echo" testhost";代替echo" testhost";。猫; }`。

编辑:telnet似乎不喜欢从管道中获取输入。但是,netcat确实适用并且可能仅在这种情况下适用。

我们需要将Terminal输入重定向到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

使用Shell脚本示例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的,则可能是打开一个运行telnet的xterm:

xterm -e telnet $host $port

xterm中的操作是交互式的,shell脚本将暂停直到xterm终止。