从Shell脚本生成交互式telnet会话
我正在尝试编写一个脚本,以允许我登录到控制台服务器的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终止。