如果从windows系统登陆Linux可以用ssh,如果要求从Linux上telnet到window上运行一些程序,又不想每次敲,那怎么办呢?
是否可以仿照 非交互式ftp(
http://blog.chinaunix.net/uid-20753106-id-3995248.html)的方法来写呢?
貌似不行啊。
但是我们可以换一种写法:
-
#!/bin/sh
-
# "telnet.sh"
-
REMOTEHOST="192.168.1.128"
-
USERNAME="administrator\r"
-
PASSWORD="123456\r"
-
{
-
sleep 1
-
echo $USERNAME
-
sleep 1
-
echo $PASSWORD
-
sleep 1
-
echo "d:\r"
-
sleep 1
-
echo "a.bat\r"
-
sleep 1
-
} | telnet $REMOTEHOST
然后你会发现,这一串字符串全都输到了“login: ”的后面了。因为在这点telnet不像ftp支持交互式输入,实际是我们是通过回显的方式将这些字符串输到telnet这个进程中的。包括脚本中的“sleep 1”,也是为了防止telnet的回显还没出来导需要回显的内容实际上没有回显到telnet程序中。
我将telnet的服务端建在了windows系统上进行测试。
在windows中,换行符是'\r',不需要'\n'。因为'\n'是是新一行的意思。在这里只要输入'\r'。
即:
-
#!/bin/sh
-
# "telnet.sh"
-
-
REMOTEHOST="192.168.1.128"
-
USERNAME="administrator\r"
-
PASSWORD="123456\r"
-
{
-
sleep 1
-
echo $USERNAME
-
sleep 1
-
echo $PASSWORD
-
sleep 1
-
echo "d:\r"
-
sleep 1
-
echo "a.bat\r"
-
sleep 1
-
} | telnet $REMOTEHOST
好了,齐活!
但是,如果telnet的服务端在Linux系统上怎么办呢?将'\r'换成'\n'是不行的。
但是可以用另外一个^M。这个东西在vi下输入的方法是在 插入模式下CTRL-V CTRL-M。
这有个问题,比如:如果我想通过一些配置,然后通过代码自动生成脚本这个^M就不好输入了。
这没关系,我们可以写个脚本,让脚本读我们的配置文件,然后脚本中在一个命令的命令加上^M就好了。当然telnet的IP地址不需要加^M,为了把脚本写得简单点,IP作为参数先写到脚本中吧。
-
#!/bin/bash
-
# "telnet.sh"
-
-
REMOTEHOST="192.168.1.128"
-
-
telnet $REMOTEHOST
-
-
while read str
-
do
-
sleep 1
-
#read str
-
if [[ $str = "quit" || $str = "exit" ]]
-
then
-
echo "exit^M"
-
exit
-
else echo $str^M
-
fi
-
done < a.txt
a.txt如下:
-
administrator
-
123456
-
dir
-
d:
-
dir
怎么样,又不行了吧? 不行那是必须的。echo是回显到屏幕上,我们要回显到telnet进程中,看看第一个脚本例子,将回显的内容输入到“|”管道中,然后输出到telnet进程中。
于是乎(参考在百度上搜索“linux下自动telnet到远程主机
”,呵呵。):
-
#!/bin/bash
-
# "telnet.sh"
-
-
tmptty=`tty`
-
tmptty=`basename $tmptty`
-
tmpname=`whoami`
-
-
if [ $# != 1 ]
-
then
-
echo " usage: $0 address "
-
exit 1
-
fi
-
ip=$1
-
-
inputfile=in.file
-
outputfile=out.file
-
rm -fr $inputfile
-
rm -fr $outputfile
-
mknod $inputfile p
-
touch $outputfile
-
-
#file description 7 for out and 8 for in
-
exec 7<>$outputfile
-
exec 8<>$inputfile
-
-
telnet $ip <&8 >&7 &
-
-
tail -f $outputfile &
-
-
while read str
-
do
-
sleep 1
-
#read str
-
if [[ $str = "quit" || $str = "exit" ]]
-
then
-
echo "exit^M" >> $inputfile
-
exit
-
else echo $str^M >> $inputfile
-
fi
-
done < a.txt
-
-
ps -ef | grep telnet | grep -v grep | grep -v telnetd | grep $tmptty | grep $tmpname | awk '{print " kill -9", $2}' | sh
-
ps -ef | grep tail | grep -v grep | grep -v telnetd | grep $tmptty | grep $tmpname | awk '{print " kill -9", $2}' | sh
最后两行是在退出时自动杀掉telnet和tail进程。这两行感觉不错。呵呵。
阅读(5215) | 评论(0) | 转发(0) |