想要在php程序中执行scp拷贝,之前想用system函数
system("scp /from/path/file user@des_host:/to/path/file"),但是始终失败,
但在命令行下直接执行scp /from/path/file user@des_host:/to/path/file 是OK的,
至今找不到原因,如果哪位知道原因,麻烦告知一下。
既然这个方法不行,就换吧,不能一棵树吊死啊。google来,google去,发现原来php里有
现成的函数:
http://us2.php.net/manual/en/book.ssh2.php
只是要装几个包。
方法如下:
http://us2.php.net/manual/en/ssh2.installation.php
首先要装OpenSSL。
因为自己OpenSSL已经装过了,所以直接第二步,下个libssh2直接安装。
我下的是libssh2-0.18,这个都没什么问题。
第三步要用pear安装php的ssh扩展,如果没装pear可以直接下载源码,自己编译。
http://pecl.php.net/package/ssh2
我下的ssh2-0.10.tgz,解压,编译:
tar -zxvf ssh2-0.10.tgz
【注意源码有些问题,要修改。
把480行
#if LIBSSH2_APINO < 200412301450
…
#else
改为
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
…
#else
把1216行:
#if (LIBSSH2_APINO > 200503221619)
改为
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) ||
(defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0×001000)
】
phpize && ./configure --with-ssh2 && make
编译好,到build文件夹中把ssh2.so cp 到自己的php extension dir中
在php.ini中加入 extension=ssh2.so
重启apache
ok
1. 安装libssh2库
yum install libssh2 libssh2-devel
2. 下载PECL的SSH2支持代码包(beta版本有bug,需patch)
wget http://pecl.php.net/get/ssh2-0.10.tgz
tar xvzf ssh2-0.10.tgz
cd ssh2-0.10
vi ssh2.c
ssh2.c patch方法如下:
LINE 480:
search and change following line:
#if LIBSSH2_APINO < 200412301450
...
#else
to:
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
...
#else
LINE 1216:
search and change following line:
#if (LIBSSH2_APINO > 200503221619)
to:
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) || (defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0x001000)
3. 开始编译
phpize
./configure --with-ssh2
make
4. 加入ssh2扩展到php
cp modules/ssh2.so /usr/lib/php/modules
注意64位系统上是 /usr/lib64
vi php.ini
加入extension=ssh2.so
5. 确认是否已加载
php -i|grep ssh2
结果应该如下所示
# php -i|grep ssh2
Registered PHP Streams => php, file, http, ftp, compress.bzip2, compress.zlib, https, ftps, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp
ssh2
libssh2 version => 0.17
banner => SSH-2.0-libssh2_0.17
PWD => /root/ssh2-0.10
_SERVER["PWD"] => /root/ssh2-0.10
_ENV["PWD"] => /root/ssh2-0.10
参看:http://blog.sina.com.cn/s/blog_5ca0ed610100az0t.html
http://www.blabla.cn/z/php_cn/ref.ssh2.html
小提示:
有时服务器忙碌,或者一个连接出错,缓冲区没有数据,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
文章来自学IT网:http://www.xueit.com/php/show-5844-2.aspx
system("scp /from/path/file user@des_host:/to/path/file"),但是始终失败,
但在命令行下直接执行scp /from/path/file user@des_host:/to/path/file 是OK的,
至今找不到原因,如果哪位知道原因,麻烦告知一下。
既然这个方法不行,就换吧,不能一棵树吊死啊。google来,google去,发现原来php里有
现成的函数:
http://us2.php.net/manual/en/book.ssh2.php
只是要装几个包。
方法如下:
http://us2.php.net/manual/en/ssh2.installation.php
首先要装OpenSSL。
因为自己OpenSSL已经装过了,所以直接第二步,下个libssh2直接安装。
我下的是libssh2-0.18,这个都没什么问题。
第三步要用pear安装php的ssh扩展,如果没装pear可以直接下载源码,自己编译。
http://pecl.php.net/package/ssh2
我下的ssh2-0.10.tgz,解压,编译:
tar -zxvf ssh2-0.10.tgz
【注意源码有些问题,要修改。
把480行
#if LIBSSH2_APINO < 200412301450
…
#else
改为
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
…
#else
把1216行:
#if (LIBSSH2_APINO > 200503221619)
改为
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) ||
(defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0×001000)
】
phpize && ./configure --with-ssh2 && make
编译好,到build文件夹中把ssh2.so cp 到自己的php extension dir中
在php.ini中加入 extension=ssh2.so
重启apache
ok
1. 安装libssh2库
yum install libssh2 libssh2-devel
2. 下载PECL的SSH2支持代码包(beta版本有bug,需patch)
wget http://pecl.php.net/get/ssh2-0.10.tgz
tar xvzf ssh2-0.10.tgz
cd ssh2-0.10
vi ssh2.c
ssh2.c patch方法如下:
LINE 480:
search and change following line:
#if LIBSSH2_APINO < 200412301450
...
#else
to:
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
...
#else
LINE 1216:
search and change following line:
#if (LIBSSH2_APINO > 200503221619)
to:
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) || (defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0x001000)
3. 开始编译
phpize
./configure --with-ssh2
make
4. 加入ssh2扩展到php
cp modules/ssh2.so /usr/lib/php/modules
注意64位系统上是 /usr/lib64
vi php.ini
加入extension=ssh2.so
5. 确认是否已加载
php -i|grep ssh2
结果应该如下所示
# php -i|grep ssh2
Registered PHP Streams => php, file, http, ftp, compress.bzip2, compress.zlib, https, ftps, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp
ssh2
libssh2 version => 0.17
banner => SSH-2.0-libssh2_0.17
PWD => /root/ssh2-0.10
_SERVER["PWD"] => /root/ssh2-0.10
_ENV["PWD"] => /root/ssh2-0.10
参看:http://blog.sina.com.cn/s/blog_5ca0ed610100az0t.html
http://www.blabla.cn/z/php_cn/ref.ssh2.html
小提示:
有时服务器忙碌,或者一个连接出错,缓冲区没有数据,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
文章来自学IT网:http://www.xueit.com/php/show-5844-2.aspx
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2789/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2010-3-10 19:36
评论列表