gpt4 book ai didi

phpseclib 或 ssh2 pecl 扩展

转载 作者:可可西里 更新时间:2023-10-31 23:54:17 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com