phpseclib或ssh2 pecl扩展名

时间:2013-01-13 14:05:35

标签: php libssh2 phpseclib

我昨天的帖子:https://stackoverflow.com/questions/14296006/phpseclib-sftp-port-number

好的,昨天我开始用php学习SSH / SFTP。我搜索了一堆论坛帖子,并推测我需要下载phpseclib。

相对较新的php因此从php5开始我不知道以前的php4不使用__constructor,因此上面的问题/帖子。

这些回复是相互矛盾的,然而对原始问题有点偏离主题却让我想到了一个我觉得在继续之前需要回答的问题:

哪个更好用, ssh2 pecl扩展 phpseclib

这个问题:phpseclib vs libssh2是一样的,但我现在感觉有点过时,就像2010年11月5日17:37时所问的那样

1 个答案:

答案 0 :(得分:17)

我说phpseclib。就个人而言,我认为你可以通过phpseclib获得更好的支持,并且API更好,但也有更少的主观原因:

更便携。

我试图在Ubuntu 12.04上安装libssh2-php,而“sudo apt-get install libssh2-php”对我来说不起作用。即使它确实可能不会得到最新版本。所以我不得不自己编译libssh2和PECL扩展,这总是很麻烦,而不是许多管理员愿意做的事情。

即使你愿意编译东西,让我们说你的硬盘驱动器出现故障,你必须重建服务器。如果你愿意编译libssh2,你可能也会编译其他的东西。这意味着您不能只启动另一个盒子 - 您必须记住您在旧盒子上所做的所有更改并重新应用它们。如果你不记得它们怎么办?或者,如果其中一个尚未更新以使用另一个版本的最新版本呢?

相比之下,phpseclib不需要PHP以外的任何东西。如果它们可用,它将使用mcrypt,gmp,bcmath或openssl,但如果它们不可用,那也没关系。它甚至不需要PHP5,虽然它肯定支持它。

更好的公钥支持。

如何使用libssh2:

<?php
$ssh = ssh2_connect('domain.tld');
ssh2_auth_pubkey_file($ssh, 'username', '/home/ubuntu/pubkey', '/home/ubuntu/privkey'/*, 'password'*/);

$stream = ssh2_exec($ssh, 'ls -la');
echo stream_get_contents($stream);

两者都必须是正确的格式。如果您没有使用ssh-keygen来生成密钥,那么转换它们会很好。

使用phpseclib:

<?php
include('Net/SSH2.php');
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('...');

$ssh = new Net_SSH2('domain.tld');
$ssh->login('username', $rsa);
//$ssh->setPassword('password');

echo $ssh->exec('ls -la');

暂时忽略API有一些明确的方法,phpseclib在这里出现:

  • phpseclib接受字符串 - 而不是文件路径。如果你想做一个文件,你可以做file_get_contents。
  • phpseclib不需要公钥。大多数私钥格式都嵌入了公钥。如果他们不这样做...... phpseclib也支持。
  • phpseclib几乎可以采用任何标准格式,从PKCS#1格式化密钥到PuTTY密钥,再到XML签名密钥

互动外壳。

让我们尝试在远程系统上做sudo。

使用phpseclib: http://phpseclib.sourceforge.net/ssh/examples.html#password,sudo

使用libssh2?我没有线索。我最好的猜测(不起作用):

<?php
$ssh = ssh2_connect('domain.tld'); 
ssh2_auth_password($ssh, 'username', 'password');

$shell = ssh2_shell($ssh);
echo fread($shell, 1024*1024);
fwrite($shell, "sudo ls -la\n");
$output = fread($shell, 1024*1024);
echo $output;
if (preg_match('#[pP]assword[^:]*:#', $output)) {
    fwrite($shell, "password\n");
}
echo fread($shell, 1024*1024);

我无法与libssh2一起工作,但它与phpseclib一起工作正常:

http://phpseclib.sourceforge.net/ssh/examples.html#password,top

诊断问题

为什么没有top或sudo工作?在phpseclib上你可以得到日志:

http://phpseclib.sourceforge.net/ssh/examples.html#password,oneoff,logging

他们看起来像这样:

http://phpseclib.sourceforge.net/ssh/log.txt

您也可以print_r($ssh->getErrors())echo $ssh->getLastError()

更改目录

我在http://php.net/ssh2看不到任何cd或chdir函数。然而,phpseclib有它 - Net_SFTP::chdir(...)

<强>速度

libssh2:

<?php
$ssh = ssh2_connect('domain.tld');
ssh2_auth_password($ssh, 'username', 'password');

$start = microtime(true);
$sftp = ssh2_sftp($ssh);

$fp = fopen('ssh2.sftp://'.$sftp.'/home/username/1mb', 'w');

fwrite($fp, str_repeat('a', 1024 * 1024));
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds";

25.71秒。

phpseclib:

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('domain.tld');
$sftp->login('username', 'password');

$start = microtime(true);
$sftp->put('1mb', str_repeat('a', 1024*1024));
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds";

11.70秒。

因此,phpseclib的速度是其两倍多。