簡體   English   中英

phpseclib或ssh2 pecl擴展名

[英]phpseclib or ssh2 pecl extension

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

好的,昨天我開始用php學習SSH / SFTP。 我搜索了一堆論壇帖子,並推測我需要下載phpseclib。

相對較新的php因此從php5開始我不知道以前的php4不使用__constructor,因此上面的問題/帖子。

回答是相互矛盾的,然而對於原始問題而言有點偏離主題卻讓我想到了一個我覺得在繼續之前需要回答的問題:

哪個更好用, ssh2 pecl擴展 OR 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來生成密鑰,那么轉換它們會有好運。

使用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簽名密鑰

交互式shell。

我們試着在遠程系統上做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秒

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的速度是其兩倍多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM