wusa88
Goto Top

SFTP Automatischer Download. Täglich neues Datum

Hallo zusammen,

ich würde gerne einen Arbeitsablauf bei uns automatisieren.

Wir bekommen jeden Tag um 22 Uhr über 5 verschiedene SFTP Server jeweils 2 Dateien, die am nächsten Tag heruntergeladen werden müssen und in ein System importiert werden müssen.
Die Dateien werden jeden Tag per Hand heruntergeladen.

Eine Datei heißt dabei immer gleich und wird jeden Tag auf dem SFTP Server überschrieben. Dateiname: produkt_länderkürzel.csv

Eine Datei ändert innerhalb dem Dateinamen immer das Datum. Heute zb. turn_länderkürzel2023-06-19.csv. Die Datei für morgen wird dann turn_länderkürzel2023-06-20.csv heißen. So geht es dann immer weiter.

Wir loggen uns jetzt immer in WinSCP ein, öffnen den ersten Server, laden die 2 Dateien runter.
Dann öffnen wir den nächsten Server und laden wieder diese 2 Dateien herunter.

Das ganze machen wir jeden Tag. Ich würde das jetzt gerne irgendwie automatisieren. Dann müssten wir das nicht jeden Tag früh machen, sondern könnte das direkt in der Nacht runterladen lassen.
Somit hätten wir keine Verzögerung.

Ich muss dazu nicht WinSCP nehmen, wenn es ein andere Lösung gibt.
Bin über jeden Hinweis bzw. Hilfe dankbar.

Edit: Wichtig ist vielleicht noch, das ganze läuft momentan auf Windows.

Danke

Content-ID: 7590397217

Url: https://administrator.de/forum/sftp-automatischer-download-taeglich-neues-datum-7590397217.html

Ausgedruckt am: 22.12.2024 um 09:12 Uhr

Lochkartenstanzer
Lochkartenstanzer 20.06.2023 um 08:26:47 Uhr
Goto Top
Moin,

Warum nicht einfach die Kommandozeilenversion SCP, z.B. PSCP aus dem Putty-Paket?

Verpackt in ein Powershell-Script sollte das Recht flott zum Fliegen gebracht werden können.

Alternativ mit WSL ein Linux ins Windows reinpacken und damit alles abfackeln.

lks
em-pie
em-pie 20.06.2023 aktualisiert um 08:29:29 Uhr
Goto Top
Moin,

lässt sich hervorragend via Powershell automatisieren:
https://winscp.net/eng/docs/library_powershell
https://winscp.net/eng/docs/library_session_getfiles

edit: In eine *.tx oder *.ini packst du dann die 5 Server untereinander, liest im PS-Script die Datei aus und für jeden Eintrag stößt du dann den Download an. Dann lässt sich das Script hervorragend erweitern, ohne am eigentlich Code herumzudoktern...

Gruß
em-pie
wusa88
wusa88 20.06.2023 um 08:44:28 Uhr
Goto Top
Zitat von @Lochkartenstanzer:

Moin,

Warum nicht einfach die Kommandozeilenversion SCP, z.B. PSCP aus dem Putty-Paket?

Verpackt in ein Powershell-Script sollte das Recht flott zum Fliegen gebracht werden können.

Alternativ mit WSL ein Linux ins Windows reinpacken und damit alles abfackeln.

lks

Genau darum geht es mir, ich habe sowas noch nie gemacht.
Weder mit Powershell, ich könnte zwar ChatGPT fragen, aber ich kann den Code dann vermutlich nicht interpretieren.
WSL hatte ich bisher auch noch nicht im Einsatz. Vielleicht sollte ich mich da mal einlesen.
wusa88
wusa88 20.06.2023 um 08:44:46 Uhr
Goto Top
Zitat von @em-pie:

Moin,

lässt sich hervorragend via Powershell automatisieren:
https://winscp.net/eng/docs/library_powershell
https://winscp.net/eng/docs/library_session_getfiles

edit: In eine *.tx oder *.ini packst du dann die 5 Server untereinander, liest im PS-Script die Datei aus und für jeden Eintrag stößt du dann den Download an. Dann lässt sich das Script hervorragend erweitern, ohne am eigentlich Code herumzudoktern...

Gruß
em-pie

Da lese ich mich mal durch, ob ich weiterkomme.
Kraemer
Kraemer 20.06.2023 um 08:46:40 Uhr
Goto Top
Zitat von @wusa88:

Genau darum geht es mir, ich habe sowas noch nie gemacht.
Weder mit Powershell, ich könnte zwar ChatGPT fragen, aber ich kann den Code dann vermutlich nicht interpretieren.

Dann frage WinSCP - das Programm kann dir den Code für einen Server fix und fertig generieren.

Wenn es nicht schön werden muss, pappst du einfach die 5 verschiedenen Versionen nacheinander in eine .ps1-Datei
7426148943
7426148943 20.06.2023 um 09:00:15 Uhr
Goto Top
SachsenHessi
SachsenHessi 20.06.2023 um 09:02:50 Uhr
Goto Top
Guten Morgen ;)
Es geht noch komfortabler ;) PYROBATCH ist da Dein Freund.
LG
SH
7426148943
7426148943 20.06.2023 aktualisiert um 09:56:52 Uhr
Goto Top
bsp.
winscp /command "option batch on" "option confirm off" "open sftp://domain.tld -username=BlaBlub -password=PASSWORD" "get -latest /mypath/turn_länderkürzel????-??-??.csv /mypath/produkt_länderkürzel.csv  D:\Ziel\" close exit
scp -i myprivate.key myuser@domain.tld:"/mypath/turn_länderkürzel\*.csv /mypath/produkt_länderkürzel.csv" /my/local/path/
usw.

Bekommt auch ein Laie in ein paar Minuten ehrlich gesagt auch selbst ohne ChatGPT hin. Just RTFM and use the thing on your neck!

Zeppel
wusa88
wusa88 27.06.2023 um 11:43:01 Uhr
Goto Top
Ich komme leider irgendwie nicht weiter.
Ich versuche es aktuell mit WinSCP zu lösen, hänge aber irgendwo fest.

& "C:\Program Files (x86)\WinSCP\WinSCP.com" `  
  /log="C:\winscp-log\WinSCP.log" /ini=nul `  
  /command `
    "open sftp://ausfuhr:Dxx2Tuxxxx1e45@xx.xx.2x4.1x1:222/ -hostkey=`"`"ssh-ed25519 255 vxxxxxxxxx/dZxxxxxxx6m/qPLCxxxxxxxxxx6NxCnVU`"`"" `  
    "get product_HR.csv Y:\Product_import\"  
    "exit"  

$winscpResult = $LastExitCode
if ($winscpResult -eq 0)
{
  Write-Host "Success"  
}
else
{
  Write-Host "Error"  
}

exit $winscpResult


Ein Teil wird über den Code von WinSCP direkt generiert.

Als Fehlermeldung kommt zurück:
 2023-06-27 11:38:29.629 Using stored password.
< 2023-06-27 11:38:29.629 Script: Authentifikation mit zuvor eingegebenem Passwort.
. 2023-06-27 11:38:29.638 Sent password
. 2023-06-27 11:38:29.688 Access granted
. 2023-06-27 11:38:29.689 Opening main session channel
. 2023-06-27 11:38:30.158 Opened main channel
. 2023-06-27 11:38:30.192 Started a shell/command
< 2023-06-27 11:38:30.192 Script: Authentifiziert.
.
.
.
.
.
 2023-06-27 11:38:30.262 Startup conversation with host finished.
< 2023-06-27 11:38:30.262 Script: Sitzung gestartet.
< 2023-06-27 11:38:30.262 Script: Aktive Sitzung: [1] ausfuhr@xx.xx.2x4.1x1
> 2023-06-27 11:38:30.263 Script: get product_HR.csv Y:\Product_import\
. 2023-06-27 11:38:30.263 Listing file "product_HR.csv".  
> 2023-06-27 11:38:30.263 Type: SSH_FXP_LSTAT, Size: 40, Number: 263
< 2023-06-27 11:38:30.295 Type: SSH_FXP_STATUS, Size: 29, Number: 263
< 2023-06-27 11:38:30.295 Status code: 2, Message: 263, Server: No such file, Language:  
< 2023-06-27 11:38:30.296 Script: Die Attribute für die Datei „product_HR.csv“ können nicht ermittelt werden.
< 2023-06-27 11:38:30.296 Datei oder Verzeichnis nicht gefunden.
< 2023-06-27 11:38:30.296 Fehlercode: 2
< 2023-06-27 11:38:30.296 Fehlernachricht vom Server : No such file
. 2023-06-27 11:38:30.297 Script: Failed
. 2023-06-27 11:38:30.298 Script: Exit code: 1
. 2023-06-27 11:38:30.299 Closing connection.

Das sieht für mich so aus, als würde die Verbindung stehen.
Die Datei gibt es aber definitiv ich vermute hier einen Fehler im Script? Falsches Anführungszeichen? Muss das irgendwie anders aufgebaut werden?
Lochkartenstanzer
Lochkartenstanzer 27.06.2023 aktualisiert um 11:51:56 Uhr
Goto Top
Zitat von @wusa88:

Das sieht für mich so aus, als würde die Verbindung stehen.
Die Datei gibt es aber definitiv ich vermute hier einen Fehler im Script? Falsches Anführungszeichen? Muss das irgendwie anders aufgebaut werden?

  • Stimmt der Pfad auf dem FTP-Server?

  • Stimmt die Groß- und Kleinschreibung? Manche Server legen da Wert drauf. Mach doch vor dem get doch einfach mal ein list/dir.

  • Stimmen die Zugriffsrechte auf dem Server?

lks
Kraemer
Lösung Kraemer 27.06.2023 um 12:00:55 Uhr
Goto Top
Zitat von @wusa88:

Das sieht für mich so aus, als würde die Verbindung stehen.
Die Datei gibt es aber definitiv ich vermute hier einen Fehler im Script? Falsches Anführungszeichen? Muss das irgendwie anders aufgebaut werden?

mach dir das Leben doch nicht so schwer!

Stelle mit WinSCP eine Verbindung zu dem FTP-Server her. Wechsle nun in das richtige Verzeichnis.
Klicke mit der rechten Maustaste auf die Datei, die du herunterladen willst. Dann Wählst du Herunterladen und dann Herunterladen...

In dem nun kommenden Fenster klickst du auf Übertragungsoptionen
dann auch Code generieren...

Wählst den Reiter .NET...
wählst Sprache Powershell
und fertig ist der Lack!
wusa88
wusa88 27.06.2023 um 12:01:49 Uhr
Goto Top
Perfekt, der Pfad war es. Ich habe den Pfad hier eingefügt:
    "open sftp://ausfuhr:Dxx2Tuxxxx1e45@xx.xx.2x4.1x1:222/direkter Pfad zur Datei -hostkey=`"`"ssh-ed25519 255 vxxxxxxxxx/dZxxxxxxx6m/qPLCxxxxxxxxxx6NxCnVU`"`"" `  

Die Datei wird jetzt auch kopiert und in dem Ordner abgelegt.
Jetzt habe ich aber das Problem, dass die Datei zwar runtergeladen wird, aber der Befehl nicht beendet wird.
bild_2023-06-27_120112714
Es bleibt bei diesem Befehl stehen.

Heißt, dass "exit" scheint nicht zu greifen.
wusa88
wusa88 27.06.2023 um 12:02:27 Uhr
Goto Top
Zitat von @Kraemer:

Zitat von @wusa88:

Das sieht für mich so aus, als würde die Verbindung stehen.
Die Datei gibt es aber definitiv ich vermute hier einen Fehler im Script? Falsches Anführungszeichen? Muss das irgendwie anders aufgebaut werden?

mach dir das Leben doch nicht so schwer!

Stelle mit WinSCP eine Verbindung zu dem FTP-Server her. Wechsle nun in das richtige Verzeichnis.
Klicke mit der rechten Maustaste auf die Datei, die du herunterladen willst. Dann Wählst du Herunterladen und dann Herunterladen...

In dem nun kommenden Fenster klickst du auf Übertragungsoptionen
dann auch Code generieren...

Wählst den Reiter .NET...
wählst Sprache Powershell
und fertig ist der Lack!

Werde ich gleich testen.
em-pie
em-pie 27.06.2023 um 12:03:45 Uhr
Goto Top
Moin,

ich würde auch vermuten, dass die Datei eine Ordnerebene tiefer liegt.

Baue mal ein Directory Listening ein:
https://winscp.net/eng/docs/library_session_listdirectory
wusa88
wusa88 27.06.2023 um 12:54:55 Uhr
Goto Top
Zitat von @Kraemer:

Zitat von @wusa88:

Das sieht für mich so aus, als würde die Verbindung stehen.
Die Datei gibt es aber definitiv ich vermute hier einen Fehler im Script? Falsches Anführungszeichen? Muss das irgendwie anders aufgebaut werden?

mach dir das Leben doch nicht so schwer!

Stelle mit WinSCP eine Verbindung zu dem FTP-Server her. Wechsle nun in das richtige Verzeichnis.
Klicke mit der rechten Maustaste auf die Datei, die du herunterladen willst. Dann Wählst du Herunterladen und dann Herunterladen...

In dem nun kommenden Fenster klickst du auf Übertragungsoptionen
dann auch Code generieren...

Wählst den Reiter .NET...
wählst Sprache Powershell
und fertig ist der Lack!

Ich glaube, ich stelle mich gerade zu blöd an.
Wenn ich auf Herunterladen und dann nochmal herunterladen klicke, dann wird direkt die Datei heruntergeladen.
In den Einstellungen habe ich auch nichts gefunden, damit ich die Übertragung sehe.
Wenn ich mehrere Dateien herunterlade, dann kommt das Fenster mit der verbleibenden Zeit, aber ich habe keinen Eintrag mit "Übertragungsoptionen"
Kraemer
Kraemer 27.06.2023 um 13:23:27 Uhr
Goto Top
je nachdem wie / wo du klickst kann es auch sein, dass du nur einmal klickst.

Das Fenster sollte auf jeden Fall auftauchen:


Und da ist der Punkt Übertragungsoptionen entscheidend...
herunterladen
wusa88
wusa88 27.06.2023 um 13:32:06 Uhr
Goto Top
Das Fenster kommt mir bekannt vor. Ich habe aber das Verzeichnis, wohin ich runterladen will bereits geöffnet. Daher glaube ich, kommt bei mir diese Abfrage nicht mehr. Oder ich habe damals den Haken unten gesetzt mit nicht mehr anzeigen.
Kraemer
Kraemer 27.06.2023 um 13:42:09 Uhr
Goto Top
Dann schalte den Dialog wieder ein: Einstellungen / Umgebung / Übertragung von Dateien
wusa88
wusa88 27.06.2023 um 13:45:14 Uhr
Goto Top
Zitat von @Kraemer:

Dann schalte den Dialog wieder ein: Einstellungen / Umgebung / Übertragung von Dateien

Perfekt. Danke
wusa88
wusa88 27.06.2023 um 13:52:12 Uhr
Goto Top
Zitat von @Kraemer:
Wählst den Reiter .NET...
wählst Sprache Powershell
und fertig ist der Lack!

Mit .Net... lief es bei mir leider nicht.
Wenn ich aber Skript nehme und dann Powershell, dort läuft es bei mir wunderbar.

Wenn du mir jetzt noch helfen kannst, wie ich in das Skript immer das aktuelle Datum rein bekomme, dann wäre es genau das, wie ich es mir vorstellt.

Dateiname_2023-06-27.csv
morgen ist es dann
Dateiname_2023-06-28.csv

Danke bis hierhin für die Hilfe.
Kraemer
Lösung Kraemer 27.06.2023 um 13:59:50 Uhr
Goto Top
wie kann man nur so unselbständig sein

Ersetzte das Datum in deinem Script durch

$(get-date -Format "yyyy-MM-dd")  


Zitat von @wusa88:

Mit .Net... lief es bei mir leider nicht.
und das ist keine Aussage, die man in einem Admin-Forum postet. Warum funktioniert das nicht?
wusa88
wusa88 27.06.2023 um 14:07:49 Uhr
Goto Top
Zitat von @Kraemer:

wie kann man nur so unselbständig sein

Ersetzte das Datum in deinem Script durch

$(get-date -Format "yyyy-MM-dd")  


Zitat von @wusa88:

Mit .Net... lief es bei mir leider nicht.
und das ist keine Aussage, die man in einem Admin-Forum postet. Warum funktioniert das nicht?

Glaub mir, ich bin absolut nicht unselbständig. Ich lese und probiere wirklich viel.
Habe aber zu Anfangs schon erwähnt, dass ich mit Powershell noch überhaupt nicht in Kontakt war. Zudem tue ich mich mit Programmierungen echt schwer.

Ich müsste das ganze jetzt nochmal umbauen auf .NET... dann könnte ich den Fehler reproduzieren. Habe ich aber ehrlich gesagt nicht weiter verfolgt, da es über Skript Problemlos funktionierte.
wusa88
wusa88 27.06.2023 aktualisiert um 14:54:40 Uhr
Goto Top
@Kraemer
Ich musste jetzt mit dem get-date -Format ein wenig spielen. Die Lösung ist jetzt ein wenig anders. Ich wusste nicht, wie man es direkt in die Zeile einbaut.

Hier noch meine Lösung:
$date = Get-Date -Format "yyyy-MM-dd"  
$productHR = "product_HR$date.csv"  
& "C:\Program Files (x86)\WinSCP\WinSCP.com" `  
  /log="C:\winscp-log\WinSCP.log" /ini=nul `  
  /command `
    "open sftp://ausfuhr:Dxx2Tuxxxx1e45@xx.xx.2x4.1x1:222/ -hostkey=`"`"ssh-ed25519 255 vxxxxxxxxx/dZxxxxxxx6m/qPLCxxxxxxxxxx6NxCnVU`"`"" `  
     "cd /csv" `  
    "lcd X:\SicherungFTP" `  
    "get $productHR" `  
    "exit"  

$winscpResult = $LastExitCode
if ($winscpResult -eq 0)
{
  Write-Host "Success"  
}
else
{
  Write-Host "Error"  
}

exit $winscpResult
Kraemer
Kraemer 27.06.2023 aktualisiert um 15:19:17 Uhr
Goto Top
du musstest nur 2023-06-28 mit meinem Code ersetzen.

Egal - hauptsache funktioniert und du hast ein bischen dazugelernt.

Edit: Bitte Thread noch als gelöst markieren
Lochkartenstanzer
Lochkartenstanzer 27.06.2023 um 15:29:51 Uhr
Goto Top
Zitat von @wusa88:

Perfekt, der Pfad war es. Ich habe den Pfad hier eingefügt:
    "open sftp://ausfuhr:Dxx2Tuxxxx1e45@xx.xx.2x4.1x1:222/direkter Pfad zur Datei -hostkey=`"`"ssh-ed25519 255 vxxxxxxxxx/dZxxxxxxx6m/qPLCxxxxxxxxxx6NxCnVU`"`"" `  

Eben. Wenn der nicht stimmt, kann er die Datei gar nicht finden.

lks
wusa88
wusa88 27.06.2023 um 16:00:58 Uhr
Goto Top
Ich bräuchte in diesem Zug nochmal Hilfe.
Ich versuche jetzt die Dateien die lokal vom SFTP heruntergeladen wurde, nochmal zu kopieren.
Das funktioniert jetzt aber leider auch nicht wie gewünscht.

Hier mal meine Beispiele wie ich bereits getestet habe.

Copy-Item -Path "X:\SicherungFTP" -Destination "Z:\Product_import" -Filter "product*" -Force  
Hier habe ich das Problem, dass mir der Ordner SicherungFTP angelegt wird und nicht der Ordner Inhalt kopiert wird.

Copy-Item -Path "X:\SicherungFTP\" -Destination "Z:\Product_import" -Filter "product*" -Force  
Mit \ am Schluss des Pfades egal wo, er legt mir nur den Ordner an aber auch ohne Inhalt.

$ornderAusgangProdukt = "X:\SicherungFTP"  
$ordnerTestProdukt = "Z:\Product_import"  
$files = Get-ChildItem -Path $ordnerAusgangProdukt -Filter "product*" -File  
$files | Copy-Item -Destination $ordnerTestProdukt -Force
Mit diesem Skript verschiebt er mir nur eine Datei und nicht alle die mit product beginnen.

Könnt ihr mir hier nochmal unter die Arme greifen?
Kraemer
Lösung Kraemer 27.06.2023 um 16:11:19 Uhr
Goto Top