3

昨日からの私の投稿:https ://stackoverflow.com/questions/14296006/phpseclib-sftp-port-number

さて、昨日、phpを使用したSSH/SFTPについて学び始めました。たくさんのフォーラム投稿を検索し、phpseclibをダウンロードする必要があると推測しました。

phpに比較的慣れていないため、php5から始めて、以前のphp4で__constructorが使用されていないことに気づいていなかったため、上記の質問/投稿を行いました。

回答は矛盾していましたが、元のQのトピックから少し外れているため、続行する前に回答する必要があると感じる質問が表示されました。

ssh2 pecl拡張機能phpseclibのどちらを使用するのが良いですか?

この質問:phpseclibとlibssh2は同じですが、2010年11月5日の17:37に尋ねられたように、今は少し時代遅れに感じています。

4

1 に答える 1

18

私は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 倍以上高速です。

于 2013-01-13T17:04:43.980 に答える