我昨天的帖子:https://*.com/questions/14296006/phpseclib-sftp-port-number
好的,昨天我开始用php学习SSH / SFTP.我搜索了一堆论坛帖子,并推测我需要下载phpseclib.
相对较新的php因此从php5开始我不知道以前的php4不使用__constructor,因此上面的问题/帖子.
回答是相互矛盾的,然而对于原始问题而言有点偏离主题却让我想到了一个我觉得在继续之前需要回答的问题:
哪个更好用,ssh2 pecl扩展OR phpseclib?
这个问题:phpseclib vs libssh2是一样的但是现在我觉得有点过时,正如2010年11月5日17:37所说的那样
解决方法:
我说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签名密钥
交互式shell.
我们试着在远程系统上做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的速度是其两倍多.