我正在尝试编写一个脚本,允许我登录到控制台服务器48端口,这样我就可以快速确定哪些设备连接到每个串行线。
基本上我希望能够有一个脚本,给定一个主机/端口列表,telnet到列表中的第一个设备并让我处于交互模式,这样我就可以登录并确认设备,然后当我关闭了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会话自动关闭的方法?
答案 0 :(得分:7)
您需要将终端输入重定向到telnet
进程。这应该是/dev/tty
。所以你的脚本看起来像:
#!/bin/bash
for HOST in `cat`
do
echo Connecting to $HOST...
telnet $HOST </dev/tty
done
答案 1 :(得分:5)
我认为你应该看看 expect 计划。它出现在所有现代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 - 将评论打印到stdout
答案 2 :(得分:1)
谢谢戴夫 - 这是我失踪的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
答案 3 :(得分:1)
使用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 $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
答案 4 :(得分:0)
也许您可以尝试使用bash -i来强制会话处于交互模式。
答案 5 :(得分:0)
您的示例中的问题是您将脚本的输入(以及telnet
的间接输入)链接到echo
的输出。因此,在完成echo
并启动telnet
之后,就没有更多要读取的输入。一个简单的解决方法是将echo "testhost"
替换为{ echo "testhost"; cat; }
。
编辑:telnet
似乎不喜欢从管道中获取输入。但是,netcat
确实适用于此情况。
答案 6 :(得分:0)
@muz 我有一个ssh,没有telnet的设置,所以我无法测试你的问题是否与telnet相关,但运行以下脚本会连续登录到要求输入密码的不同机器。
for i in adele betty
do
ssh all@$i
done
答案 7 :(得分:0)
如果您的环境是基于X11的,则可能会打开运行telnet的xterm:
xterm -e telnet $host $port
xterm中的操作是交互式的,shell脚本将暂停,直到xterm终止。
答案 8 :(得分:0)
试试这些链接。
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