mixmastertobsi: SSH2 SFTP PHP Problem

Hallo, ich bekomme es nicht hin ein Verzeichnis auf einem SFTP Server auszulesen.

Die Verbindung etc. wird korrekt aufgebaut, aber ich bekomme dann den Fehler bei "Could not open file:"

Dabei ist egal, ob ich

$stream = fopen("ssh2.sftp://".(int)$sftp.$remote_file_path, 'r');

oder

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

verwende.

Die Dateien liegen im ROOT.


$host = "XXX";
$port = "4001";
$username = "XXX";
$password = "XXX";
$remote_file_path = "/";


try {

    $connection = ssh2_connect($host, $port);

    if(!$connection){

        throw new \Exception("Could not connect to $host on port $port");

    }

    $auth  = ssh2_auth_password($connection, $username, $password);

    if(!$auth){

        throw new \Exception("Could not authenticate with username $username and password ");  

    }

    $sftp = ssh2_sftp($connection);

    if(!$sftp){

        throw new \Exception("Could not initialize SFTP subsystem.");  

    }

    $stream = fopen("ssh2.sftp://".(int)$sftp.$remote_file_path, 'r');

    if (! $stream) {

        throw new \Exception("Could not open file: ");

    }

    $contents = stream_get_contents($stream);

    echo "<pre>"; print_r($contents); echo "</pre>";

    @fclose($stream);

    $connection = NULL;

} catch (Exception $e) {

    echo "Error due to :".$e->getMessage();

}
  1. Tach!

    Die Verbindung etc. wird korrekt aufgebaut, aber ich bekomme dann den Fehler bei "Could not open file:"

    Den bekommst du, weil du den Text selbst in die von dir erzeugte Exception geschrieben hast. Interessant wäre aber der eigentliche Fehlertext bei vollem error_reporting und angeschaltetem display_errors. Oder je nach Konfiguration bei dir auch ein Blick in die Errorlogs.

    dedlfix.

    1. Nein - er kann das Verzeichnis nicht öffnen. Ich möchte, dass PHP das Verzeichnis öffnet und dann alle Dateien auf unseren Server ladet.

      Error-Reporting und display_errors sind an - wird aber nichts angezeigt

      error_reporting(E_ERROR & ~E_NOTICE);
      ini_set('display_errors', 1);
      
      1. Tach!

        Nein - er kann das Verzeichnis nicht öffnen.

        Wer ist "er"? Und was heißt Verzeichnis öffnen? Das ist hier kein Desktop-Programm, wo man klickt und damit symbolisch ein Verzeichnis öffnet. Du darfst beim Programmieren ruhig genauer hinschauen und formulieren.

        Ich möchte, dass PHP das Verzeichnis öffnet und dann alle Dateien auf unseren Server ladet.

        Welches Verzeichnis? Und wenn du Dateien schreiben möchtest, dann musst du auch einen Schreibzugriff nehmen und kein "r" wie lesen. Man öffnet zudem nicht vorher ein Verzeichnis und schreibt dann darein, so wie man es auf dem Desktop machen würde. Man schreibt stattdessen gleich die Datei, deren Namen man mit absolutem Pfad angibt.

        Error-Reporting und display_errors sind an - wird aber nichts angezeigt

        error_reporting(E_ERROR & ~E_NOTICE);
        ini_set('display_errors', 1);
        

        E_ALL zum Debuggen, und nicht irgendwas eingeschränktes.

        dedlfix.

  2. Hi,

    $stream = fopen("ssh2.sftp://".(int)$sftp.$remote_file_path, 'r'); oder $stream = fopen("ssh2.sftp://".$sftp.$remote_file_path, 'r');

            throw new \Exception("Could not connect to $host on port $port");
    

    Hm. Was soll der \ da?

    $remote_file_path = "/";
        $stream = fopen("ssh2.sftp://".(int)$sftp.$remote_file_path, 'r');
    

    Was erwartest Du hier? $sftp ist eine resource. Das String-verknüpfst Du mit "/". Und castest das als Integer, was bestenfalls sowas wie "ssh2.sftp://42" ergäbe. Oder bindet der Cast stärker? Dann ergäbe das "ssh2.sftp://42/".

    fopen erwartet einen Dateinamen oder eine URL (falls das für die URL überhaupt freigeschaltet ist).

    Du hast hier die URL-Variante mit Protokoll ssh2.sftp gewählt - gibst dann aber anstelle des Hostnames in der URL eine Nummer (in obigen Beispielen hab ich mal die 42 gewählt) an.

    Und das soll funktionieren?

    Müßte nach

    $sftp = ssh2_sftp($connection);
    

    nicht ein ssh2_scp_recv() oder ssh2_scp_send() oder sowas in der Art kommen?

    cu,
    Andreas a/k/a MudGuard

    1. Tach!

              throw new \Exception("Could not connect to $host on port $port");
      

      Hm. Was soll der \ da?

      Der ist korrekt und eine Namespace-Angabe.

      $remote_file_path = "/";
          $stream = fopen("ssh2.sftp://".(int)$sftp.$remote_file_path, 'r');
      

      Was erwartest Du hier? $sftp ist eine resource. Das String-verknüpfst Du mit "/". Und castest das als Integer, was bestenfalls sowas wie "ssh2.sftp://42" ergäbe. Oder bindet der Cast stärker? Dann ergäbe das "ssh2.sftp://42/".

      Der Typecast ist stärker als die Stringverknüpfung. Dass man da eine Ressource einbinden soll, steht so im PHP-Handbuch, auch wenn das ungewöhnlich ist. Der Typecast zu int ist allerdings auf einen Kommentar zurückzuführen.

      fopen erwartet einen Dateinamen oder eine URL (falls das für die URL überhaupt freigeschaltet ist).

      Du hast hier die URL-Variante mit Protokoll ssh2.sftp gewählt - gibst dann aber anstelle des Hostnames in der URL eine Nummer (in obigen Beispielen hab ich mal die 42 gewählt) an.

      Und das soll funktionieren?

      Ja, laut Handbuch. Die eigentliche Server-Verbindung wurde ja bereits im vorangehenden ssh_connect()-Aufruf erledigt.

      Müßte nach

      $sftp = ssh2_sftp($connection);
      

      nicht ein ssh2_scp_recv() oder ssh2_scp_send() oder sowas in der Art kommen?

      Nicht unbedingt, denn das wäre kein SFTP sondern ein SCP. Also ein Unterschied wie zwischen FTP und copy bzw. cp. (S)FTP kann deutlich mehr als nur Dateien übertragen, beispielsweise Verzeichnisse anlegen oder Dateien löschen.

      dedlfix.