Chinaunix首页 | 论坛 | 博客
  • 博客访问: 23957
  • 博文数量: 2
  • 博客积分: 162
  • 博客等级: 入伍新兵
  • 技术积分: 35
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-06 16:18
文章分类

全部博文(2)

文章存档

2011年(2)

我的朋友

分类: Python/Ruby

2011-06-24 10:28:18

Telnet是一个古老而又不安全的协议,用来实现远程登录。这种服务可以和基于客户机/服务器进行通信,也就是说把你的电脑虚拟成一个键盘(伪终 端)来和远程的服务进行通信,而服务器以为输入来自它本地的键盘,我们在本地所执行的命令会发送到远程服务器执行并返回结果。Telnet是基于TCP连 接,所以在建立连接之前需要握手来表明身份,即向服务器提供用户标识(登录名和密码)。Telnet服务默认监听23端口来提供服务。
在Perl中,我们使用Net::Telnet模块来提供对Telnet协议的支持。它和其它的Perl模块一样,使用面向对象的语法,因此它非常的简单。
准备工作
我们必须要开启Telnet服务,这样客户端才可以使用它进行远程登录。
查看是否安装Telnet:
# rpm -qa|grep -i telnet
如果没有,则:
# yum -y install telent telnet-server
配置Telnet:
# vi /etc/xinetd.d/telnet
把disable=yes 改成disable=no
启动Telnet:
# /etc/init.d/xinetd restart
检查是否成功启动:
# netstat -ant|grep 23 或者 # pgrep telnet
创建用户名:
# useradd telnet //默认情况root不充许Telnet登录,因为它不安全(明文传输)
设置密码
# passwd telnet
 
简单的尝试
如果我们要和远程的服务器进行通信,我们要提供基本的用户名和密码来表示你有权使用它:
use Net::Telnet;
my $telnet=Net::Telnet->new($hostname);
$telnet->login($usename,$password);
...
 
像上面这样,基本上你就可以使用Telnet来实现远程登录了。在建立链接之后,我们可以使用$telent对象来执行后续的操作,这些操作就像是在远程电脑上执行一样,这样我们就实现的远程维护系统的目的。
 
Telnet模块为我们提供足够的方法来实现维护系统的目的,它有而这些方法也有大量的选项供我们,所以Telnet是一个足够灵活的模块,下面就分别来说说这些方法的具体使用方法。
首先从new方法开始。
在Telnet模块中,我们调用new方法以此来创建一个telnet对象,这个对象就像是一个键盘(或者说是一个文件句柄)一样,我们通过个 对象来和远程服务器进行通信。那么怎样来创建这个telnet对象呢,这就是new构造函数的用武之地了。一般来说我们可以使用以下两种方法来创建 telnet对象:
1) my $telnet=Net::Telnet->new(ip或者主机名)
2) my $telnet=Net::Telnet->new(Host=>'ip或者主机名')
像上面我们用命名参数的形式去调用new方法,它还有更多的选项,这些选项可以更灵活的对对象加以控制,这些选项以"键/值"对的形式出现,这在Perl中叫做命名参数。下面是new方法常用的选项:
=====================================================================
选项 描述 默认值
=====================================================================
Host 要连接的主机 localhost
Port 连接的端口 23
Timeout 超时(秒) 10
Binmode 禁止CRLF转换 false
Cmd_remove_mode 从输入中删除回显命令 auto
Errmode 设置错误模式 die[return]
Input_log 输出结果日志文件名 none
Fhopen 用于通信的文件句柄 none
Prompt 匹配的命令行提示符 /[\$%#>] $/
 
在上面这个列表中,我们一般需要设置Timeout选项,其它设为默认即可,当然如果你的telnet默认端口不是23,还得显式指定Port。至于其它的选项我们也来作一个简单的解析。
Binmode:这个用于控制CRLF转换,标准的服务器程序都以CRLF对的形式来标识每个换行字符,这样就可以明确的区分每条命令序列。如果你把Binmode设为Binmode=>true或者Binmode=>1,则数据将逐字的发送。
Cmd_remove_mode:是否删除服务器响应数据中的第一行,准确的说是删除我们发送给服务器的命令。因为这个命令会附加在服务器回应的数据名中。 
Errmode:我们在连接远程服务器是不可避免的会发生错误,这个选项就是用来控制当错误发生应该怎么处理。你可以自定义处理程序来响应发生错误时要做的工作。
Input_log:它的值可以为文件名或者已经打开的文件句柄。它用来保存从服务器所接收到的数据。
Prompt:它的值应该是一个正则表达式(/pattern/),用于下面就要说的login方法的参考,来表明命令是否成功运行。
 
如果你已经通过new方法成功的连接到了一个远程主机的指定端口,剩下的问题就是用指定的用户名和密码进行登录,它同样也有两种方式:
1) $telnet->login($username,$password)
2) $telnet->login(
 Name=>$username,
 Password=>$password,
 [Prompt=>$prompt,]
 [Timout=>$timeout]
)
如果login如果遇到错误,则返回false。
在我们成功登录之后,如何执行命令呢?这可以通过cmd()方法来实现,cmd()的返回结果可以存放在标量或者数组中:
1) $result=$telnet->cmd($command)
2) @result=$telnet->cmd(
String=>$command,
[Timeout=>$timeout,]
[Prompt=>$pattern,]
[Output=>$ref,]
[Cmd_remove_mode=>$mode]
)
cmd()中的选项值可以覆盖掉new()方法中同名选项。
除了cmd()方法外,我们还可以使用print()方法来执行命名,然后使用waitfor()方法来获得命令执行之后的结果(成功或者失败都有一些标志,这个方法其实就是用正则去匹配结果数据)
其它可用方法:
errmsg():返回方法调用时的错误消息
lastline():返回从对象读取的最后一行文本
get(),getline(),getlines():返回Telnet会话中可用的数据
input_record_separator(),output_record_separator():定义输入记录和输出记录分隔符,默认都为\n
改变Telnet对象的默认值:
$telnet->timeout($value) #改变已经创建的Telnet对象的值
$telnet->errmode($value)
$telnet->binmode($value)
$telnet->prompt($value)
关闭Telnet连接:
$telnet->close();
阅读(1718) | 评论(0) | 转发(0) |
0

上一篇:Perl中的$/

下一篇:没有了

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