`
rikugun
  • 浏览: 350463 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

phptelnet for cakephp

    博客分类:
  • PHP
阅读更多
最近有用到在PHP telnet到远程的服务器上校验用户密码的状态,在网上扒了一个telnet的类
然后改在cakephp上使用,多加了一些功能,比如登录的时候要输入域,还有判断登录成功的字符串.还可以自定义端口号
更新:
11.25
while (!$s['time_out'] && $s['unread_bytes']); //多加一个超时判断,这样就比较快了


测试环境:
OSX 10.5.5
Xampp(apache2.2 php5.2.6 mysql5.0.1)
telnetServer 华为,爱立信的某些告警交换机, Solaris5.9
Bug:
不支持Telnet到Windows
telnet到windows自带的Telnet Server有问题,总是不能登录.大概问题是返回的结果需要进行一定的协议处理.

app/controllers/components/php_telnet.php
/*
PHPTelnet 1.1
by Antone Roundy
adapted from code found on the PHP website
public domain
*/
/*
 * PHPTelnet for cakephp components
 * by Rikugun
 * v5[dot]rikugun[at]gmail[dot]com
 *
 */
class PhpTelnetComponent extends Object {
    //显示连接错误
    var $show_connect_error=1;
    //使用usleep来暂停程序
    var $use_usleep=0;	// change to 1 for faster execution
    // don't change to 1 on Windows servers unless you have PHP 5
    //暂停时间
    var $sleeptime=125000;
    //登录后等待时间
    var $loginsleeptime=1000000;

    var $fp=NULL;
    //登录提示字符串
    var $loginprompt;
    //最后抓到的字符串
    var $last_string;

    var $conn1;
    var $conn2;

    /*
     * 连接返回结果
    0 = success
    1 = couldn't open network connection
    2 = unknown host
    3 = login failed
    4 = PHP version too low
     * $domain为-1时直接输入回车
    */
    function Connect($server,$user,$pass,$port=23,$domain='') {
        $rv=0;
        //校验PHP版本 >=4.3.0
        $vers=explode('.',PHP_VERSION);
        $needvers=array(4,3,0);
        $j=count($vers);
        $k=count($needvers);
        if ($k<$j) $j=$k;
        for ($i=0;$i<$j;$i++) {
            if (($vers[$i]+0)>$needvers[$i]) break;
            if (($vers[$i]+0)<$needvers[$i]) {
                $this->ConnectError(4);
                return 4;
            }
        }

        $this->Disconnect();
        //处理hostname 域名转IP
        if (strlen($server)) {
            if (preg_match('/[^0-9.]/',$server)) {
                $ip=gethostbyname($server);
                if ($ip==$server) {
                    $ip='';
                    $rv=2;
                }
            } else $ip=$server;
        } else $ip='127.0.0.1';

        if (strlen($ip)) {
            $this->fp=fsockopen($ip,$port);
            if ($this->fp) {
                fputs($this->fp,$this->conn1);
                $this->Sleep();

                fputs($this->fp,$this->conn2);
                $this->Sleep();
                $this->GetResponse($r);
                $r=explode("\n",$r);
                $this->loginprompt=$r[count($r)-1];
                    fputs($this->fp,"$user\r");
                    $this->Sleep();

                    fputs($this->fp,"$pass\r");
                    if ($domain) {
                        if ($domain==-1) {
                        $domain='';
                    }
                        $this->Sleep();
                        fputs($this->fp,"$domain\r");
                }
                    if ($this->use_usleep) usleep($this->loginsleeptime);
                    else sleep(1);
                    $this->GetResponse($r);
                    $this->last_string = $r;
                    $r=explode("\n",$r);
                    if (($r[count($r)-1]=='')||($this->loginprompt==$r[count($r)-1])) {
                        $rv=3;
                        $this->Disconnect();
                    }
            } else $rv=1;
        }

        if ($rv) $this->ConnectError($rv);
        return $rv;
    }

    function Disconnect($exit=1) {
        if ($this->fp) {
            if ($exit) $this->DoCommand('exit',$junk);
            fclose($this->fp);
            $this->fp=NULL;
        }
    }
    //执行命令
    function DoCommand($c,&$r) {
        if ($this->fp) {
            fputs($this->fp,"$c\r");
            $this->Sleep();
            $this->GetResponse($r);
            $this->last_string = $r;
            $r=preg_replace("/^.*?\n(.*)\n[^\n]*$/","$1",$r);
        }
        return $this->fp?1:0;
    }
    //获取响应
    function GetResponse(&$r) {
        $r='';
        do {
            $r.=fread($this->fp,1000);
            $s=socket_get_status($this->fp);
        } while (!$s['time_out'] && $s['unread_bytes']); //多加一个超时判断,这样就比较快了
    }

    function Sleep() {
        if ($this->use_usleep) usleep($this->sleeptime);
        else sleep(1);
    }
/**
 * cakephp components初始化函数
 *
 * @return return
 * @author rikugun
 * @param  param
 **/
    function initialize(&$controller) {
        ;
    }
    function startup(&$controller) {
        $this->conn1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB).
        chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB).
        chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB).
        chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC).
        chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA).
        chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF).
        chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33).
        chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33).
        chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0).
        chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0).
        chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x58).chr(0x54).
        chr(0x45).chr(0x52).chr(0x4D).chr(0xFF).chr(0xF0);
        $this->conn2=chr(0xFF).chr(0xFC).chr(0x01).chr(0xFF).chr(0xFC).
        chr(0x22).chr(0xFF).chr(0xFE).chr(0x05).chr(0xFF).chr(0xFC).chr(0x21);
    }

    function ConnectError($num) {
        if ($this->show_connect_error) switch ($num) {
            case 1: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/fsockopen.php">Connect failed: Unable to open network connection</a><br />'; break;
                case 2: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/unknown-host.php">Connect failed: Unknown host</a><br />'; break;
                    case 3: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/login.php">Connect failed: Login failed</a><br />'; break;
                        case 4: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/php-version.php">Connect failed: Your server\'s PHP version is too low for PHP Telnet</a><br />'; break;
                        }
                    }
                }


在controller中调用
class somecontroller extends AppContronller{
var $components =array('PhpTelnet');

function someAction($id){
//获取实例
$swer = $this->Sw->findById($id);
//不显示默认错误信息
$this->PhpTelnet->show_connect_error=0;
$ret = $this->PhpTelnet->Connect(long2ip($swer['ip']), $swer['username'], $swer['password'], $swer['port'], $swer['domain']);
        switch ($ret) {
            case 0: //连接成功
                if (strstr($this->PhpTelnet->last_string,$swer['success_code'])) {
                    $swer['status']=1;
                    $retVal['success']=true;
                    $retVal['msg']='登录成功';
                    break;
                }
                $ret=3;
            case 1:
//                $swer['status']=0;
                $retVal = '无法连接到网络';
                break;
            case 2:
                $swer['status']=0;
                $retVal['msg'] = '无法连接到BSC';
                break;
            case 3:
                $swer['status']=2;
                $retVal['msg'] = '登录失败';
                break;
            case 4:
                $retVal['msg']='PHP版本太低';
                break;
        }
//其它操作可以用 $this->PhpTelnet->DoCommand($comm.$result)
}
}

1
0
分享到:
评论

相关推荐

    cakephp php-framework

    Github houses both CakePHP itself as well as many other plugins for CakePHP. The CakePHP releases are available at Github downloads. Alternatively you can get fresh off the press code, with all the ...

    PHP的框架之CakePHP-CakePHP教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;CakePHP的分页组件源码;CakePHP的中文及英文教程,CHM格式;CakePHP的中文打印版教程,WORD格式,下载后可直接打印,方便的;CakePHP...

    phpmvc框架cakephp

    **PHP MVC框架:CakePHP详解** 在Web开发领域,PHP是一种广泛应用的服务器端脚本语言,而MVC(Model-View-Controller)架构模式则是一种常见的设计模式,它将应用程序的逻辑分离开来,使代码更易于管理和维护。 ...

    CakePHP PHP MVC框架

    **CakePHP:PHP MVC框架详解** CakePHP是一个广泛使用的开源PHP框架,它基于Model-View-Controller(MVC)架构模式,旨在简化Web应用程序的开发流程,提高开发效率,并且支持快速原型制作。这个框架以其易用性、可...

    PHP的框架之CakePHP-CakePHP教程终极教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;CakePHP的分页组件源码;CakePHP的中文及英文教程,CHM格式;CakePHP的中文打印版教程,WORD格式,下载后可直接打印,方便的;CakePHP...

    CakePHP php框架 v3.7.8.zip

    CakePHP php框架简介 CakePHP是一个用PHP编写的开源Web应用框架,不过其模型是用Ruby on Rails设计的。作为PHP世界的Rails,CakePHP采纳了RoR的许多优秀特性,成熟度较高。在cakephp.org站点的Sites in the wild...

    CakePHP php框架 v3.7.0 beta1.zip

    CakePHP php框架简介 CakePHP是一个用PHP编写的开源Web应用框架,不过其模型是用Ruby on Rails设计的。作为PHP世界的Rails,CakePHP采纳了RoR的许多优秀特性,成熟度较高。在cakephp.org站点的Sites in the wild...

    CakePHP php框架 v3.8.5

    CakePHP是一个用PHP编写的开源Web应用框架,不过其模型是用Ruby on Rails设计的。作为PHP世界的Rails,CakePHP采纳了RoR的许多优秀特性,成熟度较高。在cakephp.org站点的Sites in the wild页面可以看到当前使用...

    cakephp 框架书籍 英文版

    - **要求**:详细列出了运行CakePHP框架所需的最低系统配置要求,包括PHP版本等。 - **许可协议**:解释了CakePHP的开源许可协议,帮助开发者理解其使用限制。 - **下载CakePHP**:提供了获取CakePHP框架的官方渠道...

    CakePHP 3.4 开发手册文档 CakePHP Cookbook Documentation Release 3.4

    CakePHP 是一款基于 PHP 的快速开发框架,它强调采用约定优于配置(Convention Over Configuration, CoC)的原则来简化开发过程,使得开发者能够快速构建稳定且安全的应用程序。在 CakePHP 3.4 中,这种原则体现得尤...

    cakephp-1.2 manual

    CakePHP 是一个基于Model-View-Controller(MVC)架构模式的开源PHP框架,它简化了Web应用程序的开发流程,提高了代码的可读性和可维护性。 在手册中,你会了解到以下核心知识点: 1. **安装与配置**:首先,你...

    CakePHP 1.2 API 中文文档

    CakePHP 是一个基于MVC(Model-View-Controller)架构的开源PHP框架,它旨在简化Web应用程序的开发,并提高开发效率。 CakePHP 1.2 API 中文文档是针对这个版本的详细技术参考,为开发者提供了丰富的接口信息和使用...

    CakePHP1.2.3.8166.7z CakePHP最新稳定版

    《深入理解CakePHP 1.2.3.8166:PHP的高效框架实践》 CakePHP,作为PHP世界中的一款知名MVC(Model-View-Controller)框架,以其简洁、高效的特性深受开发者喜爱。在本文中,我们将深度探讨最新的稳定版CakePHP 1.2...

    cakephp-2.4.1

    《CakePHP 2.4.1:PHP与MySQL的MVC框架详解》 CakePHP,一个基于Model-View-Controller(MVC)架构模式的开源PHP框架,以其简洁、高效和可扩展性在Web开发领域备受青睐。在本文中,我们将深入探讨CakePHP 2.4.1...

    cakephp 框架1.3.11版本

    CakePHP是一个基于MVC(Model-View-Controller)设计模式的开源PHP框架,它旨在简化Web应用程序的开发过程,提高开发效率。这个压缩包文件包含了有关CakePHP 1.3.11版本的信息,该版本发布于较早的时期,但仍然对...

    cakephp手册完整打印版

    CakePHP是一款基于Model-View-Controller(MVC)设计模式的开源PHP框架,它简化了Web应用开发过程,提高了开发效率。这份手册包含了从基础概念到高级特性的全方位教程和指南。 手册描述中提到,原始的单页手册可能...

    CakePHP使用ajax传值

    CakePHP框架中实现Ajax传值是通过AJAX (Asynchronous JavaScript and XML) 技术与后端的CakePHP控制器进行数据交换的一种方式。通常在Web开发中,Ajax用于创建更为动态和响应快速的用户界面。当用户与页面上的元素...

    cakephp-1.3.21.zip

    CakePHP是一个基于Model-View-Controller(MVC)架构模式的开源PHP框架,它致力于简化Web应用程序的开发,提供了一套强大的工具和约定,使开发者能够快速构建高质量的网站。在本文中,我们将深入探讨CakePHP 1.3.21...

Global site tag (gtag.js) - Google Analytics