Wie SFTP mit PHP?

80

Ich bin auf viele PHP-Skripte für Web-FTP-Clients gestoßen. Ich muss einen SFTP-Client als Webanwendung in PHP implementieren. Unterstützt PHP SFTP? Ich konnte keine Proben finden. Kann mir jemand dabei helfen?

Indranama
quelle

Antworten:

71

PHP verfügt über ssh2-Stream-Wrapper (standardmäßig deaktiviert), sodass Sie SFTP-Verbindungen mit jeder Funktion verwenden können, die Stream-Wrapper unterstützt, indem Sie das ssh2.sftp://Protokoll verwenden, z

file_get_contents('ssh2.sftp://user:[email protected]:22/path/to/filename');

oder - wenn Sie auch die Erweiterung ssh2 verwenden

$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

Siehe http://php.net/manual/en/wrappers.ssh2.php

Nebenbei bemerkt, es gibt auch schon eine ganze Reihe von Fragen zu diesem Thema:

Gordon
quelle
file_get_contents und file_put_contents funktionieren beide hervorragend. Ich wusste nie, dass sie mit SFTP arbeiten und es ist so viel einfacher als die Verwendung des eingebauten SFTP-Materials. Vielen Dank!
Jbrahy
3
Auch wenn Sie file_get_contents () verwenden, benötigen Sie die Erweiterung ssh2 (afaik).
StanE
Debian / Ubuntu-Pakete: apt install libssh2-1-dev php-ssh2
Ajay Singh
39

Die ssh2-Funktionen sind nicht sehr gut. Schwer zu verwenden und noch schwieriger zu installieren, garantiert die Verwendung, dass Ihr Code keine Portabilität aufweist. Meine Empfehlung wäre, phpseclib zu verwenden , eine reine PHP-SFTP-Implementierung .

Calgaryhit
quelle
unterstützt nur SFTP v3
Blacksonic
3
@indranama Würden Sie dies als die richtige Antwort markieren, damit zukünftige Benutzer keine Kommentare lesen müssen, um herauszufinden, welche für Sie am besten funktioniert?
Fi Horan
28

Ich fand, dass "phpseclib" Ihnen dabei helfen sollte (SFTP und viele weitere Funktionen). http://phpseclib.sourceforge.net/

Um die Datei auf den Server zu stellen, rufen Sie einfach auf (Codebeispiel von http://phpseclib.sourceforge.net/sftp/examples.html#put ).

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

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

// puts a three-byte file named filename.remote on the SFTP server
$sftp->put('filename.remote', 'xxx');
// puts an x-byte file named filename.remote on the SFTP server,
// where x is the size of filename.local
$sftp->put('filename.remote', 'filename.local', NET_SFTP_LOCAL_FILE);
Prut Udomwattawee
quelle
2
Das Git Repo ist hier: github.com/phpseclib/phpseclib/tree/master/phpseclib
Relipse
1
Können Sie Ihre Antwort auf phpseclib 2.0 aktualisieren? Ihr aktuelles Beispiel ist veraltet.
Martin Prikryl
2

Flysystem installieren:

composer require league/flysystem-sftp

Dann:

use League\Flysystem\Filesystem;
use League\Flysystem\Sftp\SftpAdapter;

$filesystem = new Filesystem(new SftpAdapter([
    'host' => 'example.com',
    'port' => 22,
    'username' => 'username',
    'password' => 'password',
    'privateKey' => 'path/to/or/contents/of/privatekey',
    'root' => '/path/to/root',
    'timeout' => 10,
]));
$filesystem->listFiles($path); // get file lists
$filesystem->read($path_to_file); // grab file
$filesystem->put($path); // upload file
....

Lesen:

https://flysystem.thephpleague.com/v1/docs/

Kochsalzlösung
quelle
-1

Ich habe ein vollständiges Cop-out durchgeführt und eine Klasse geschrieben, die eine Batch-Datei erstellt und dann sftpüber einen systemAufruf aufruft . Nicht die schönste (oder schnellste) Möglichkeit, aber es funktioniert für das, was ich brauche, und es war keine Installation zusätzlicher Bibliotheken oder Erweiterungen in PHP erforderlich.

Könnte der richtige Weg sein, wenn Sie die ssh2Erweiterungen nicht verwenden möchten

DaveyBoy
quelle
verwandter Thread, der mir geholfen hat: groups.google.com/forum/#!topic/comp.security.ssh/_55TdDdUTCw
Quamis