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?

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:pass@example.com: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:


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 .


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


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/


-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


verwandter Thread, der mir geholfen hat: groups.google.com/forum/#!topic/comp.security.ssh/_55TdDdUTCw
Quamis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.