SFTP Fileupload mit winscp (Fehler No such File)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von smurf.

    SFTP Fileupload mit winscp (Fehler No such File)

    Hallo zusammen,

    ich wollte mir ein kleines Tool basteln das ein Verzeichnis überwacht und Dateien mit bestimmten Endungen auf mein NAS (@Home) über eine SSH-Verbindung verschiebt, sprich mit SFTP. Soweit so gut.
    Ich würde dafür gerne die dll von Winscp nutzen da diese kostenfrei zur Verfügung gestellt wird und sogar mit Beispiel wie man sie verwendet. Ich hab nun das Beispiel für mich angepasst, bekomme aber vom Server immer die Nachricht: "No such File"

    Auszug aus meinem Code:

    Quellcode

    1. Private Function MyTransfer(File As String) As String
    2. Try
    3. ' Setup session options
    4. Dim sessionOptions As New SessionOptions
    5. With sessionOptions
    6. .Protocol = Protocol.Sftp
    7. .HostName = "MeineIP"
    8. .UserName = "MeinUser"
    9. .Password = passwd
    10. .PortNumber = MeinPort
    11. .SshHostKeyFingerprint = "MeinFingerprintvomSSHServer"
    12. End With
    13. Using session As New Session
    14. session.SessionLogPath = Environ("USERPROFILE") & "\Desktop\Log.txt"
    15. ' Connect
    16. session.Open(sessionOptions)
    17. ' Upload files
    18. Dim transferOptions As New TransferOptions
    19. transferOptions.TransferMode = TransferMode.Binary
    20. transferOptions.FilePermissions = Nothing
    21. transferOptions.PreserveTimestamp = False
    22. transferOptions.ResumeSupport.State = TransferResumeSupportState.Off
    23. Dim transferResult As TransferOperationResult
    24. transferResult = session.PutFiles(File, "/volume1/Verz1/Testfiles/", True, transferOptions)
    25. ' Throw on any error
    26. transferResult.Check()
    27. ' Print results
    28. For Each transfer In transferResult.Transfers
    29. UpdateTextBox("Upload of " & transfer.FileName & " succeeded")
    30. 'Console.WriteLine("Upload of {0} succeeded", transfer.FileName)
    31. Next
    32. End Using
    33. Return 0
    34. Catch e As Exception
    35. UpdateTextBox("Error: " & e.ToString)
    36. 'Console.WriteLine("Error: {0}", e)
    37. Return 1
    38. End Try
    39. End Function


    Die Funktion wird mit dem vollen Pfad der Datei aufgerufen die ich zu verschieben beabsichtige. Das Verzeichnis auf dem SSH-Server ist vorhanden. Die entsprechenden Rechte die Datei anzulegen hat der Benutzer auch (Mit der GUI von WinSCP kann ich die Datei kopieren/verschieben)

    Exception:
    Error: WinSCP.SessionRemoteException: Kann die entfernte Datei '/volume1/Verz1/Testfiles/Datei.xyz' nicht anlegen.
    Datei oder Verzeichnis nicht gefunden.
    Fehlercode: 2
    Fehlernachricht vom Server : No such file
    bei WinSCP.OperationResultBase.Check()

    In dem Logfile kann ich erkennen das die Verbindung zum Server richtig aufgebaut wird. Die Exception kommt sobald der Server versucht die Datei anzulegen.

    Auszug aus Log:
    < 2016-08-25 10:33:33.006 Script: Aktive Sitzung: [1] MeinUser@MeineIP
    > 2016-08-25 10:33:33.766 Script: pwd
    < 2016-08-25 10:33:33.766 Script: /
    > 2016-08-25 10:33:33.819 Script: put -delete -nopermissions -nopreservetime -transfer="binary" -resumesupport="off" -- "C:\Users\MeinUser\Downloads\Datei.xyz" "/volume1/Verz1/Testfiles/"
    . 2016-08-25 10:33:33.830 Copying 1 files/directories to remote directory "/volume1/Verz1/Testfiles/"
    . 2016-08-25 10:33:33.830 PrTime: No; PrRO: No; Rght: rw-r--r--; PrR: No (No); FnCs: N; RIC: 0100; Resume: N (102400); CalcS: No; Mask:
    . 2016-08-25 10:33:33.830 TM: B; ClAr: No; RemEOF: No; RemBOM: No; CPS: 0; NewerOnly: No; InclM: ; ResumeL: 0
    . 2016-08-25 10:33:33.830 AscM: *.*html; *.htm; *.txt; *.php; *.php3; *.cgi; *.c; *.cpp; *.h; *.pas; *.bas; *.tex; *.pl; *.js; .htaccess; *.xtml; *.css; *.cfg; *.ini; *.sh; *.xml
    . 2016-08-25 10:33:33.830 File: 'C:\Users\MeinUser\Downloads\Datei.xyz' [2016-08-25T08:33:31.943Z] [1457028]
    . 2016-08-25 10:33:33.831 Copying "C:\Users\MeinUser\Downloads\Datei.xyz" to remote directory started.
    . 2016-08-25 10:33:33.831 Binary transfer mode selected.
    . 2016-08-25 10:33:33.831 Opening remote file.
    > 2016-08-25 10:33:33.832 Type: SSH_FXP_OPEN, Size: 171, Number: 259
    < 2016-08-25 10:33:33.847 Type: SSH_FXP_STATUS, Size: 29, Number: 259
    < 2016-08-25 10:33:33.847 Status code: 2, Message: 259, Server: No such file, Language:
    > 2016-08-25 10:33:33.847 Type: SSH_FXP_LSTAT, Size: 155, Number: 519
    < 2016-08-25 10:33:33.862 Type: SSH_FXP_STATUS, Size: 29, Number: 519
    < 2016-08-25 10:33:33.862 Status code: 2, Message: 519, Server: No such file, Language:
    * 2016-08-25 10:33:33.862 (ETerminal) Datei oder Verzeichnis nicht gefunden.
    * 2016-08-25 10:33:33.862 Fehlercode: 2
    * 2016-08-25 10:33:33.862 Fehlernachricht vom Server : No such file


    Ich hab schon versucht die Zieldatei mit an das Zielverzeichnis anzuhängen, den Pfad mit "/" am ende und ohne. Aber immer derselbe Fehler.
    z.B.:
    transferResult = session.PutFiles("C:\Users\MeinUser\Downloads\Datei.xyz", "/volume1/Verz1/Testfiles/Datei.xyz", True, transferOptions)
    transferResult = session.PutFiles("C:\Users\MeinUser\Downloads\Datei.xyz", "/volume1/Verz1/Testfiles", True, transferOptions)
    transferResult = session.PutFiles("C:\Users\MeinUser\Downloads\Datei.xyz", "/volume1/Verz1/Testfiles/", True, transferOptions)
    transferResult = session.PutFiles("C:\Users\MeinUser\Downloads\*", "/volume1/Verz1/Testfiles/", True, transferOptions)

    Hat jemand einen Hinweis oder eine Idee woran es liegen kann?



    Gruß
    Smurf
    Hallo zusammen,

    ich habe noch etwas rumexperimentiert und den Fehler gefunden. Des Rätsels Lösung hab ich gefunden als ich mal mit Session.ListDirectory("/") das Verzeichnis abgefragt habe.
    Ich benutze Protocol.sftp
    Dadurch sehe ich nur Freigaben auf dem NAS. Nicht aber das Root-Verzeichnis. Schaue ich mit Konsole oder mit der GUI von WinSCP drauf benutze ich das scp Protokoll. Mit scp sieht man nicht die Freigaben sondern das eigentliche Filesystem.
    Kleiner aber feiner Unterschied.

    Fehler erkannt und verstanden. Jetzt kann ich mich noch was über meine eigene Doofheit ärgern und dann nachher ins WE gehen :)

    Danke an alle die sich mit dem Thema beschäftigt haben :)

    Gruß
    Smurf
    Schau dir mal Empfohlene Einstellungen (Option Strict On)und Try Catch in meiner Signatur an. Wieso gibt die Funktion einen String zurück? Du hast doch nur 0 und 1, also würde es ein Boolean besser tun, nicht?

    Grüße
    Grüße
    Felix
    Hallo Felix,

    danke für dein Hinweis. Die Seite mit dem empfohlenen Einstellungen hab ich Freitag nachmittag entdeckt aber noch nicht Umgesetzt da ich am WE noch keine Zeit dazu hatte. Ich bin noch neu in VB und das Programm sollte ein Quick&Dirty Versuch sein wie schnell und einfach man das in VB umsetzen kann. Das Programm tut jetzt ganz grob was es soll und jetzt kann ich mich daran machen das Tool ein wenig zu erweitern. Dazu werde ich aber noch ein wenig Nachlesen müssen. Aber ich denke das was ich dazu brauche werde ich hier im Forum finden. Möglichkeiten für Settings und Profile, sicheres abspeichern von Passwörtern (für den SSH Zugang), PPK auth etc...


    Gruß
    Smurf