Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell File per FTP Senden Fehler
Hallo,
ich habe euch per google gefunden da ich jetzt schon 5 Stunden am rumprobieren bin und einfach keine Lösung für mein Problem finde und ich einfach nicht mehr weiter weiß.
Ich habe einen Server auf diesen werden täglich Dateien in ein Verzeichnis kopiert, die möchte ich nun per Shell Script und in Verbindung mit einem Cron auf einen weiteren Server kopieren.
Als Grundstruktur von meinem Shell Script habe ich folgende Variante gewählt:
#!/bin/bash
cd /home/u/user08/public_html/otr
I=0
# Die 3 steht fuer hole alles der letzten 3 Tage, was ich noch nicht habe.
while [ $I -lt 3 ]
do
DATUM=`date --date "-$I day" '+%y.%m.%d'`
ncftpput -u user -p passwort ftphost /html/files /home/u/user08/public_html/otr/datei_${DATUM}_*.zip
I=`expr $I + 1`
done
Die Schleife habe ich eben zur Sicherheit eingebaut, falls mal aus unerklärlichen Gründen eine Datei nicht richtig verschoben werden sollte dann direkt am nächsten Tag die Datei mit rüber kopiert werden soll.
Die Datum Variable sollte eigentlich klar sein, dass "*" ist dafür da, mir alle Dateien mit der Datei_Datum_ Grundstruktur rüberzukopieren, da es mehrere Dateien dieser Art auf dem Server gibt, also zb
datei_${DATUM}_1.zip
datei_${DATUM}_irgendeintext.zip
datei_${DATUM}_hio890.zip
wenn ich den befehl per ncftp manuell ausführe dann geht alles wunderbar, bloß eben in dem Shell geht es nicht, folgende Fehlermeldung wird mir gebracht:
for reading: No such file or directory.g.de/public_html/otr/datei_06.03.01_*.zip
: could not open file.ining.de/public_html/otr/datei_06.03.01_*.zip
for reading: No such file or directory.g.de/public_html/otr/datei_06.02.28_*.zip
: could not open file.ining.de/public_html/otr/datei_06.02.28_*.zip
for reading: No such file or directory.g.de/public_html/otr/datei_06.02.27_*.zip
: could not open file.ining.de/public_html/otr/datei_06.02.27_*.zip
Kann mir jemand weiterhelfen und evlt. sagen woran der Fehler liegt und was ich verbessern muss dass alles klappt?
Dankeschön
P.S
Sorry, ist mein erster Post und direkt schon ein solches Problem ;)
Ich denke der Stern ist das Problem.
Versuche doch mal die Dateien mit dem find-Befehl zu suchen und dann diese Ausgabe (weil sie keinen Stern mehr enthält) herzunehmen.
kleines Beispiel:
for file in `find . -name "datei_${DATUM}_*.zip"` ; do
quelle=${file}
# Bearbeitung der Datei
done
hm sorry ich kann damit nichts anfangen, ich bin auf dem bereich script programmierung absoluter anfänger :)
könntest du deinen beitrag evtl. ein bisschen ausführen so dass ich als anfänger auch damit was anfangen kann. danke :)
#!/bin/bash
cd /home/u/user08/public_html/otr
I=0
# Die 3 steht fuer hole alles der letzten 3 Tage, was ich noch nicht habe.
while [ $I -lt 3 ]
do
DATUM=`date --date "-$I day" '+%y.%m.%d'`
for file in `find . -name "datei_${DATUM}_*.zip"` ;
do
DATEI=${file}
ncftpput -u user -p passwort ftphost /html/files /home/u/user08/public_html/otr/${DATEI}
done
I=`expr $I + 1`
done
Ich hoff mal, dass es so stimmt. Ich programmier selten mit der Bash - lieber mit Perl.
hm geht leider immer noch nicht :(
jetzt habe ich folgende Fehlermeldung:
: bad interpreter: No such file or directory
@ caveman
kann man sowas auch per perl lösen?
Die Bash reicht hier voll und ganz aus.
ersetze mal die Zeile mit dem ncftpput mit einer Ausgabe der Variable DATEI:
echo $DATEI;
Erscheinen dabei die erwarteten Dateien?
Nein, es erscheint wie vorhin folgende Fehlermeldung:
: bad interpreter: No such file or directory
Im find-Befehl ist noch ein Fehler (der Punkt (aktuelles Verzeichnis) ist falsch)
ersetze ihn mal so:
find /home/u/user08/public_html/otr/ -name "datei_${DATUM}_*.zip"
Edit: Ich befuerchte, dass das auch nichts aendert
Edit2: Versuch mal den find-Befehl ausserhalb des Skripts
hm nein geht leider immer noch nicht, kommt immer noch die selbe fehlermeldung:
: bad interpreter: No such file or directory
so schaut jetzt die aktuelle sh file aus:
#!/bin/bash
cd /home/u/user08/public_html/otr
I=0
# Die 3 steht fuer hole alles der letzten 3 Tage, was ich noch nicht habe.
while [ $I -lt 3 ]
do
DATUM=`date --date "-$I day" '+%y.%m.%d'`
find /home/u/user08/public_html/otr/ -name "datei_${DATUM}_*.zip"
do
DATEI=${file}
echo $DATEI;
done
I=`expr $I + 1`
done
Das "for file in ..." muss drin bleiben:
Die Zeile lautet also:
for file in `find /home/u/user08/public_html/otr/ -name "datei_${DATUM}_*.zip"` ;
Probier mal, ob Du so ausserhalb vom Skript eine Ausgabe bekommst:
find /home/u/user08/public_html/otr/ -name "datei_*.zip"
Ja ich bekomme ne ausgabe, also die Files werden mir da angezeigt...
dass for file habe ich wieder eingebaut, aber er bringt mir jetzt immer noch die selbe fehlermeldung
: bad interpreter: No such file or directory
so schaut dass script jetzt aus:
#!/bin/bash
cd /home/u/user08/public_html/otr
I=0
# Die 3 steht fuer hole alles der letzten 3 Tage, was ich noch nicht habe.
while [ $I -lt 3 ]
do
DATUM=`date --date "-$I day" '+%y.%m.%d'`
for file in `find /home/u/user08/public_html/otr/ -name "datei_${DATUM}_*.zip"` ;
do
DATEI=${file}
echo $DATEI;
done
I=`expr $I + 1`
done
Bringt dieses Skript eine vernuenftige Anzeige?
#!/bin/bash
I=0
DATUM=`date --date "-$I day" '+%y.%m.%d'`
echo $DATUM
echo `find /home/u/user08/public_html/otr/ -name "datei_${DATUM}_*.zip"`
Nein leider auch nicht, immer noch selbe Fehlermeldung, hm komisch warum dies auch nicht funktioniert :(
ist es evtl. nicht einfacher ein Script zu schreiben, was einfach alle Files aus einem Ordner auf den anderen FTP-Server schiebt und schaut ob die selbe File dort schon vorhanden ist oder nicht, wenn ja dann passiert nichts ansonsten wird die file überschrieben? Geht sowas, ist sowas vielleicht einfacher? Könntest du sowas machen? Ich würde dir auch ne kleine Dankesspende per Paypal zukommen lassen ;)
So, jetzt hab ich's mal selbst ausprobiert:
In meinem Verzeichnis habe ich folgende Dateien:
~/tmp> ll /tmp/datei_*
-rw-r--r-- 1 michael users 0 2006-03-01 22:42 /tmp/datei_06.03.01_1.zip
-rw-r--r-- 1 michael users 0 2006-03-01 22:42 /tmp/datei_06.03.01_2.zip
-rw-r--r-- 1 michael users 0 2006-03-01 22:41 /tmp/datei_abc_1.zip
Mein Versuchsskript schaut so aus:
~/tmp> cat filefinden.sh
#!/bin/bash
I=0
DATUM=`date --date "-$I day" '+%y.%m.%d'`
echo $DATUM
echo `find /tmp -name "datei_${DATUM}_*.zip"`
und die Ausgabe so:
~/tmp> sudo ./filefinden.sh
06.03.01
/tmp/datei_06.03.01_1.zip /tmp/datei_06.03.01_2.zip
Bei mir geht es also.
Koennte der Fehler noch wo anders liegen?
hm also bei mir funktioniert die ausgabe überhaupt nicht, allerdings der such befehl sehr wohl... hm komisch
hast du ne idee woran dass liegen könnte?
oder könntest du mir evtl nen script schreiben was einfach alle Files aus einem Ordner auf den anderen FTP-Server schiebt und schaut ob die selbe File dort schon vorhanden ist oder nicht, wenn ja dann passiert nichts ansonsten wird die file überschrieben. könntest du sowas machen? wäre riesig nett, würde dies auch mit ner gegenleistung belohnen, geld per paypal oder sowas...
Was heißt bei Dir der such Befehl funktioniert?
Welche Ausgaben bekommst Du?
Ich kann Dir mal ein paar Tipps geben:
Hier mal ein Link zu einer guten Beschreibung über die Shell-Programmierung:
http://www.netzmafia.de/skripten/unix/index.html
Im Kapitel 8.7.1 findest Du z.B. wie man feststellt, ob eine Datei vorhanden ist:
test -e file
So schwierig sollte das Problem nicht sein.
Einfach mal etwas rumprobieren ;)
also wenn ich eingebe:
find /home/u/user08/public_html/test -name "datei_06.03.01.zip"
dann bekomme ich eben die ausgabe:
/home/u/user08/public_html/test/datei_06.03.01.zip
aber wenn ich eben dass shell script ausführen möchte kommt eben immer die selbe fehlermeldung, warum auch immer, was ich sehr komisch finde
Das versteh ich nicht.
Das muss doch gehen.
Und wie sieht's aus, wenn Du ein Skript erstellst und darin nur diesen einzigen Befehl hast:
find /home/u/user08/public_html/test -name "datei_06.03.01.zip"
#!/bin/bash
find /home/u/user08/public_html/test -name "datei_06.03.01.zip"
so schauts aus, dass kommt als fehlermeldung zurück:
root:/home/u/user08/public_html/test # ./shell4.sh
: bad interpreter: No such file or directory
Kann es sein, das die Bash auf dieser Maschine gar nicht drauf ist?
mach mal:
ll /bin/bash
und
whereis bash
bei Befehl1:
-rwxr-xr-x 1 root root 485212 Mar 19 2005 /bin/bash
bei Befehl2:
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
Woran kann ich dass nun sehen obs drauf ist oder nicht? und ggfs aktualisieren?
passt schon.
Was bringt folgendes:
ll /home/u/user08/public_html/test/shell4.sh
Sind die Rechte richtig?
Was passiert bei:
root:/home/u/user08/public_html/test # sh shell4.sh
beim ersten passiert folgendes
-rwxrwxrwx 1 user828c www 78 Mar 1 23:36 /home/u/user08/public_html/test/shell4.sh
beim zweiten passiert folgendes:
sh shell4.sh
: command not found
/home/u/user08/public_html/test/datei_06.03.01.zip
Also findet das Skript etwas - siehe Zeile 3.
Allerdings verstehe ich die 2.Zeile überhaupt nicht.
Welcher Befehl soll hier nicht gefunden werden?
verstehe ich eben auch nicht, es steht ja nur folgendes in der bash datei:
#!/bin/bash
find /home/u/user08/public_html/test -name "datei_06.03.01.zip"
Und die Datei ist vorhanden.
Also macht folgendes eine korrekte Ausgabe:
ll /home/u/user08/public_html/test datei_06.03.01.zip
Ich versteh's nicht?
Warum sollte ein Befehl normal funktionieren und innerhalb eines Skripts gibt's einen Fehler?
Hast Du zu dem Verzeichnis die richtigen Zugriffsrechte?
ja ich führe alles unter root aus, also daran kann es nicht liegen...
hm ich nämlich auch nicht, sehr komisch, ich geh jetzt nochmal die ganze konfiguration durch
Hast Du vielleicht etwas anderes als Bash eingestellt?
Was ich mir allerdings nicht vorstellen kann, weil die erste Zeile explizit darauf hinweist.
Entfern sie trotzdem mal. Dann hast Du also nur noch eine Zeile mit dem find-Befehl, der ja außerhalb des Skripts funktioniert.
Starte dann mit einem der folgenden:
sh skript
zsh skript
bash skript
csh skript
Hast Du denn überhaupt Linux, was ich hier mal so vermute, und welche Version?
Ja klar habe ich Linux, Suse 9.3
hm nein tut sich überhaupt gar nichts...
Neuer Versuch:
Jetzt mit ls statt mit find.
Versuch es erst mal so:
#!/bin/bash
I=0
DATUM=`date --date "-$I day" '+%y.%m.%d'`
echo $DATUM
for FILE in `ls /home/u/user08/public_html/otr/datei_${DATUM}_*.zip`
do
DATEI=$FILE
echo $DATEI
done
Und wenn's klappt, so:
#!/bin/bash
I=0
# Die 3 steht fuer hole alles der letzten 3 Tage, was ich noch nicht habe.
while [ $I -lt 3 ]
do
DATUM=`date --date "-$I day" '+%y.%m.%d'`
for FILE in `ls /home/u/user08/public_html/otr/datei_${DATUM}_*.zip`
do
DATEI=$FILE
echo $DATEI # zur Kontrolle
ncftpput -u user -p passwort ftphost /html/files ${DATEI}
done
I=`expr $I + 1`
done
schaut schon mal besser aus :) aber trotzdem immer noch folgende fehlermeldung:
: command not found
: command not found
'hell4.sh: line 12: syntax error near unexpected token `do
'hell4.sh: line 12: ` do
was mich auch wundert ist dass hell4.sh da der datei name shell4.sh lautet
Hat wenigstens die erste Variante funktioniert?
Das mit dem 's' hätte ich dann kappiert, wenn es ein 'ß' gewesen wäre.
Aber so, das s ist doch ein ganz normaler Buchstabe.
Sehr kurios.
@gulli: sag mal mit welchem editor erstellst du deine script files? kann es sein dass du das unter windows machst? es schaut fast so aus als ob da unsichtbare steuerzeichen drin wären...
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.