web-dev-qa-db-fra.com

Téléchargement de fichiers avec SFTP

J'ai réussi à télécharger des fichiers via ftp, mais je dois maintenant le faire via SFTP. Je peux me connecter avec succès au serveur distant, créer un fichier et y écrire, mais je ne parviens pas à télécharger un fichier existant de mon serveur local vers le serveur distant. Ftp_put ne se déclenche-t-il pas avec une connexion sftp?

Mon code utilisé pour écrire un fichier:

//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";
}

Quelqu'un a-t-il réussi à récupérer un fichier local et à le télécharger via une méthode telle que ci-dessus avec sftp? Un exemple serait grandement apprécié.

Merci

33
Marc

Avec la méthode ci-dessus (impliquant sftp), vous pouvez utiliser 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);

Vous pouvez également essayer d'utiliser ssh2_scp_send

44
dev-null-dweller

Personnellement, je préfère éviter l'extension PECL SSH2. Mon approche préférée implique phpseclib, une pure PHP implémentation SFTP . Eg.

<?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);
?>

L'une des grandes choses que j'aime avec phpseclib par rapport à l'extension PECL, c'est qu'il est portable. Peut-être que l'extension PECL fonctionne sur une version de Linux mais pas sur une autre. Et sur les hôtes partagés, cela ne fonctionne presque jamais car il n'est presque jamais installé.

phpseclib est aussi, de façon surprenante, plus rapide . Et si vous avez besoin de confirmation que le fichier téléchargé, vous pouvez utiliser la journalisation intégrée de phpseclib comme preuve.

24
neubert

Pour moi, cela a fonctionné:

$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";
}

J'ai d'abord dû installer libssh2-php:

Sudo apt-get install libssh2-php
12
Matthias

Pour un document simple de phpseclib, une pure PHP implémentation SFTP ).

Reportez-vous au lien suivant:

Téléchargement de fichiers via SFTP en utilisant PHP

Structure des dossiers:

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

En partageant d'autres entrées, ssh2_scp_send ne copiait pas correctement (les octets étaient différents) lors de la copie du fichier de Linux (64 bits) vers Windows (32 bits), la routine sftp fonctionnait parfaitement. Lors de l'utilisation de Windows avec stfp, le chemin d'accès en cas de C:\to\path doit être mis en tant que ssh2.sftp: // {$ resSFTP}/cygdrive/c/to/path si Cygwin est utilisé pour SSH sur la boîte Windows .

1
pradosh nair