【问题标题】:phpseclib or ssh2 pecl extensionphpseclib 或 ssh2 pecl 扩展
【发布时间】:2013-01-13 14:05:35
【问题描述】:

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

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

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

回答是相互矛盾的,并且与原始 Q 有点偏离主题,但是让我想到了一个我觉得在继续之前需要回答的问题:

ssh2 pecl 扩展 OR phpseclib哪个更好用?

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

【问题讨论】:

    标签: php libssh2 phpseclib


    【解决方案1】:

    我说的是 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-&gt;getErrors())echo $ssh-&gt;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 的速度是原来的两倍多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 2020-10-22
      • 2011-10-01
      • 2012-04-10
      • 1970-01-01
      • 2023-03-13
      • 2018-01-29
      相关资源
      最近更新 更多