web-dev-qa-db-ja.com

SFTPを使用したファイルのアップロード

Ftpを介してファイルを正常にアップロードしましたが、SFTPを介して行う必要があります。リモートサーバーに正常に接続し、ファイルを作成して書き込みはできますが、既存のファイルをローカルサーバーからリモートサーバーにアップロードできません。 ftp_putはsftp接続で起動しませんか?

私のコードはファイルを書くために使用されました:

//Send file via sftp to server

$strServer = "*****";
$strServerPort = "****";
$strServerUsername = "*****";
$strServerPassword = "*****";
$csv_filename = "Test_File.csv";

//connect to server
$resConnection = ssh2_connect($strServer, $strServerPort);

if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword)){
    //Initialize SFTP subsystem

    echo "connected";
    $resSFTP = ssh2_sftp($resConnection);    

    $resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w');
    fwrite($resFile, "Testing");
    fclose($resFile);                   

}else{
    echo "Unable to authenticate on server";
}

誰かがローカルファイルを取得し、上記のような方法でsftpでアップロードすることに成功しましたか?例をいただければ幸いです。

ありがとう

33
Marc

上記の方法(sftpを含む)では、 stream_copy_to_stream を使用できます。

$resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w');
$srcFile = fopen("/home/myusername/".$csv_filename, 'r');
$writtenBytes = stream_copy_to_stream($srcFile, $resFile);
fclose($resFile);
fclose($srcFile);

ssh2_scp_send を使用して試すこともできます

44

個人的に、私はPECL SSH2拡張を避けることを好みます。私の好ましいアプローチには、 phpseclib、純粋なPHP SFTP実装 。などが含まれます。

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

$sftp->put('remote.ext', 'local.ext', NET_SFTP_LOCAL_FILE);
?>

PECL拡張機能よりもphpseclibで気に入っている大きな点の1つは、移植性があることです。たぶん、PECL拡張機能はLinuxのあるバージョンで動作しますが、別のバージョンでは動作しません。また、共有ホストではほとんどインストールされないため、ほとんど機能しません。

phpseclibも、驚くべきことに faster です。また、ファイルがアップロードされたことを確認する必要がある場合は、phpseclibの組み込みログを証拠として使用できます。

24
neubert

私にとってこれはうまくいきました:

$connection = ssh2_connect($server, $serverPort);

if(ssh2_auth_password($connection, $serverUser, $serverPassword)){
    echo "connected\n";
    ssh2_scp_send($connection, "/path/to/local/".$file, "/path/to/remote/".$file);
    echo "done\n";
} else {
    echo "connection failed\n";
}

ただし、最初にlibssh2-phpをインストールする必要がありました。

Sudo apt-get install libssh2-php
12
Matthias

phpseclibの単純なドキュメントの場合、純粋なPHP SFTP実装)。

次のリンクを参照してください:

PHPを使用してSFTP経由でファイルをアップロードする

フォルダー構造:

Main Folder->
    my-files(Contain File Which Transfer To Remote Server)
    phpseclib0.3.0
    sftp.php
4
Sandesh

さらに入力を共有すると、Linux(64ビット)からWindows(32ビット)にファイルをコピーするときにssh2_scp_sendが正しくコピーされない(バイトが異なる)ことがわかり、sftpルーチンが完全に機能しました。 Windowsでstfpを使用している場合、C:\ to\pathの場合のパスは、WindowsボックスでSSHにCygwinが使用されている場合、ssh2.sftp:// {$ resSFTP}/cygdrive/c/to/pathとして配置する必要があります。 。

1
pradosh nair