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:
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:
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 .
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);
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:
Ich habe ein vollständiges Cop-out durchgeführt und eine Klasse geschrieben, die eine Batch-Datei erstellt und dann sftp
über einen system
Aufruf 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 ssh2
Erweiterungen nicht verwenden möchten