Dateitransfer von Unix -> Windows

B

beckham

Grünschnabel
Hallo,

Ich muss für die Arbeit ein Shellskript programmieren, welches eine Datei von Unix auf einen Windowsrechner kopiert.
Leider kenn ich mich in Sachen Unix und Shellskripte bis jetzt überhaupt nicht aus.
Funktion soll 3 Parameter erhalten: Ziel-Rechnername, Quelldatei, Zieldateipfad
Zudem soll das Skript prüfen, ob die zu kopierende Datei bereits existiert.
Ist dies der Fall, soll ein Backup der Datei gemacht werden und dann erst kopiert werden.
Wie geh ich denn das ganze am besten an? Wie mach ich das? FTP? Habe mal was von Samba gehört...
Kann mir hierbei evtl jemand helfen? Hat vielleicht schon mal jemand etwas in der Art implementiert?
Schon mal vielen Dank im voraus.

Viele Grüsse
beckham
 
erst mal danke theton.
aber das ist mir schon etwas zu speziell.
bin absoluter anfänger in sachen shell-programmierung und samba.
wie sieht es denn mit skriptbeispielen für samba-konfiguration aus?
oder so ne art schritt für schritt anleitung.
und mit welchem kommando kann ich feststellen, ob eine datei bereits existiert?

viele grüsse
beckham
 
Wenn du die oben genannten Howtos mal gelesen hättest, wüsstest du wie man überprüfen kann ob eine Datei existiert. http://tldp.org/LDP/abs/html/refcards.html#AEN18927

Zu Samba: Installiere dir Samba und lies die Manpage zu smbclient.

Allgemein: Wir sind hier keine Howto- oder Skript-Schmiede, sondern ein Board, an das man sich mit spezifischen Problemen wenden kann. Ein wenig Doku lesen wirst du schon selbst machen müssen. Jeder fängt mal an und jeder, der anfängt, muss auch Dokus lesen. Was bringt es dir, wenn ich dir ein fertiges Skript gebe und du keine Ahnung hast, was es im einzelnen tut? Wie wär's, wenn du einfach erstmal selbst ein Skript schreibst und wenn es dann nicht so funktioniert wie es soll, einfach nochmal nachfragst wo die Fehler liegen? So läuft das hier nämlich im Normalfall. Wir sind hier nicht dazu da DEINE Arbeit zu machen, sondern bei Problemen zu helfen.
 
ok ok ist ja schon gut.
werde mich morgen im laufe des tages mit auftretenden problemen melden.
bis dahin schon mal danke für die infos.
 
hallo nochmal.
das ganze hat sich inzwischen etwas entschärft.
samba wird nicht benötigt. kann es mittels ftp realisieren.
bin bisher so weit:

(echo "
open $1
user $user $pw
! print -n Es werden Daten auf den Server $1 uebertragen
put $2
! print "fertig"
close
")| ftp -i -n

habe nun das problem, das ich beim ftp-connect in dem verzeichnis ftproot bin
und keine ebene höher komme. dort liegt nämlich der ordner wwwroot, unter
dem ich die gewünschten verzeichnisse finde. gibt es da eine möglichkeit?
zur veranschaulichung (bin in ftproot, dateien müssen nach a,b oder c):
lw d:
|
|-- ftproot
|
|--wwwroot
| |
| |-- a
| |-- b
| |-- c

wie kann ich nach dem connect feststellen, ob die datei $2 in dem verzeichnis
/wwwroot/a existiert?

vielen dank schon mal im voraus.
 
Via FTP geht das nur, wenn du versuchst die Datei zu downloaden. Ich habe nicht umsonst was von Samba gesagt.
 
ich kann aber aus konzernrichtlinien kein samba einsetzen!!!
und warum so überspitzte kommentare? hab ich dir was getan?
hab doch nur mein problem geschildert und um hilfe gebeten...
 
Ich weiss nicht, was daran überspitzt ist.
Nunja, wenn du kein Samba nutzen darfst (ich verstehe nur nicht, warum Ordner-Freigaben in einer Firma in einem abgeschlossenen LAN nicht erlaubt sind), dann schau dir mal http://ftpfs.sourceforge.net/ an.
 
Ich ich denke, dass der Ansatz mit dem FTP gar nicht so schlecht ist. Das Problem liegt nun doch darin, dass du im falschen Verzeichnis bist.

Eine Windows Applikation greift bei uns auch via ftp auf unser AIX Unix System zu. Wir haben für dies
1. einen speziellen User generiert und dem das entsprechende Verzeichnis als Home Verzeichnis in der passwd angegeben
2. als Sicherheit generierten wir ein ftpaccess.ctl. Darin haben wir beschrieben, wer auf das Verzeichnis zugreifen darf.

Hoffe liege mit dieser Version einer möglichen Idee nicht schief.
 
Zuletzt bearbeitet:
@StuderF: Und wie überprüfst du über ein Skript, ob eine Datei auf dem FTP-Space existiert? Das ist ja hier wohl das Hauptproblem. Ich kenne nur einen Weg und der geht über den Download der Datei. Ansonsten muss man zu Hilfsmitteln wie FTPFS greifen um die Datei "lokal" verfügbar zu machen.
 
Lass uns dies etwas ruhig angehen.
Da hast du wohl recht, dass es im FTP schier unmöglich ist zu überprüfen, ob eine Datei vorhanden ist. Da ist der FTP ja sehr begrenzt. theton, da bist du vermutlich versierter als ich. Wenn man eine Datei herunterladen will und diese nicht vorhanden ist, gibt der FTP eine Nachricht zurück: "A file or directory in the path does not exist". Könnte man diese Nachricht auswerten? Ansonsten bleibt nur noch (wenn es über ftp gemacht werden soll) auf dem Zielsystem zu kontrollieren, ob dieses überhaupt angekommen ist.
Eine andere möglichkeit sehe ich mit ftp auch nicht.
Das blöde daran ist, dass Backham die Datei herunterladen möchte und nicht hochladen. Sonst hätte man die hochgeladene Datei in ein anderes Verzeichnis deponiert und diese dann mit der Original verglichen. Ber wenn man dieses vorgehen auf dem Unix system machen könnte? Nur so ein Gedanke.
 
THETON, was hälst du von der Variante WINSCP. Dieses lässt sich auch irgendwie scripten. Somit könnte man zuerst sich eine Liste der Quelle generieren lassen und im Windows dann analysieren und wenn es vorhanden ist, dieses herunterladen.
 
Scheint ja hier um einen Linux-Rechner (Shell-Skript unter Windows geht nur mit Cygwin und das auch nur begrenzt und für Cygwin wäre hier auch das falsche Board) als Client zu gehen, also fällt WinSCP schonmal weg.
However, es ist beckhams Aufgabe nicht meine. Ich kann hier in dem Netzwerk, das ich verwalte, glücklicherweise selbst bestimmen, was ich zulasse und was nicht und ich würde halt einfach eine Freigabe auf der Win-Kiste machen und diese via smbclient mounten und somit mit den Dateien arbeiten können, als seien sie lokal.
Sicherlich lassen sich die Meldungen des FTP-Servers in einem Skript auswerten, nur halte ich es für unsinnig bei jedem Verbindungsversuch einen Download zu initiieren. Dann lieber einen FTP-Server auf den Win-Rechner packen und den Spass via FTPFS lokal auf dem Linux-Rechner mounten und schon kann man wieder die gewohnten Prüfmechanismen von Shellskripten nutzen (-d und -f).
 
Evtl. könnte man auch die internen Befehle vom ftp nutzen (dir, ls ... etc.)
und dann die Rückgabe mittels grep, find ... etc. auf den gewünschten Filenamen testen.

Dann braucht man keinen Download anleiern und sollte doch zu seinem Ergebnis kommen.
 
hallo zusammen,

bin schon mal ein grosses stück weiter gekommen:

Code:
if [ $LIEFERSCHEIN -ne 1 ] ; then
  if [ $LIEFERUMFANG -ne 1 ] ; then
    KOPIERE=1
    if [ -s $CP_QUELLDATEI ]; then
      echo "Test1"
      echo -n 'CP_QUELLDATEI:              '>> $TRACEFILE 2>&1
    else
      echo "Test2"
      echo "Fehler!!! CP_QUELLDATEI $CP_QUELLDATEI existiert nicht oder ist ungültig!" | tee -a $LOGFILE 
      echo "Die CP_QUELLDATEI $CP_QUELLDATEI konnte in der Lieferung nicht gefunden werden oder ist eine ungültige Datei und wurde daher nicht nach $CP_ZIELPFAD kopiert." >> $TRACEFILE 2>&1
      KOPIERE=0
    fi #if [ -s $CP_QUELLDATEI ]
    
    echo "Test3"
    BACKUPDIR=$BAKDIR$ARBEITSPAKET/Filebackups/$SERVER/$4
    echo $BACKUPDIR
    
    if [ -d $BACKUPDIR ]; then
      echo "Test4"
      BAKDIR_angelegt=0
    else
      echo "Test5"
      mkdir -p $BACKUPDIR #>> $TRACEFILE 2>&1
      BAKDIR_angelegt=1
    fi
    
    if [ $KOPIERE -eq 1 ] ; then
      echo "Test6"
      if [ -d $BACKUPDIR ]; then #Kopieren nur, wenn Backupverzeichnis angelegt werden konnte
        echo "Test7"
        #################################################################
        ## BACKUP der ZIELDATEI
        #################################################################
        (
        echo "
          open $SERVER
            user $USER $PW
              ! print -n Es werden Daten vom Server $SERVER uebertragen...
              cd $FREIGABE
              lcd $LIEFERUNGSPFAD
              get $CP_ZIELDATEI $BACKUPDIR/$2
                ! print "fertig"
                  close
                    "
        )| ftp -i -n -v
        #################################################################
          
        if [ $result -eq 0 ] ; then
          echo "Test8"
          if [ -s $BACKUPDIR'/'$2 ]; then
            echo "Test9"
            if [ $NO_DEBUG -eq 0 ] ; then #nur wenn Debugausgabe erwünscht
              echo "Test9"
              echo -n " $CP_ZIELDATEI: Backup angelegt..."
            fi
          else
            echo "Test10"
            echo "!!! Fehler. Backupdatei konnte nicht kopiert werden oder ungültige Größe 0. Abbruch Kopiervorgang! Siehe Tracefile fuer Details!" | tee -a $LOGFILE 
          fi
        else
          echo "Test11"
          if [ $BAKDIR_angelegt -eq 1 ] ; then
            echo "Test12"
            echo $BACKUPDIR
            rm  -Rf $BACKUPDIR #backup dir nochmals entfenen
          fi
        fi #if [ $result -eq 0 ]
        
        #nun Datei auf SERVER übertragen
        echo "Test13"
        echo "Kopiere : "$KOPIERE
        if [ $KOPIERE -eq 1 ] ; then
          echo "Test14"
          #################################################################
          ## FTP-Transfer der Quelldatei zum SERVER
          #################################################################
          (
          echo "
            open $SERVER
              user $USER $PW
                ! print -n Es werden Daten auf den Server $SERVER uebertragen...
                cd $FREIGABE
                lcd $LIEFERUNGSPFAD
                put $CP_QUELLDATEI $CP_ZIELDATEI
                  ! print "fertig"
                    close
                      "
          )| ftp -i -n -v
          #################################################################  
          result=$? #Resultat vom Kopieren pruefen
          if [ $result != 0 ] ; then
            echo "Test15"
            echo "!!! Fehler. $CP_QUELLDATEI konnte nicht auf $1 kopiert werden (ftp fehlgeschlagen). Siehe Tracefile fuer Details!" | tee -a $LOGFILE 
          else
            echo "Test16"
            if [ $NO_DEBUG -eq 0 ] ; then #nur wenn Debugausgabe erwünscht
              echo " ...File $2 kopiert..."
            fi
          fi
        fi #if [ $KOPIERE -eq 0
      else
        echo "!!! Fehler. Backupverzeichnis konnte nicht angelegt werden. Abbruch Kopiervorgang! Siehe Tracefile fuer Details!" | tee -a $LOGFILE 
      fi #[ -d $BACKUPDIR ]
    fi #if [ $KOPIERE -eq 1 ]  
  else #if [ $LIEFERUMFANG -ne 1 ]
    . Lieferschein_Eintrag "$CP_ZIELDATEI"
  fi        
else #if [ $LIEFERSCHEIN -ne 1 ]
  TEMPFILE=$LIEFERSCHEIN_FILES
  AUSGABESTRING="$SERVER: "$2
  . Lieferschein_Eintrag "$AUSGABESTRING"
  #echo $AUSGABESTRING
fi #if [ $LIEFERSCHEIN -ne 1 ]

das problem, das ich jetzt noch habe, ist das prüfen, ob eine datei existiert.
die zielverzeichnisse kann ich nun auch ansteuern. verzeichnisse sind vom
ftp-dienst auf windows "freigegeben" worden.
kann ich die beiden grossen echo-kommandos in denen die ftp-verbindung
und der dateitransfer vollzogen werden durch ein einmaliges connecten und
disconnecten ersetzen?

wäre euch für tips sehr dankbar.

viele grüsse
beckham
 
Hallo backham,
wir benutzen in unserer Firma die Software "Sharity" damit mounten wir unter AIX, Solaris, Linux usw. einfach ein Windowsverzeichnis.
Der Vorteil ist du kannst dann ein Skript basteln, das neue Datei (oder auch Datein mit einem belibigen Suchmuster (Reguläre Ausdrücke)) aus deiem Unix Verzeichnis in das Win-Verzeichnis kopiert oder verschiebt....
Diese Lösung kostet etwas da Sharity keine GPL-SW ist aber wenn eure Firma keien Samba-Freigaben haben möchte....


Cu @ll
H_E_X_E_R
 

Ähnliche Themen

Welches Linux/Unix für ehemaligen OSX Nutzer?

Shell Skript zum automatischen Aufräumen von doppelten Ordnern

Samba Update von 3.2.5 auf 3.5.6 - Probleme beim Server Browsen

Samba als PDC

Idee und Frage: Knoppix ohne CD booten

Zurück
Oben