草庐IT

phpseclib 或 ssh2 pecl 扩展

coder 2024-04-22 原文

我昨天的帖子: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 所问

最佳答案

我说的是 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 生成您的 key ,祝您在转换它们时好运。

使用 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 格式的 key 到 PuTTY key ,再到 XML 签名 key

交互式外壳。

让我们尝试在远程系统上执行 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 秒。

php安全库:

<?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 的速度是原来的两倍多。

关于phpseclib 或 ssh2 pecl 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14304234/

有关phpseclib 或 ssh2 pecl 扩展的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  3. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

    我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

  4. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  5. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

  6. ruby - 扩展类和实例 - 2

    这个问题有两个部分。在RubyProgrammingLanguage一书中,有一个使用模块扩展字符串对象和类的示例(第8.1.1节)。第一个问题。为什么如果您使用新方法扩展类,然后创建该类的对象/实例,则无法访问该方法?irb(main):001:0>moduleGreeter;defciao;"Ciao!";end;end=>nilirb(main):002:0>String.extend(Greeter)=>Stringirb(main):003:0>String.ciao=>"Ciao!"irb(main):004:0>x="foobar"=>"foobar"irb(main):

  7. ruby - 使用 ruby​​ gem net-ssh-multi 同时在多个服务器上执行 sudo 命令 - 2

    在previousquestion中我想出了如何在多个服务器上启动经过密码验证的sshsession来运行单个命令。现在我需要能够执行“sudo”命令。问题是,net-ssh-multi没有分配sudo需要运行的伪终端(pty),导致以下错误:[127.0.0.1:stderr]sudo:sorry,youmusthaveattytorunsudo根据documentation,可以通过调用channel对象的方法来分配伪终端,但是,以下代码不起作用:它会生成上面的“notty”错误:require'net/ssh'require'net/ssh/multi'Net::SSH::Mul

  8. ruby - 动态扩展现有方法或覆盖 ruby​​ 中的发送方法 - 2

    假设我们有A、B、C类。Adefself.inherited(sub)#metaprogramminggoeshere#takeclassthathasjustinheritedclassA#andforfooclassesinjectprepare_foo()as#firstlineofmethodthenrunrestofthecodeenddefprepare_foo#=>prepare_foo()neededhere#somecodeendendBprepare_foo()neededhere#somecodeendend如您所见,我正在尝试将foo_prepare()调用注入

  9. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  10. ruby-on-rails - 如何扩展 Ruby Test::Unit 断言以包含 assert_false? - 2

    显然在Test::Unit中没有assert_false。您将如何通过扩展断言并添加文件config/initializers/assertions_helper.rb来添加它?这是最好的方法吗?我不想修改test/unit/assertions.rb。顺便说一句,我不认为这是多余的。我使用的是assert_equalfalse,something_to_evaluate。这种方法的问题是很容易意外使用assertfalse,something_to_evaluate。这将始终失败,不会引发错误或警告,并且会在测试中引入错误。 最佳答案

随机推荐