私は記事を何度も読みましたが、自分が持っているものに役立つ「解決策」を見つけることができません。
Phpスクリプトを使用してSFTP経由でファイルをアップロードしようとしています。 CyberDuckを使用して正常に接続しましたが、これをプログラムで行う必要があります。
CyberDuckで使用したベンダーの.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がウェブホストにインストールされていることを確認できます。
あなたが提供できるどんな助けにも感謝します。
質問はかなり古いですが、まったく同じ答えを探していたので、ここに何とか集めました。
.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
これでprivatekey.pem
、 phpseclib を使用して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機能リスト にアクセスしてください。
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);
に変更することをお勧めします。
ありがとうございました。