我昨天的帖子:https://stackoverflow.com/questions/14296006/phpseclib-sftp-port-number
好的,所以昨天我开始学习使用php的ssh/sftp。我搜索了一堆论坛帖子,推测我需要下载phpseclib。
由于PHP相对较新,因此从PHP5开始,我不知道以前PHP4不使用α构造函数,因此,上面的问题/帖子。
回答是相互矛盾的,但与最初的问题有点脱节,这让我在继续之前遇到了一个我觉得需要回答的问题:
哪种更适合使用,ssh2 pecl extension还是phpseclib?
这个问题:phpseclib vs libssh2是一样的,但是我现在觉得有点过时了,就像11月5日17:37问的那样。
最佳答案
我说的是phpseclib。就我个人而言,我认为您得到了phpseclib更好的支持,而且api更好,但主观原因也更少:
更便携。
我试图在Ubuntu12.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接受字符串,而不是文件路径。如果你想做一个文件,你可以做FielyGETX内容。
phpseclib不需要公钥。大多数私钥格式都嵌入了公钥。如果他们不…phpseclib也支持这一点。
PHPCSELIB可以采取任何标准化格式,从PKCSα1格式化的密钥,到腻子密钥,到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);
我不能让顶部与LIbsH2一起工作,但它与PHPSELIB很好:
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(...)
速度
LIPSHS2:
<?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的速度是前者的两倍多。