2008-09-19 104 views
11

我想写一个脚本让我登录到控制台服务器48端口,以便我可以快速确定哪些设备连接到每个串行线路。从shell脚本产生一个交互式telnet会话

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

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

例如,给定以下代码:

$ cat ./telnetTest.sh 
#!/bin/bash 

while read line 
do 
     telnet $line 
done 
$ 

当我运行命令“回声 “主机名” | 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会话?

回答

7

您需要将终端输入重定向到telnet进程。这应该是/dev/tty。所以,你的脚本将看起来像什么:

#!/bin/bash 

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

也许你可以尝试bash -i强制会话处于交互模式。

5

我想你应该看看预计方案。它存在于所有现代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命令用来... .. HM期望从远程会话东西

发送 - 发送命令

send_user - 将意见打印到标准输出

0

您示例中的问题是您将脚本的输入(和间接的telnet)链接到echo的输出。所以echo完成后telnet启动后,没有更多的输入要读取。一个简单的解决办法可能是将echo "testhost"替换为{ echo "testhost"; cat; }

编辑:telnet似乎不喜欢从管道输入。然而,netcat确实可能只适用于这种情况。

0

@muz 我有SSH,没有远程登录的设置,所以我无法测试,如果你的问题的telnet有关,但运行以下脚本登录我先后到不同的机器要求输入密码。

for i in adele betty 
do 
ssh [email protected]$i 
done 
1

谢谢戴夫 - 这是TTY重定向,我失踪了。

完整的解决方案,我用,对于那些有兴趣谁:使用shell脚本示例

#!/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 
1

远程登录到服务器:

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 
0

如果您的环境,基于X11,一个可能性是打开一个xterm运行的telnet:

xterm -e telnet $host $port 

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