我昨天的帖子: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 有几个明显的方法在这里脱颖而出:
交互式外壳。
让我们尝试在远程系统上执行 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/
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我尝试使用不同的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
我想这样组织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中)将被完全忽略。
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
这个问题有两个部分。在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):
在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
假设我们有A、B、C类。Adefself.inherited(sub)#metaprogramminggoeshere#takeclassthathasjustinheritedclassA#andforfooclassesinjectprepare_foo()as#firstlineofmethodthenrunrestofthecodeenddefprepare_foo#=>prepare_foo()neededhere#somecodeendendBprepare_foo()neededhere#somecodeendend如您所见,我正在尝试将foo_prepare()调用注入
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网络安装好
显然在Test::Unit中没有assert_false。您将如何通过扩展断言并添加文件config/initializers/assertions_helper.rb来添加它?这是最好的方法吗?我不想修改test/unit/assertions.rb。顺便说一句,我不认为这是多余的。我使用的是assert_equalfalse,something_to_evaluate。这种方法的问题是很容易意外使用assertfalse,something_to_evaluate。这将始终失败,不会引发错误或警告,并且会在测试中引入错误。 最佳答案