Chinaunix首页 | 论坛 | 博客
  • 博客访问: 222173
  • 博文数量: 19
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 241
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-23 20:00
个人简介

如明日将死那样生活,如永远不死那样求知。

文章分类

全部博文(19)

文章存档

2018年(2)

2017年(3)

2015年(2)

2013年(11)

2012年(1)

我的朋友

分类: LINUX

2013-11-19 20:19:06

如果从windows系统登陆Linux可以用ssh,如果要求从Linux上telnet到window上运行一些程序,又不想每次敲,那怎么办呢?

是否可以仿照 非交互式ftp(http://blog.chinaunix.net/uid-20753106-id-3995248.html)的方法来写呢?
貌似不行啊。

但是我们可以换一种写法:

点击(此处)折叠或打开

  1. #!/bin/sh
  2. # "telnet.sh"
  3. REMOTEHOST="192.168.1.128"
  4. USERNAME="administrator\r"
  5. PASSWORD="123456\r"
  6. {
  7.     sleep 1
  8.     echo $USERNAME
  9.     sleep 1
  10.     echo $PASSWORD
  11.     sleep 1
  12.     echo "d:\r"
  13.     sleep 1
  14.     echo "a.bat\r"
  15.     sleep 1
  16. } | telnet $REMOTEHOST
然后你会发现,这一串字符串全都输到了“login: ”的后面了。因为在这点telnet不像ftp支持交互式输入,实际是我们是通过回显的方式将这些字符串输到telnet这个进程中的。包括脚本中的“sleep 1”,也是为了防止telnet的回显还没出来导需要回显的内容实际上没有回显到telnet程序中。

我将telnet的服务端建在了windows系统上进行测试。
在windows中,换行符是'\r',不需要'\n'。因为'\n'是是新一行的意思。在这里只要输入'\r'。
即:

点击(此处)折叠或打开

  1. #!/bin/sh
  2. # "telnet.sh"

  3. REMOTEHOST="192.168.1.128"
  4. USERNAME="administrator\r"
  5. PASSWORD="123456\r"
  6. {
  7.     sleep 1
  8.     echo $USERNAME
  9.     sleep 1
  10.     echo $PASSWORD
  11.     sleep 1
  12.     echo "d:\r"
  13.     sleep 1
  14.     echo "a.bat\r"
  15.     sleep 1
  16. } | telnet $REMOTEHOST
好了,齐活!
但是,如果telnet的服务端在Linux系统上怎么办呢?将'\r'换成'\n'是不行的。

但是可以用另外一个^M。这个东西在vi下输入的方法是在 插入模式下CTRL-V CTRL-M。
这有个问题,比如:如果我想通过一些配置,然后通过代码自动生成脚本这个^M就不好输入了。
这没关系,我们可以写个脚本,让脚本读我们的配置文件,然后脚本中在一个命令的命令加上^M就好了。当然telnet的IP地址不需要加^M,为了把脚本写得简单点,IP作为参数先写到脚本中吧。

点击(此处)折叠或打开

  1. #!/bin/bash
  2. # "telnet.sh"

  3. REMOTEHOST="192.168.1.128"

  4. telnet $REMOTEHOST

  5. while read str
  6. do
  7.     sleep 1
  8.     #read str
  9.     if [[ $str = "quit" || $str = "exit" ]]
  10.         then
  11.             echo "exit^M"
  12.             exit
  13.     else echo $str^M
  14.     fi
  15. done < a.txt
a.txt如下:

点击(此处)折叠或打开

  1. administrator
  2. 123456
  3. dir
  4. d:
  5. dir
怎么样,又不行了吧? 不行那是必须的。echo是回显到屏幕上,我们要回显到telnet进程中,看看第一个脚本例子,将回显的内容输入到“|”管道中,然后输出到telnet进程中。
于是乎(参考在百度上搜索“linux下自动telnet到远程主机”,呵呵。):

  1. #!/bin/bash
  2. # "telnet.sh"

  3. tmptty=`tty`
  4. tmptty=`basename $tmptty`
  5. tmpname=`whoami`

  6. if [ $# != 1 ]
  7. then
  8.     echo " usage: $0 address "
  9.     exit 1
  10. fi
  11. ip=$1

  12. inputfile=in.file
  13. outputfile=out.file
  14. rm -fr $inputfile
  15. rm -fr $outputfile
  16. mknod $inputfile p
  17. touch $outputfile

  18. #file description 7 for out and 8 for in
  19. exec 7<>$outputfile
  20. exec 8<>$inputfile

  21. telnet $ip <&8 >&7 &

  22. tail -f $outputfile &

  23. while read str
  24. do
  25.     sleep 1
  26.     #read str
  27.     if [[ $str = "quit" || $str = "exit" ]]
  28.         then
  29.             echo "exit^M" >> $inputfile
  30.             exit
  31.     else echo $str^M >> $inputfile
  32.     fi
  33. done < a.txt

  34. ps -ef | grep telnet | grep -v grep | grep -v telnetd | grep $tmptty | grep $tmpname | awk '{print " kill -9", $2}' | sh
  35. 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) |
0

上一篇:非交互式ftp

下一篇:报文尾

给主人留下些什么吧!~~