求问,ssh2_connect函数这个函数如何在ci框架中使用

花了一下午时间,终于弄清楚了如何在php中使用libssh2扩展。在这个过程中遇到了一些问题,在解决问题的过程中加深了对php和ssh2的理解。所以,还是决定抽点时间回顾整个过程,作为备忘。
什么是php的ssh2扩展
Php ssh2扩(以下简称PECL/ssh2),允许在php程序中远程执行系统命令和文件传输,不需要在被监控的机器上单独开发和部署类似agnet的&木马&程序,大大降低了运维成本。
Php ssh2扩展需要的依赖库
openssl: 加密算法集合,C语言实现
libssh2:ssh2协议库库,C语言实现
PECL/ssh2: libssh2的php扩展,允许php程序调用libssh2中的函数
依赖关系:PECL/ssh2 && libssh2 && openssl
$ cd openssl.x.x.x
$ ./configure --prefix=/your/openssl/home
$ make install
$ cd libsshxxxx
$ ./configure --with-libssl-prefix=/your/openssl/home LIBS=-ldl
$ make install
PS: 配置中的&LIBS=-ldl&十分重要,如果不设置,如果不设置会导致&dlclose无法链接等错误&
[PECL/ssh2]
$ cd ssh2x.x.x
$ ./configure --with-php-config=/your/php/home/bin/php-config LIBS =-ldl
$ make install
$ vi php.ini
(添加extension=ssh2.so)
$ cp ssh2.so /php.ini/extention_dir
$ cd /apache/bin
$ apachectl restart (重启apache,使ssh2扩展生效)
$ php &I | grep ssh2 (检查PECL/ssh2是否安装成功,什么都没有标识没有成功)
PS: 配置中的&LIBS=-ldl&十分重要,如果不设置,会导致&libssh2 version &= 0.4 not found&错误,可以通过查看config.log,定位具体的bug位置,与安装libssh类似。
Php ssh2 API例子
通过PECL/ssh2相关API远程操作计算机时,首先需要获取链接,使用函数:
session ssh2_connect($host, $port)
获取链接后,需要进行验证,也就是登录,ssh2提供三种登入方式:
public key : 通过公钥和密钥进行验证,需要使用openssl生成工密钥,然后将公钥上传到需要远程访问机器的指定目录。特点比较安全,但是不太方便。PECL/ssh2支持。
password : 直接通过用户名和密码登录。特点是很方便,但是不安全,密码必须已明文的方式传给ssh2的api。PECL/ssh2支持。
keyboard-interactive:需要用户手动输入密码,PECL/ssh2不支持。
可以通过下面的api获取服务器提供的验证方式:
ssh2_auth_none ( resource $session , string $username )
返回值是一个验证方式的字符串数组。
下面的代码演示password方式验证并在远程调用&pwd&命令:
$host='ip_or_host';
$user='some_user';
$passwd='your_password';
// 链接远程服务器
$connection = ssh2_connect($host, 36000);
if (!$connection) die('connection to '.$host.':3600 failed');
echo 'connection OK&br/&';
// 获取验证方式并打印
$auth_methods = ssh2_auth_none($connection, $user);
print_r( $auth_methods.'&br/&');
if (in_array('password', $auth_methods ))
// 通过password方式登录远程服务器
if (ssh2_auth_password($connection, $user, $passwd))
echo $user.' login OK&br/&';
$stream = ssh2_exec($connection, "pwd"); // 执行php
stream_set_blocking($stream, true); // 获取执行pwd后的内容
if ($stream === FALSE) die("pwd failed");
echo 'pwd: '.stream_get_contents($stream).'&br/&';
die( $user.' login Failed&br/&');
安装php扩展的一般过程:
1. phpize,生成配置文件和makefile等
2. ./configure && make && make install
3. 边界php.ini,添加extension
4. 将编译的so文件考到extension_dir目录下
5. 重启apche
6. 查看phpinfo或&php &i| grep xxxx&输出的页面中是否存需要安装的扩展
PS: 配置过程中,如果发现一些问题,可以通过查看config.log查看问题发生位置。
Php ssh2 api官方文档,很清晰,注意下面的讨论:
安装步骤描述:
阅读(...) 评论()PHP mysql_real_escape_string() 函数
PHP mysql_real_escape_string() 函数
定义和用法
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
mysql_real_escape_string(string,connection)
必需。规定要转义的字符串。
connection
可选。规定 MySQL 连接。如果未规定,则使用上一个连接。
本函数将 string 中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 。
提示和注释
提示:可使用本函数来预防数据库攻击。
$con = mysql_connect(&localhost&, &hello&, &321&);
if (!$con)
die('Could not connect: ' . mysql_error());
// 获得用户名和密码的代码
// 转义用户名和密码,以便在 SQL 中使用
$user = mysql_real_escape_string($user);
$pwd = mysql_real_escape_string($pwd);
$sql = &SELECT * FROM users WHERE
user='& . $user . &' AND password='& . $pwd . &'&
// 更多代码
mysql_close($con);
数据库攻击。本例演示如果我们不对用户名和密码应用 mysql_real_escape_string() 函数会发生什么:
$con = mysql_connect(&localhost&, &hello&, &321&);
if (!$con)
die('Could not connect: ' . mysql_error());
$sql = &SELECT * FROM users
WHERE user='{$_POST['user']}'
AND password='{$_POST['pwd']}'&;
mysql_query($sql);
// 不检查用户名和密码
// 可以是用户输入的任何内容,比如:
$_POST['user'] = 'john';
$_POST['pwd'] = &' OR ''='&;
// 一些代码...
mysql_close($con);
那么 SQL 查询会成为这样:
SELECT * FROM users
WHERE user='john' AND password='' OR ''=''
这意味着任何用户无需输入合法的密码即可登陆。
预防数据库攻击的正确做法:
function check_input($value)
// 去除斜杠
if (get_magic_quotes_gpc())
$value = stripslashes($value);
// 如果不是数字则加引号
if (!is_numeric($value))
$value = &'& . mysql_real_escape_string($value) . &'&;
$con = mysql_connect(&localhost&, &hello&, &321&);
if (!$con)
die('Could not connect: ' . mysql_error());
// 进行安全的 SQL
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = &SELECT * FROM users WHERE
user=$user AND password=$pwd&;
mysql_query($sql);
mysql_close($con);笔者看了这三篇英文参考,加上自己的一些理解,对官方文档关于驱动器的这一部分进行了一些补充。
1.什么是驱动器
驱动器是一种特殊类型的类库,它有一个父类和任意多个子类。子类可以访问父类, 但不能访问兄弟类。在你的中,驱动器为你的类库提供了 一种优雅的语法,从而不用将它们拆成很多离散的类。
一般我们看到父类和子类,我们会毫不犹豫的认为他们是继承和派生的关系,但是这里需要注意的是,驱动器中所提到的子类,并不是真的继承了父类驱动器,仅仅是其有访问父类驱动器的权限,在其中一篇参考文献中,作者将父类称为主类(master class),将此类称为次类(sub class),个人认为这种叫法比官方的更为精确,所以后面借用这一称谓。关于这个注意事项在后面的例子里读者可以看到。
驱动器位于&system/libraries/&目录,每个驱动器都有一个独立的目录,目录名和 驱动器父类的类名一致,在该目录下还有一个子目录,命名为 drivers,用于存放所有子类的文件。
2.如何使用驱动器?
要使用一个驱动器,你可以在控制器中使用下面的方法来进行初始化:
$this-&load-&driver(‘class_name‘);
class_name 是你想要调用的驱动器类名,例如,你要加载名为 Some_parent 的驱动器, 可以这样:
$this-&load-&driver(‘some_parent‘);
然后就可以像下面这样调用该类的方法:
$this-&some_parent-&some_method();
而对于那些子类,我们不用初始化,可以直接通过父类调用了:
$this-&some_parent-&child_one-&some_method();
$this-&some_parent-&child_two-&another_method();
举一个实际的例子,假如我们需要创建一个Connect类来连接各种社交服务,并且从这些平台获取一些数据。直接借用外国网友的例子。
实际的代码看起来是这样的:
$this-&load-&driver(‘connect‘);
$this-&connect-&facebook-&get_friends();
$this-&connect-&twitter-&get_twitts();
这样就把一些分散的功能集中到一个类库中了,而且结构非常清晰。
3.如何创建驱动器
CI的官方文档中并没有详细介绍如何自己写一个驱动器,因此这里是重点。创建驱动器的第一步是创建一个驱动器文件目录结构, 这里我们创建自己的驱动器,要放在application/libraries目录下。文件夹名和驱动器类名相同,并且首字母大写如Connect,在此文件夹中再创建一个子文件夹,一定要取名为drivers,注意这里文件夹名称是小写字母,在drivers文件内创建次驱动器文件,文件名以主驱动器类名加下划线开头。
驱动器目录和文件结构布局如下图所示:
创建主驱动器类
application/libraries/Connect/Connect.php
if (!defined(‘BASEPATH‘))
&&& exit(‘No direct script access allowed‘);
classConnectextendsCI_Driver_Library
&&& public$valid_drivers;
&&& public$CI;
&&& function__construct()
&&&&&&& $this-&CI = &get_instance();
&&&&&&& $this-&CI-&config-&load(‘connect‘, TRUE);
&&&&&&& $this-&valid_drivers = $this-&CI-&config-&item(‘modules‘, ‘connect‘);
&&& publicfunctionget_friends()
&&&&&&& return$this-&twitter-&get_friends() . $this-&facebook-&get_friends();
读者应该注意到了主驱动器类继承的是CI_Driver_Library,变量$valid_drivers是必须的,它是用来告诉框架应该加载哪些次驱动器,它是一个包含次驱动器类名称的数组。有两种方法来定义这个变量:
第一种方法是直接在驱动器代码中定义:
将下面的代码替换构造函数的最后一句
$this-&Valid_drivers= array(‘connect_twitter‘, ‘connect_facebook‘);
第二种方法是通过配置文件:
推荐采用这种方法,维护起来比较方便。创建一个文件application/config/connect.php
$config[‘modules‘] = array(‘connect_twitter‘, ‘connect_facebook‘);
这个字段取名为modules,你可以自己取一个名称,然后正如上面那个例子那样来调用。
在例子中我们还用$CI变量引用了框架的超级对象,然后加载配置文件,参数TRUE是为了防止名称与框架冲突,主驱动器类中的public和protected变量和方法在次驱动器中都是可以访问的。
创建次驱动器类
application/libraries/Connect/drivers/Connect_twitter.php
if (!defined(‘BASEPATH‘))
&&& exit(‘No direct script access allowed‘);
classConnect_twitterextendsCI_Driver
&&& publicfunctionget_twitts()
&&&&&&& return‘Мои последние твитты:‘;
&&& publicfunctionget_friends()
&&&&&&& return‘@vanya, @stepa ‘;
application/libraries/Connect/drivers/Connect_facebook.php
if (!defined(‘BASEPATH‘))
&&& exit(‘No direct script access allowed‘);
classConnect_facebookextendsCI_Driver
&&& publicfunctionget_friends()
&&&&&&& return‘Ivan,& Stepan ‘;
这里我们注意到次驱动器并不是继承主驱动器,也没有继承CI_Driver_Library而是CI_Driver。
4.在控制器中使用驱动器
由于所有次驱动器有方法主驱动器的权限,次驱动器仅能通过主驱动器访问,因此次驱动器之间的数据交换要通过主驱动器作为中间桥梁。
. application/controller/home.php
&?phpif ( ! defined(‘BASEPATH‘)) exit(‘No direct script access allowed‘);
classHomeextendsCI_Controller {
&&& publicfunction__construct()
&&&&&&& parent::__construct();
&&&&&&& $this-&load-&driver(‘connect‘);
&&& publicfunctionfriends()
&&&&&&& echo‘我社交网络的朋友: ‘;
&&&&&&& echo$this-&connect-&get_friends();
&&&&&&& //同时从两个站点获得
&&& publicfunctiontwitts()
&&&&&&& echo$this-&connect-&twitter-&get_twitts();
&&&&&&& // Twitter记录
这个例子相当简单, 但是对于理解CI中驱动器的概念很有参考价值,更复杂的应用可以参考最后一篇文章。
参考文档:
&&&&&&&&& (这篇比较复杂)
&标签:原文地址:http://www.cnblogs.com/star91/p/4893287.html
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!不要等到需要,才积累人脉。
不要等到有时间,才去读书。
不要等到身无分文,才想起储蓄。
不要等到痛苦,才放下。
不要等到那个人走了,才珍惜。
不要等到同龄人都成功了,才知道玩物丧志。
不要等到变老了,才懂得忘掉。
不要等到拥有很多时,才学会分享。
ssh2_connect(): Unable to connect to 192.168.0.2 on port 22
ssh2_connect(): Unable to connect to 192.168.0.2 on port 22
围观7773次
编辑日期: 字体:
7,774 views
原因是:SELinux的原因
1.打开http网络访问
setsebool -P httpd_can_network_connect 1
2.关掉selinux
vi /etc/selinux/config
SELINUX=disabled
3.实时关闭selinux
/usr/sbin/setenforce 0
查看http 是否network
/usr/sbin/getsebool -a |grep httpd_can_network_connect
本文固定链接:
转载请注明:
作者:严嵩
这个作者貌似有点懒,什么都没有留下。
如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!
您可能还会对这些文章感兴趣!

我要回帖

更多关于 qt connect函数 的文章

 

随机推荐