私はphpseclibと言います。個人的には、phpseclib でより良いサポートが得られ、API もより優れていると思いますが、主観的な理由も少なくなります。
よりポータブル。
Ubuntu 12.04 に libssh2-php をインストールしようとしましたが、「sudo apt-get install libssh2-php」が機能しませんでした。たとえそれができたとしても、最新バージョンを取得できない可能性があります。そのため、libssh2 と PECL 拡張機能を自分でコンパイルする必要がありましたが、これは常に面倒であり、多くの管理者が喜んで行うものではありません。
また、何かをコンパイルする意思がある場合でも、ハード ドライブに障害が発生し、サーバーを再構築する必要があるとしましょう。libssh2 をコンパイルしたい場合は、おそらく他のものもコンパイルしているでしょう。つまり、別のボックスを起動することはできません。古いボックスで行ったすべての変更を記憶して、それらを再適用する必要があります。そして、あなたがそれらを覚えていない場合はどうなりますか?または、そのうちの 1 つが別の最新バージョンで動作するように更新されていない場合はどうなりますか?
対照的に、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,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 でも top を動作させることはできませんが、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 は 2 倍以上高速です。