расширение phpseclib или ssh2 pecl


Мой вчерашний пост: https://stackoverflow.com/questions/14296006/phpseclib-sftp-port-number

Хорошо, итак, вчера я начал изучать SSH/SFTP с помощью php. Я просмотрел кучу сообщений на форуме и предположил, что мне нужно загрузить phpseclib.

Будучи относительно новичком в php, таким образом, начиная с php5, я не знал о том, что в предыдущем php4 не использовался конструктор __, отсюда и вышеприведенный вопрос/сообщение.

Ответы были противоречивыми и немного не такими тема к исходному вопросу, однако, привела меня к вопросу, на который, как я чувствую, необходимо ответить, прежде чем я продолжу:

Что лучше использовать, расширение ssh2 pecl ИЛИ phpseclib?

Этот вопрос: phpseclib vs libssh2 тот же, но я чувствую себя немного устаревшим, как было задано 5 ноября 10 в 17:37

Author: Community, 2013-01-13

1 answers

Я говорю phpseclib. Лично я думаю, что вы получаете лучшую поддержку с phpseclib и что API лучше, но есть и менее субъективные причины:

Более портативный.

Я попытался установить libssh2-php в Ubuntu 12.04, и "sudo apt-get установить 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, судо,

С 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);

Я также не могу заставить top работать с libssh2, но он отлично работает с phpseclib:

Http://phpseclib.sourceforge.net/ssh/examples.html#password, сверху,

Диагностика проблем

Почему не сработали top или sudo? На phpseclib вы можете получить журналы:

Http://phpseclib.sourceforge.net/ssh/examples.html#password,один выход, ведение журнала,

Они выглядят так:

Http://phpseclib.sourceforge.net/ssh/log.txt

Вы также можете сделать print_r($ssh->getErrors()) или echo $ssh->getLastError().

Изменение Каталоги

Я не вижу никаких функций cd или chdir в http://php.net/ssh2 . 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 более чем в два раза быстрее.

 17
Author: , 2013-03-01 23:11:21