用SSH与PHP相连接 确保数据传输的安全性

SSH可以通过将联机的封包加密的技术进行资料的传递; 使用SSH可以把传输的所有数据进行加密,即使有人截获到数据也无法得到有用的信息。同时数据经过压缩,大大地加快了传输的速度。总之,通过SSH的使用,可以确保资料传输比较安全并且传输效率较高。

不过,并非所有人知道PHP可以与SSH连接的特性以及与执行远程命令的能力,不过这方面却非常有用。由于我们可以在很多不同的方面利用PHP,因此它有很多设置选项来控制其行为。一组庞大的可选参数能够保证您可以将 PHP 用于许多不同的目的,但这同时也意味着这些参数和服务端配置的组合会带来一些安全问题。笔者一直在PHP CLI应用程序中使用SSH,笔者是从cronjobs中使用它的,不过一开始并非十分简单,可以说颇费周折。关于安全使用Shell2 函数的手册也不是十分实用,笔者进行了多次试验之后才有了今天这篇小文章,愿您读了之后能为您配置PHP节省一点儿时间。

在这篇文章中,笔者需要假设:

你正在运行的操作系统是Debian / Ubuntu。如果你运行的不是Debian / Ubuntu,你可能需要用你的Linux发行版本提供的数据包管理器来替换本文对应内容。

你运行的是PHP5.如果你运行的不是PHP5,可用PHP4代替之。

你对PHP和服务器管理有基本的了解。

你已经安装了PHP。

先决条件

安装程序包

首先,让我们安装下面的程序包:

sudo aptitude update

sudo aptitude install php5-dev php5-cli php-pear buid-essential \

openssl-dev zlib1g-dev

安装完成进入下一步。

编译libssh2

在从sourceforge网站下载了Libssh2之后,我们需要编译它,不过不要担心,你只需要按照如下的方法操作:

cd /usr/src

wget surfnet.dl.sourceforge.net/sourceforge/libssh2/libssh2-0.14.tar.gz

tar -zxvf libssh2-0.14.tar.gz

cd libssh2-0.14/

。/configure

make all install

如果你想检查是否有了一个新版本,可以查看SF.NET.不过,0.14这个版本就足够了。

安装

安装ssh2.so

下一步,我们需要将libssh和 PHPr链接起来。有一个PECL模块可以完成这个功能。我们可以使用PEAR安装它。

pear install -f ssh2

-f参数确保SSH2被安装,即使并没有一个稳定的选择对象。你还可以使用如下的包名称:ssh2-beta来强行运行。

现在你需要确保我们这个新的SSH2.SO模块被PHP加载。编辑你的php.ini文件(对于CLI实用程序:/etc/php5/cli/php.ini,对于Apache实用程序:/etc/php5/apache2/php.ini)

extension=ssh2.so

这应该放在“Dynamic Extensions”的下面,大约在第515行左右。

PHP支持SSH编写代码

你刚刚在PHP中启用了SSH2。那么现在应该如何利用它呢?有两个选择。SSH支持:

1.执行方法:

这告诉你的服务器的操作系统来执行什么东西,并且通过管道传回到你的脚本。

2.外壳方法:

这种方法在操作系统中打开一个实际的外壳,这正像通过终端应用程序登录时所操作的那样。有一些路由器并没有一个完全的POSIX一致性实施过程,而是在你登录时立即运行其自身的应用程序。这时你就需要这种方法。

下面我们分别详述之:

第一种方法:执行

你最好为下面的代码创建函数或者是一个类,不过本文仅仅起到一个为您提供基本观念的作用,所以说你可以如此开始:

if (!function_exists(“ssh2_connect”)) die(“function ssh2_connect doesn‘t exist”)

// log in at server1.example.com on port 22

if(!($con = ssh2_connect(“server1.example.com”, 22))){

echo “fail: unable to establish connection\n”;

}

else {

// try to authenticate with username root, password secretpassword

if(!ssh2_auth_password($con, “root”, “secretpassword”)) {

echo “fail: unable to authenticate\n”;

}

else {

// allright, we’re in!

echo “okay: logged in.。.\n”;

// execute a command

if(!($stream = ssh2_exec($con, “ls -al” )) ){

echo “fail: unable to execute command\n”;

}

else{

// collect returning data from command

stream_set_blocking( $stream, true );

$data = “”;

while( $buf = fread($stream,4096) ){$data 。= $buf;

}

fclose($stream);

}

}

第二种方法:外壳

同样道理,你也可以为如下的代码编写函数或者一个类。不过,本文仅仅提供基本观念:

if (!function_exists(“ssh2_connect”)) die(“function ssh2_connect doesn‘t exist”)

// log in at server1.example.com on port 22

if(!($con = ssh2_connect(“server1.example.com”, 22))){

echo “fail: unable to establish connection\n”;

}

else {

// try to authenticate with username root, password secretpassword

if(!ssh2_auth_password($con, “root”, “secretpassword”)) {

echo “fail: unable to authenticate\n”;

}

else {

// allright, we’re in!echo “okay: logged in.。.\n”;

// create a shell

if(!($shell = ssh2_shell($con, ‘vt102’, null, 80, 40, SSH2_TERM_UNIT_CHARS))){

echo “fail: unable to establish shell\n”;

}

else{

stream_set_blocking( $shell, true );

// send a commandfwrite($shell,“ls -al\n”);

sleep(1);

// & collect returning data$data = “”;

while( $buf = fread($shell,,4096) ){

$data 。= $buf;

}

fclose($shell);

}

}

}

小提示:

有时服务器忙碌,或者一个连接出错,缓冲区没有数据,PHP脚本就会停止从一个命令输出(即使命令并没有完成!)中收集数据。你可以为此进行如下的操作:

ssh2_exec($con, ‘ls -al; echo “__COMMAND_FINISHED__”’ );

现在,在你不断地检查缓冲区的循环中,只需要看一下COMMAND_FINISHED。因为你就可以知道你拥有了所有的数据。为了避免无限循环(死循环),可以用一个10秒的超时限制:

$time_start = time();

$data = “”;

while( true ){$data 。= fread($stream, 4096);

if(strpos($data,“__COMMAND_FINISHED__”) !== false){

echo “okay: command finished\n”;

break;

}

if( (time()-$time_start) 》 10 ){

echo “fail: timeout of 10 seconds has been reached\n”;

break;

}

}

在上面的例子中,你最好将stream_set_blocking设为false。

通过SSH发送文件

ssh2_scp_send($con, “/tmp/source.dat”, “/tmp/dest.dat”, 0644);

如果不能正常工作

请检查如下的几个方面:

依照本文检查你操作的每一步

在服务器端,在sshd_config 中必须启用“PasswordAuthentication yes”。在大多数服务器上默认值是yes,不过有些情况下,你可能需要将下面的一行加入到文件中,即亲自动手打开这个功能:

/etc/ssh/sshd_config:

# Change to yes to enable tunnelled clear text

passwordsPasswordAuthentication yes

如果作了改变,就需要重新启动SSH:

/etc/init.d/ssh restart

时间: 2024-08-29 05:38:57

用SSH与PHP相连接 确保数据传输的安全性的相关文章

将SSH与PHP相连接 确保传输数据的安全

SSH可以通过将联机的封包加密的技术进行资料的传递;使用SSH可以把传输的所有数据进行加密,即使有人截获到数据也无法得到有用的信息.同时数据经过压缩,大大地加快了传输的速度.总之,通过SSH的使用,可以确保资料传输比较安全并且传输效率较高. 不过,并非所有人知道PHP可以与SSH连接的特性以及与执行远程命令的能力,不过这方面却非常有用.由于我们可以在很多不同的方面利用PHP,因此它有很多设置选项来控制其行为.一组庞大的可选参数能够保证您可以将 PHP 用于许多不同的目的,但这同时也意味着这些参数

iOS后台如何保持socket长连接和数据传输

iOS后台如何保持socket长连接和数据传输 工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题: 当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭,因此无法再进行数据的传输: 解决方法: 通过设置以下属性可以保持socket连接和数据的继续传输 1.需要在Info.plist文件中添加UIBackgroundModes中的VOIP键值: 2.设置流属性 CFReadStreamRef和CFWri

SSH如何通过公钥连接云服务器

通常我们连接远程服务器(linux)windows下通过putty或xshell等工具远程连接.linux下可以直接通过ssh命令连接. 其实这两者都是一致的,都是通过ssh协议进行传输. 如果我们的windows没有安装putty等工具,但是有git-bash的话也可以直接通过ssh来连接.通过以下命令: ssh root@ip/主机名/域名/  接下来会叫你输入密码,成功输入后即可连接成功. 但是这样每一次都要输入面码,我们可以编写一个shell脚本,类似于:conn_vps.sh这样的文件

Windows Mobile Gprs连接与数据传输

此模块分两部分完成,传输数据用socket ,要使用socket在ppc上进行数据传输,就要谁让ppc自动连接gprs .其中套接字和gprs链接分别进行说明.   一 ,应用程序在进行其它所需的Windows Sockets API调用需要进行一次成功的WSAStartup()调用,然后就是套接字编程.分为服务器端和客户端.   服务器: 先建立套接字 SOCKET WSASocket( int af, int type, int protocol, LPWSAPROTOCOL_INFO lp

linux系统防止ssh代理空闲断开连接问题

系统:centos 5.9 1.安装expect yum -y install expect 2.配置防ssh代理断开脚本  代码如下 复制代码 vi sshproxy.sh #!/usr/bin/expect -f set timeout 60 spawn /usr/bin/ssh -qTfnCNgD 7070 -g username@serverip expect { "password:" { send "passwdr" } } interact { tim

ssh中hibernate的连接池问题:启动tomcat时就报这个错误,之前都挺好的

问题描述 2014-8-110:29:49org.apache.catalina.core.AprLifecycleListenerinit信息:TheAPRbasedApacheTomcatNativelibrarywhichallowsoptimalperformanceinproductionenvironmentswasnotfoundonthejava.library.path:D:GenuitecCommonbinarycom.sun.java.jdk.win32.x86_1.6.0

在Google 地图上实现做的标记相连接_javascript技巧

这里仅仅是将谷歌地图API的使用方法告诉大家,算是抛砖引玉吧,由于某些原因,谷歌已经远离大家了. 复制代码 代码如下: <!DOCTYPE html> <html> <head> <title>GeoLocation</title> <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> <meta char

十种方法确保云计算的安全性

当IT迁移到云端时,企业需要考虑基本的安全对策,就好比锁好自家的大门一样.下面就介绍10种基础的安全技巧,希望对大家有所帮助. 1.确认现有的基础控制 基础控制是企业安全理念的核心.它们包含了将近60个保护您企业最重要资产的安全控制.它们专注在确保云技术对您业务的应用,以及您的操作是符合安全控制. 2.专注http://www.aliyun.com/zixun/aggregation/13999.html">工作负载 云安全.企业信用直接与工作负载相关.每个工作负载都有独特的考虑,如管理因

瞻博网络助大连银行确保数据中心安全性

2011年4月18日,瞻博网络近日宣布,作为中国发展最快的城市商业银行之一,大连银行为其全新数据中心选择部署瞻博的高性能多层安全解决方案.通过部署瞻博网络ISG系列集成 安全网关,大连银行将在不影响 数据中心网络的整体性能的 前提下,实现 全方位的安全管理和动态安全策略模式.大连银行目前在全国148家银行当中成长排名第八,并在北京.上海.天津.成都.沈阳.营口.重庆.丹东等大城市开设了8家分行以及100多个营业机构.大连银行建设这个新数据中心是为了通过扩容,来满足其交易和服务的快速增长.这个新数