Perl Telnet模块详解
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要连接的主机localhostPort连接的端口23Timeout超时(秒)10Binmode禁止CRLF转换falseCmd_remove_mode 从输入中删除回显命令autoErrmode设置错误模式dieInput_log输出结果日志文件名noneFhopen用于通信的文件句柄nonePrompt匹配的命令行提示符/[\$%#>] $/ 在上面这个列表中,我们一般需要设置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,)如果login如果遇到错误,则返回false。在我们成功登录之后,如何执行命令呢?这可以通过cmd()方法来实现,cmd()的返回结果可以存放在标量或者数组中:1) $result=$telnet->cmd($command)2) @result=$telnet->cmd(String=>$command,)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();
页:
[1]