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

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

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

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

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

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

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

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

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

Я попытался установить libssh2-php на Ubuntu 12.04 и «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'); в <?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'); в <?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,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 ,

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

Почему не топ или 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() .

Изменение каталогов

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