Расширение phpseclib или ssh2 pecl
Мой вчерашний пост: https://stackru.com/questions/14296006/phpseclib-sftp-port-number
Итак, вчера я начал изучать SSH / SFTP с помощью php. Я искал кучу сообщений на форуме и предположил, что мне нужно скачать phpseclib.
Будучи относительно новым для php, таким образом, начиная с php5, я не знал о том, что предыдущий php4 не использовал конструктор __, следовательно, вышеупомянутый вопрос / пост.
Ответы были противоречивы, и, тем не менее, немного не по теме к первоначальному вопросу Q поставил меня на вопрос, на который я чувствую необходимость ответить, прежде чем я продолжу:
Что лучше использовать, расширение ssh2 pecl ИЛИ phpseclib?
Этот вопрос: phpseclib vs libssh2 такой же, но я чувствую себя немного устаревшим, как и было 5 ноября 2010 года в 17:37.
1 ответ
Я говорю 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');
На данный момент, игнорируя API, есть несколько четких способов, которыми phpseclib выходит на первое место здесь:
- phpseclib принимает строки, а не пути к файлам. Если вы хотите сделать файл, вы можете сделать file_get_contents.
- phpseclib не требует открытого ключа. Большинство форматов закрытых ключей имеют встроенный открытый ключ. И если они не... phpseclib это тоже поддерживает.
- phpseclib может принимать практически любой стандартизированный формат, от форматированных ключей PKCS#1 до ключей PuTTY и ключей подписи XML
Интерактивная оболочка.
Давайте попробуем сделать sudo на удаленной системе.
С помощью phpseclib: http://phpseclib.sourceforge.net/ssh/examples.html,
С 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,
Диагностика проблем
Почему не работает top или sudo? На phpseclib вы можете получить логи:
http://phpseclib.sourceforge.net/ssh/examples.html,
Они выглядят так:
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 более чем в два раза быстрее.