web-dev-qa-db-ja.com

PHPおよび秘密キーを使用してSFTPに接続します

私は記事を何度も読みましたが、自分が持っているものに役立つ「解決策」を見つけることができません。

Phpスクリプトを使用してSFTP経由でファイルをアップロードしようとしています。 Cyber​​Duckを使用して正常に接続しましたが、これをプログラムで行う必要があります。

Cyber​​Duckで使用したベンダーの.PPKファイルがあります。ユーザー名を持っています。ホスト名があります。 PPKファイルを開くと、いくつかのPublic Lines、Private Lines、Private-MACが表示されます。

とにかく、私が持っている情報を使用して必要なことを行うためにサーバーにアクセスできますか?

これが私が遊んでいたコードです:

<?php if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
?>
<?php
$conn = ssh2_connect('hostname.com', 22);
echo $conn;
ssh2_auth_pubkey_file($conn,'USERNAME','/var/www/html/FILENAME.PPK');

// send a file
ssh2_scp_send($conn, '/var/www/html/FILETOSEND.TXT', 'FILETOSEND.TXT', 0644);
?>

エラーは発生しませんが、ファイルがサーバーに表示されません。 SSH2がウェブホストにインストールされていることを確認できます。

あなたが提供できるどんな助けにも感謝します。

14
Joey Martin

質問はかなり古いですが、まったく同じ答えを探していたので、ここに何とか集めました。

最初:キー形式を.ppkから.pemに変更します

.pkkキーはPuTTY形式の秘密キーです。

これを.pem形式に変更する場合は、次のコマンドを使用してPuTTYツールをインストールする必要があります。

Sudo apt install PuTTY-tools

(Macの場合、自作でPuTTYパッケージをインストールします。Windowsの場合、私にはわかりません。)

次に、キーの形式を変更できます。

puttygen privatekey.ppk -O private-openssh -o privatekey.pem

その秘密鍵から公開鍵を抽出したい場合に備えて(残りの回答は必要ありませんが、念のため)非常に簡単です。

openssl rsa -in privatekey.pem -pubout > publickey.pub

2番目:sFTPでログインします

これでprivatekey.pemphpseclib を使用してSFTP経由で接続できます。まず、Composerを使用してphpseclibをインストールします。

composer require phpseclib/phpseclib

次にPHPで:

require "vendor/autoload.php";

use phpseclib\Crypt\RSA;
use phpseclib\Net\SFTP;

$sftp = new SFTP('sftp.server.com');

// create new RSA key
$privateKey = new RSA();

// in case that key has a password
$privateKey->setPassword('private key password');

// load the private key
$privateKey->loadKey(file_get_contents('/path/to/privatekey.pem'));

// login via sftp
if (!$sftp->login('username', $privateKey)) {
    throw new Exception('sFTP login failed');
}

// now you can list what's in here
$filesAndFolders = $sftp->nlist();

// you can change directory
$sftp->chdir('coolstuffdir');

// get a file
$sftp->get('remoteFile', 'localFile');

// create a remote new file with defined content
$sftp->put('newfile.txt', 'new file content');

// put a local file
$sftp->put('remote.txt', 'local.txt', NET_SFTP_LOCAL_FILE);

詳細については、 phpseclib sFTP機能リスト にアクセスしてください。

21

stéphaneLe Solliecが回答したコードサンプルに基づいて調査結果を共有する場合は、phpseclibのバージョンを確認する必要があります。 composer(windows))でphpseclibのバージョンを確認するには、コマンドプロンプト_composer require phpseclib/phpseclib_を入力するだけで、インストールされている場合は結果にバージ​​ョンが表示されます。

Phpseclibのバージョンが1.0の場合、行$sftp = new SFTP('sftp.server.com');$sftp = new NET_SFTP('sftp.server.com');に変更することをお勧めします。

Phpseclibのバージョンが2.0の場合、行$sftp->put('remote.txt', 'local.txt', NET_SFTP_LOCAL_FILE);$sftp->put('remote.txt', 'local.txt', SFTP::SOURCE_LOCAL_FILE);に変更することをお勧めします。

ありがとうございました。

3
Aslam Faisal