从shell脚本产卵的交互式telnet会话(Spawning an interactive tel

2019-07-28 21:00发布

我想编写一个脚本,让我登录到控制台服务器48个端口,这样我就可以快速确定哪些设备连接到每个串行线。

基本上我希望能够有一个脚本,给定的主机/端口的列表,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会话被自动关闭?

Answer 1:

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

#!/bin/bash

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


Answer 2:

我想你应该看看预期计划。 它`存在于所有现代的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 -打印评论到stdout



Answer 3:

感谢戴夫 - 这是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


Answer 4:

远程登录到使用Shell脚本示例服务器:

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 


Answer 5:

也许你可以尝试的bash -i迫使会议在交互模式。



Answer 6:

在您的例子的问题是您在脚本(和间接的输入链接telnet )的输出echo 。 因此,后echo完成和telnet开始,没有更多的投入阅读。 一个简单的修正可能是取代echo "testhost"{ echo "testhost"; cat; } { echo "testhost"; cat; } { echo "testhost"; cat; }

编辑: telnet似乎并不喜欢采取从管道输入。 然而, netcat确实是可能只是适合在这种情况下。



Answer 7:

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

for i in adele betty
do
ssh all@$i
done


Answer 8:

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

xterm -e telnet $host $port

在xterm的操作是交互式的shell脚本暂停直至终止的xterm。



Answer 9:

尝试这些链接。

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



文章来源: Spawning an interactive telnet session from a shell script
标签: bash telnet