Frage

Ich bin ein einfaches SFTP-Client in PHP zu schreiben, weil wir die Notwendigkeit, programmatisch Abrufen von Dateien über n Remote-Servern haben. Ich bin mit der PECL SSH2-Erweiterung.

Ich habe gegen einen Straßenblock laufen nach oben, though. Die Dokumentation auf php.net schlägt vor, dass Sie dies tun können:

$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

Allerdings habe ich eine ls Methode, die etwas versucht, ähnlich

public function ls($dir)
{
    $rd = "ssh2.sftp://{$this->sftp}/$dir";
    $handle = opendir($rd);
    if (!is_resource($handle)) {
        throw new SFTPException("Could not open directory.");
    }

    while (false !== ($file = readdir($handle))) {
        if (substr($file, 0, 1) != '.'){
            print $file . "\n";
        }
    }
    closedir($handle);
}

Ich erhalte den folgenden Fehler:

PHP Warning:  opendir(): Unable to open ssh2.sftp://Resource id #5/outgoing on remote host

Das macht durchaus Sinn, denn das ist, was passiert, wenn Sie eine Ressource String gegossen. Ist die Dokumentation nicht in Ordnung? Ich habe versucht, die Ressource mit Host, Benutzernamen ersetzt und Host und das hat nicht funktioniert entweder. Ich weiß, dass der Pfad korrekt ist, weil ich SFTP von der Kommandozeile ausgeführt werden kann und es funktioniert gut.

Hat jemand versucht, die SSH2 extenstion mit SFTP zu benutzen? Bin ich etwas offensichtlich hier fehlt?

UPDATE:

I Setup SFTP auf einem anderen Rechner im Hause und es funktioniert gut. Also muss es etwas über den Server sein, die ich zu, dass zu verbinden versuchen nicht funktioniert.

War es hilfreich?

Lösung

Bei Anschluss an einen SFTP-Server verbinden und Sie müssen (zum Lesen des Inhalts des Ordners zum Beispiel) in die Stammordner verbinden würden Sie den Fehler weiterhin erhalten, wenn nur „/“ als Pfad verwendet wird.

Die Lösung, die ich fand, war der Weg „/./“ zu verwenden, das ist ein gültiger Pfad, die Verweise auf den Stammordner. Dies ist nützlich, wenn der Benutzer Sie Zugriff hat Protokollierung sind nur auf die eigenen Stammordner und kein vollständiger Pfad zur Verfügung.

So ist die Anforderung an den Server, wenn sie versuchen, den Inhalt des Stammordners lesen so etwas wie dies sein sollte:

$rd = "ssh2.sftp://{$this->sftp}/./";

Andere Tipps

Für PHP-Versionen> 5.6.27 Verwendung intval ()

$sftpConnection = ssh2_connect($host);
$sftp = ssh2_sftp($sftpConnection);
$fp = fopen("ssh2.sftp://" . intval($sftp) . $remoteFile, "r");

https://bugs.php.net/bug.php?id=73597

Ich habe ein ähnliches Problem. Ich nehme an, Sie etwas Ähnliches wie dies tun:

    $dir = "ssh2.sftp://{$sftp}{$remote_dir}"; 
    $handle = opendir($dir);

Wenn $remote_dir ist der vollständige Pfad von der Wurzel dann funktioniert open_dir. Wenn $remote_dir nur ‚/‘ oder ‚‘, dann bekomme ich die ‚unfähig‘ Fehler zu öffnen, wie Sie getan haben.

In meinem Fall scheint es ssh im Stammordner verbindet anstelle des ‚Home‘ Verzeichnis wie ftp tut. Sie erwähnten, dass es auf einem anderen Server gearbeitet, so dass ich frage mich, ob es nur ein Config-Problem ist.

Die meisten einfachste Weg, SFTP zu bekommen innerhalb von PHP arbeiten (auch unter Windows) ohne jede Erweiterung etc Installation ist PHPSECLIB: http: //phpseclib.sourceforge.net/ . Das SSH-Material wird in einer PHP-Klasse vollständig umgesetzt werden.

Sie verwenden ist wie folgt:

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

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

echo $sftp->pwd();
?>

Die Dokumentation auf dieser Seite enthält einen Fehler. Werfen Sie einen Blick auf das Beispiel hier statt: http://php.net/ssh2_sftp - was Sie wirklich tun müssen, ist eine spezielle Ressource unter Verwendung SFTP ssh2_sftp vor der Verwendung) (mit fopen () zu öffnen. Und ja, es sieht genauso aus wie das, z.B. „Ressourcen # 24“, wenn in einen String konvertiert ... ein bisschen komisch, aber anscheinend funktioniert es.

Ein weiterer Nachteil ist, dass SFTP im Stammverzeichnis beginnt, anstatt das Home-Verzeichnis des entfernten Benutzers, so dass Ihr Remote-Pfad in der URI sollte immer ein absoluter sein.

Ich hatte gerade das gleiche Problem, aber ich konnte das Problem herauszufinden.

Auf meinem Fall, wenn die Verbindung zum Server wurde ich an die Wurzel des Kontos gehen, und aufgrund von Server-configs war ich nicht in der Lage, dort zu schreiben.

Ich habe mit dem Konto eines fireFTP verwenden, und so konnte ich sehen, wo die Wurzel des Kontos war ... es ist die Wurzel des Servers war.

Ich hatte den ganzen Weg bis zum Ordner enthalten, in dem ich schreibe, bin gelassen, und so konnte ich das Problem lösen.

Also, mein Rat ist, den Weg über eine grafische Schnittstelle zu bekommen (ich habe fireFTP verwendet), und fügen Sie den gesamten Pfad zu Ihrem Code.


$pathFromAccountRootFolderToMyDestinationFolder = '/Account/Root/Folder/To/My/Folder';
$stream = fopen("ssh2.sftp://".$sftp."/".$pathFromAccountRootFolderToMyDestinationFolder."/myFile.ext", 'r');

Hope dies Ihnen und andere Menschen mit dem gleichen Problem helfen!

Cheers!

Ich habe versucht, vor kurzem SFTP auf PHP zum Laufen zu bringen und festgestellt, dass phpseclib viel einfacher zu bedienen:

http://phpseclib.sourceforge.net/

Wenn Sie den Luxus nicht auf einem gemeinsamen Host sein und installieren können, was Erweiterungen Sie wollen vielleicht die PECL-Erweiterung besser wäre, aber nicht alle von uns sind so glücklich. Außerdem phpseclib API sieht ein bisschen mehr intuitiv, ist OOP und alle.

Mein Problem war, dass ich in der Funktion wurde Verbindungs- und String-URL mit Ressource innerhalb zurück. Unfortunatelly Ressource wird als in den Funktionskontext erstellt und Garbage-Collector ist Ressource auf Funktionsende zu trennen. Lösung:. Rück Ressource durch Verweis und ungesetzt es manuell in komplexeren Kontext

mein Problem wird gelöst durch SFTP-Unterstützung auf den (Powershell) Server ermöglicht

Das ist ein Fehler in dem SSH2-Paket, das ich vor Jahren gefunden und einen Patch php.net geschrieben. Es behebt dieses Problem, sondern erfordert eine der ssh2 pecl Paket neu zu erstellen. Sie können mehr hier lesen: https://bugs.php.net/bug.php? id = 69981 . Ich enthalten ein Patch auf die ssh2_fopen_wrappers.c-Datei in dem Paket, um das Problem zu beheben. Hier ist ein Kommentar I enthalten:

Hier ist eine Zeile Code aus ssh2_fopen_wrappers.c, die diesen Fehler verursacht: (Kommentar enthalten)

/*
       Find resource->path in the path string, then copy the entire string from the original path.
       This includes ?query#fragment in the path string
*/
    resource->path = estrdup(strstr(path, resource->path));

Diese Codezeile - und damit dieser Fehler - wurde als Lösung für Bug # 59794 eingeführt. Das Codezeile versucht, einen String zu erhalten, den Teil, Abfrage und Fragment aus den Pfadvariablen enthält. Betrachten wir diesen Wert für die Pfadvariablen:

ssh2.sftp://Resource id #5/topdir?a=something#heading1

Wenn ressourcen-> Pfad "/ topdir", ist das Ergebnis, dass "/ topdir? A = etwas # heading1" ressourcen- wird zugewiesen> Pfad genau wie der Kommentar sagt.

Nun wird der Fall betrachtet, wenn Ressourcen-> Pfad „/“ ist. Nachdem die Codezeile ausgeführt wird, wird ressourcen-> Pfad "// Resource id # 5 / topdir # heading1". Dies ist eindeutig nicht das, was Sie wollen. Hier ist eine Codezeile, die tut:

 resource->path = estrdup( strstr( strstr( path, "//" ) + 2, "/" ) );

Sie müssen unter Umständen auch den Patch für Bug # 73597 anzuwenden, die vor dem Aufruf php_url_parse "Resource id #" aus dem Weg String entfernt ().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top