pcklick
Goto Top

BATch soll neuste Datei eines bestimmten Dateiy-Typs auf einem FTP-Server finden

Hey Leute,
folgendes Problem:
Ich möchte per Batch ein Backup, das auf meinem FTP Webspace liegt automatisch dowloaden. Den Pfad zum Ordner der .zip Dateien ist mir bekannt.
Ich weiss nur nicht, wie ich per .ftp-Datei ein Skript mache, dass die neuste .zip Datei abfrägt. Kann mir jemand helfen / einen Codeschnipsel empfehlen?

Vielen Dank für alle Bemühungen und Hilfen im Vorraus! :D

Content-ID: 196866

Url: https://administrator.de/contentid/196866

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

108012
108012 12.01.2013 um 17:29:28 Uhr
Goto Top
Hallo pcklick,

lass das ein Script auf dem FTP Server machen!

Sonst läuft man schnell Gefahr, dass das jemand ausnutzt, von außerhalb über das Internet!
und wenn der dann erwischt wird, braucht er nur zu sagen er habe nichts böses gewollt und
hat sich mit seinem Script oder seiner Batch-Datei verschrieben!

Von mir aus auch zwei Scripte intern, eines guckt nach neuen Dateien und das andere wird dann erst aktiv wenn das erste etwas "neues" gefunden hat! Das hält den Code schlank und ist von außerhalb nicht aus zu
nutzen, respektive man kann auf Grund der besseren Übersicht Fehler schneller entdecken.

Gruß
Dobby
Friemler
Friemler 12.01.2013, aktualisiert am 13.01.2013 um 11:31:49 Uhr
Goto Top
Hallo pcklick,

abhängig davon, in welchem Format Dein FTP-Server seine Verzeichnislistings ausliefert, könnte das so gehen:
@echo off & setlocal


::Daten für die FTP-Verbindung
set "FTPServer=Server"  
set "FTPUser=Username"  
set "FTPPassword=Passwort"  
set "FTPDir=/"  
set "FTPFileType=zip"  

::Pfade von temporären Dateien
set "GetFTPDirListing=%TEMP%\GetFTPDirListing.txt"  
set "FTPDirListing=%TEMP%\FTPDirListing.txt"  
set "FTPDirListing2=%TEMP%\FTPDirListing2.txt"  


::Die temporäre Datei leeren, die das Verzeichnislisting aufnimmt
type NUL > "%FTPDirListing%"  

::FTP-Script in temporäre Datei schreiben
> "%GetFTPDirListing%" echo open %FTPServer%  
>>"%GetFTPDirListing%" echo user %FTPUser% %FTPPassword%  
>>"%GetFTPDirListing%" echo ascii  
>>"%GetFTPDirListing%" echo cd "%FTPDir%"  
>>"%GetFTPDirListing%" echo ls -l "%FTPDirListing%"  
>>"%GetFTPDirListing%" echo bye  

::FTP-Script ausführen
::Das Verzeichnislisting wird dabei lokal in eine temporäre Datei geschrieben
ftp /inv /s:"%GetFTPDirListing%" > NUL  


::Aus dem Verzeichnislisting die Zeilen herausfiltern, die Dateien des gewünschten Typs enthalten
::Die Angaben zum Datum und den Dateinamen an das Unterprogramm ProcessFile übergeben
::Dessen Ausgaben werden in eine temporäre Datei umgeleitet
(for /f "tokens=6-8*" %%a in ('findstr /i /r /c:"^-.*\.%FTPFileType%$" "%FTPDirListing%" 2^>NUL') do (  
   call :ProcessFile %%c %%a %%b "%%d"  
)) > "%FTPDirListing2%"  


::Die im letzten Schritt erzeugte Datei mit SORT in absteigender Reihenfolge sortieren
::Dadurch steht die jüngste Datei in der ersten Zeile. Diese Zeile auslesen und dann Abbruch
for /f "tokens=3*" %%a in ('sort /r "%FTPDirListing2%" 2^>NUL') do (  
  set "NewestFile=%%b"  
  goto :ReadResultLoopBreak
)

:ReadResultLoopBreak
::Ergebnis ausgeben
echo.%NewestFile%


::Temporäre Dateien löschen
del "%FTPDirListing%"  
del "%FTPDirListing2%"  
del "%GetFTPDirListing%"  

::Script Ende
exit /b 0



::Unterprogramm
::Erzeugung der 2-stelligen numerischen Darstellung eines Monatsnamens
:ProcessFile
  set "MonthNames=Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"  
  set "MonthA=%2"  
  set /a MonthN=0

  ::Monatsnummer aus dem Namen ermitteln
  for %%m in (%MonthNames%) do (
    set /a MonthN+=1
    if /i "%%m" equ "%MonthA%" goto :MapLoopBreak  
  )

  :MapLoopBreak
  ::Aus der Monatsnummer die 2-stellige Darstellung erzeugen
  set "MonthN=0%MonthN%"  
  set "MonthN=%MonthN:~-2%"  

  ::Datum und Dateiname ausgeben
  ::Anschließend ein Zeilenumbruch
  <NUL set /p "=%1 %MonthN% %3 %~4"  
  echo.

::Back to caller
exit /b 0

Das Script ist auf das folgende Format eines Verzeichnislistings ausgelegt:
-rw-r--r--    1 ftp      ftp         74610 Jun 06  2012 hist-deu.txt
-rw-r--r--    1 ftp      ftp         28537 Oct 22  2010 hist-eng.txt
-rw-r--r--    1 ftp      ftp          1468 Jul 27  2010 info-deu.txt
-rw-r--r--    1 ftp      ftp          1672 Jul 27  2010 info-eng.txt
dr-xr-xr-x   11 ftp      ftp          4096 Nov 28  2006 programs
drwxr-xr-x    2 ftp      ftp          4096 Mar 11  2003 public
dr-xr-xr-x   13 ftp      ftp          4096 Dec 08  2008 tools

Gruß
Friemler
pcklick
pcklick 12.01.2013 um 22:43:29 Uhr
Goto Top
Vielen lieben Dank! Da hast du dir echt Mühe gegeben. Trotzdem erhalte ich nach nur diesem Stück, den Fehler "Anmeldefehler":
@echo off & setlocal


::Daten für die FTP-Verbindung
set "FTPServer=ftp.pcklick.net"
set "FTPUser=w00ec0b6"
set "FTPPassword=XXXXXXXXXX"
set "FTPDir=/wordpress/wp-content/7bd31336c0-backups/"
set "FTPFileType=zip"

::Pfade von temporären Dateien
set "GetFTPDirListing=%TEMP%\GetFTPDirListing.txt"
set "FTPDirListing=%TEMP%\FTPDirListing.txt"
set "FTPDirListing2=%TEMP%\FTPDirListing2.txt"


::Die temporäre Datei leeren, die das Verzeichnislisting aufnimmt
type NUL > "%FTPDirListing%"

::FTP-Script in temporäre Datei schreiben
"%GetFTPDirListing%" echo open %FTPServer%
"%GetFTPDirListing%" echo user %FTPUser% pass %FTPPassword%
"%GetFTPDirListing%" echo ascii
"%GetFTPDirListing%" echo cd "%FTPDir%"
"%GetFTPDirListing%" echo ls -l "%FTPDirListing%"
"%GetFTPDirListing%" echo bye

::FTP-Script ausführen
::Das Verzeichnislisting wird dabei lokal in eine temporäre Datei geschrieben
ftp /inv /s:"%GetFTPDirListing%" > NUL

Stimmt das so? Oder muss ich noch etwas ausfüllen? Bzw. bearbeiten?
Danke für die Hilfe :D
Friemler
Friemler 13.01.2013 um 00:45:32 Uhr
Goto Top
Hallo pcklick,

es könnte sein, dass Du in Deinem Passwort irgendwelche Sonderzeichen verwendest. In welcher Codierung/mit welchem Editor hast Du das Script und damit auch Dein Passwort gespeichert? Teste auf jeden Fall mal Windows Notepad (Codierung ANSI bzw. Codepage Windows-1252) und z.B. Notepad++ oder Notepad2 (beide kostenlos) in der Codierung OEM850.

Gruß
Friemler
pcklick
pcklick 13.01.2013 um 11:21:23 Uhr
Goto Top
Ich nutze Notepad++
Das Passwort besteht nur aus Buchstaben und Zahlen... Was mache ich falsch? :D
Friemler
Friemler 13.01.2013 aktualisiert um 11:40:05 Uhr
Goto Top
Hallo pcklick,

ich hatte einen kleinen Bug in der Zeile für die Anmeldung am FTP-Server, ist bereits korrigiert.

Damit das Script funktioniert, muss das Verzeichnislisting so formatiert sein, wie in meinem Beispiel. Dabei kommt es auf die folgenden Faktoren an:

  • Die erste Spalte muss die Attributbits enthalten, bei Dateien muss die Zeile mit einem Minuszeichen beginnen.
  • Die Spalten 6 bis 8 enthalten das Dateidatum in der Reihenfolge Monatsname Tag Jahr.
  • Der Monatsname ist als englische Abkürzung angegeben.
  • In Spalte 9 steht der Dateiname.

Gruß
Friemler
pcklick
pcklick 13.01.2013 um 15:02:37 Uhr
Goto Top
Okay, die Anmeldung geht jetzt...
Doch ich würde die ermittelte Datei gern downloaden... Die Variable "%NewestFile%" zeigt mir nichts an?
Friemler
Friemler 13.01.2013 aktualisiert um 15:59:52 Uhr
Goto Top
Hallo,

Du meinst also, das Script zeigt Dir nichts an? Ich habe ja bereits mehrmals geschrieben, dass das Script auf ein gewisses Format des Verzeichnislistings angewiesen ist.

Starte bitte eine Konsole/Eingabeaufforderung und tippe folgende Kommandos ein:
cd /d "%UserProfile%\Desktop"
ftp -n
open ftp.pcklick.net
user w00ec0b6 DeinPasswort
ascii
ls -l ftpdir.txt
bye
Auf Deinem Desktop müsste danach eine Datei ftpdir.txt vorhanden sein. Poste bitte den Inhalt dieser Datei, damit ich das Script anpassen kann. Und benutze für das Posting bitte Code-Tags, ich brauche die unverfälschte Ausgabe!

Gruß
Friemler
pcklick
pcklick 13.01.2013 um 15:45:33 Uhr
Goto Top
Erstmal vielen Dank für die Hilfe!
Hier das Verzeichniss:

globaltechnews
drupal-7.12
WichtigerOrdnerNichtLöschen
wplounge
.
logs
Überreste1
usage
wordpress
neuste.bat
shop
infophp.php
..
Friemler
Friemler 13.01.2013 um 15:54:39 Uhr
Goto Top
Hallo,

wenn das wirklich die Antwort Deines FTP-Servers auf den Befehl
ls -l
ist, kann man Dir nicht helfen. Der Befehl liefert normalerweise die lange Version eines Verzeichnislistings, d.h. incl. Datumsangaben und Angaben zum Typ eines Eintrags (es kann ja ein Verzeichnis oder eine Datei sein). Ohne diese Angaben kann man natürlich auf dem lokalen Rechner nicht die neueste Datei im FTP-Verzeichnis ermitteln.

Evtl. lässt sich da was an der Konfiguration des FTP-Servers einstellen, das musst Du aber mit Deinem Hoster klären.

Gruß
Friemler