caiusjuliuscaesar
Anmeldungsdatum: 20. Januar 2009
Beiträge: 307
|
Hallo, ich möchte cron-gesteuert Dateien von A nach B hochladen. Mein Skript sieht bislang so aus (in Auszügen): for i in *.txt
do
ftp -n -i $SERVER user $USERNAME -p $PASSWD cd $ZIEL mput $QUELLE/$i
done
Das funkioniert so aber nicht. Was ist falsch?
Könnte ich nicht auch in eine ftp-Skriptdatei eine Anzahl von Kdos schrieben, die nacheinander auzsgeführt werden? Gruß, CJC PS: kann mir jemand einen Link nennen, unter dem ich ftp-Skripte nachvollziehbar erklärt finde?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17622
Wohnort: Berlin
|
Kdos? MS-Dos, DrDos und freedos kenne ich, aber Kdos? Wie auch immer - man ftp sollte Dir sagen, ob ftp Parameter erlaubt, und wenn ja, welche. Mit einer Datei ~/.netrc kannst Du für einen Server Usernamen und Passwort festlegen - das solltest Du aber nur tun, wenn Du der einzige bist, der Zugang zu dem Rechner hat, und der Login für Dritte nicht interessant ist. Womöglich kannst Du die Kommandos via stdin übergeben:
echo "cmd1; cmd2; ... " | ftp param1 param2
oder mit einem expect-Script. Zuerst solltest Du es nur mit einer Datei versuchen, bevor Du ganze Ordner kopierst. Jedenfalls sehe ich in Deinem Script nichtmals die Idee, wie die 2. Datei übertragen werden könnte. Gibt es vielleicht die Möglichkeit die Daten per scp zu übertragen? Da kannst Du für jede Datei das Ziel angeben, ohne cd benutzen zu müssen.
|
Karl-Albert_Turban
Anmeldungsdatum: 4. März 2006
Beiträge: 303
Wohnort: Leonberg
|
Hallo im folgenden Link kannst du die gängigen FTP Kommandos mit Beispielen finden. http://www.tu-freiberg.de/urz/mitteilungen/mittheft/feb97/feb972.html Ein FTP Skript ist eine Textdatei, die eine Abfolge von Kommandos beinhaltet. In eine Richtung Dateien zu kopieren ist sicher mit einem Skript möglich. Das Skript sollte alle Kommandos enthalten vom herstellen der Verbindung, über das Übertragen der Dateien bin hin zum Schliessen der Verbindung. Bitte beachte, dass das Skript möglicherweise Passworte für den FTP Server enthält. Daher muss diese Skript - Datei gegen unberechtigten Zugriff geschützt werden.
|
caiusjuliuscaesar
(Themenstarter)
Anmeldungsdatum: 20. Januar 2009
Beiträge: 307
|
Hallo, 1. danke,
2. mit kdos meine ich Kommandos.
3. Ich habe mein Shellsript geändert: 1
2
3
4
5
6
7
8
9
10
11
12
13 | for i in "*.jpg";
do
echo ftp -n -i $SERVER user $USERNAME -p $PASSWD cd $ZIEL mput $QUELLE/$i;
ftp -n <<EOFTP
open $SERVER
user $USERNAME $PASSWD
bin
lcd $QUELLE
cd $ZIEL
put $i
quit
EOFTP ;
done
|
Es wirft immer noch die folgende Fehlermeldung aus:
| wcftp.sh: 29: Syntax error: end of file unexpected (expecting "done")
|
Was ist falsch? Gruß, CJC
|
romanb
Anmeldungsdatum: 16. August 2008
Beiträge: 109
|
caiusjuliuscaesar schrieb:
> ftp -n <<EOFTP
> ...
> quit
> EOFTP ;
> done
>
> Was ist falsch?
lass mal die Leerzeichen vor EOFTP weg, er erkennt das Ende nicht und übergibt alles an den FTP-Server, damit findet er das 'done' das eigentlich zum Script gehört nicht mehr. Persönlich finde ich eine Lösung mit einer .netrc eleganter, aber das ist Geschmackssache (man netrc)
Du brauchst auch keine Schleife mit den FTP-Kommandos
prompt
mput *.jpeg kannst Du alle JPEG's auf einmal übertragen. Hier ist es unsinnig für jede Datei eine FTP-Verbindung zu öffnen. Gruß
Roman
|
caiusjuliuscaesar
(Themenstarter)
Anmeldungsdatum: 20. Januar 2009
Beiträge: 307
|
Hallo Roman, danke. Ich benutze eine Schleife mit separatem Verbindungsauf- und -abbau, weil ich das Skript cron-gesteuert aufrufen möchte, nicht weiß, wie die Dateien des Verzeichnisses im einzelnen heißen, sie aber nach der Übertragung löschen will. Wie sollte ich einen Dateinamen aus einem Shellscript, das cron-gesteuert aufgerufen wird, an ein .netrc-Skript übergeben? Denn nur das Shellsript kennt den Dateinamen. Die Leerzeichen vor dem endenden EOFTP hatte ich gestern schon mal testweise weggelassen, kein Erfolg... Momentan komme ich aber an den Server nicht ran, vermutlich kommt er morgen früh wieder hoch. Gruß, CJC
|
caiusjuliuscaesar
(Themenstarter)
Anmeldungsdatum: 20. Januar 2009
Beiträge: 307
|
Hallo nochmal, ich vermute, daß ich irgendein nicht druckbares Steuerzeichen in meinem Skript hatte. Ich habe es zwar nur mit localhost ausprobiert, aber jetzt funktiponiert es, nachdem ich die Zeilen mit EOFTP gelöscht und wieder abgeschrieben hatte. Gruß, CJC
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17622
Wohnort: Berlin
|
caiusjuliuscaesar schrieb: Wie sollte ich einen Dateinamen aus einem Shellscript, das cron-gesteuert aufgerufen wird, an ein .netrc-Skript übergeben?
Das sollst Du gar nicht. In .netrc legst Du für einen Server usernamen und passwort fest. Wenn Du mit ftp Dich zu einem Server, der in .netrc gelistet ist, verbindest, werden Username und Passwort aus der Datei genommen, und Du mußt sie nicht manuell oder sonstwie übergeben.
|
romanb
Anmeldungsdatum: 16. August 2008
Beiträge: 109
|
caiusjuliuscaesar schrieb:
Ich benutze eine Schleife mit separatem Verbindungsauf- und -abbau, weil ich das Skript cron-gesteuert aufrufl. Wie sollte ich einen Dateinamen aus einem Shellscript, das cron-gesteuert aufgerufen wird, an ein .netrc-Skript übergeben? Denn nur das Shellsript kennt den Dateinamen.
Hallo, In deinem Shell Script verwendest Du ein *.jpeg , Das Skript kennt dann zwar die Namen, wenn Du dann einzelne Dateien nach der Übertragung löschen willst solltest Du auch vorher prüfen, ob die Übertragung erfolgreich war.
Innerhalb des ftp kannst aber auch mit '!' eine lokale Shell aufrufen um z.B. Dateien zu löschen. Die Möglickeit in der netrc Makros zu definieren macht dies sehr flexibel. Beispiel einer .netrc machine localhost login USERNAME password PASSWORD
macdef copy_files
bin
prompt
cd target_dir
lcd source_dir
mput *.jpeg
macdef delete files
lcd source_dir
! rm *.jpeg
Aufruf dann z.B. mit
echo "$ copy_files" | ftp localhost && echo "$ delete_files" | ftp localhost
sollte dann zuerst die Files übetragen und nach erfolgreicher Übetragung die Files lokal löschen (habs aber nicht getestet) Gruß
Roman
|
caiusjuliuscaesar
(Themenstarter)
Anmeldungsdatum: 20. Januar 2009
Beiträge: 307
|
Hallo Norman, danke für Deinen Vorschlag mit .netrc. Alerdings schlägt der Aufruf bei mir fehl:
| echo "$ copy_files" | ftp 10.8.0.10 && echo "$ delete_files" | ftp 10.8.0.10
ftp: connect: Connection refused
'copy_files' macro not found.
ftp: connect: Connection refused
'delete_files' macro not found.
|
Offensichtlich findet mein Aufruf die .netrc nicht (die ich im Homeverzeichnis habe).
Ich habe Deine .netrc und Deinen Aufruf der Makros übernommen, habe aber natürlich überall bei localhost die entfernte IP-Adresse und bei Username und PW die echten PW usw. eingegeben. Woran liegt der Fehler? Gruß, CJC
|
romanb
Anmeldungsdatum: 16. August 2008
Beiträge: 109
|
caiusjuliuscaesar schrieb:
Offensichtlich findet mein Aufruf die .netrc nicht (die ich im Homeverzeichnis habe).
Hallo,, wahrscheinlich hast Du die Dateirechte noch falsch, die .netrc darf nur von Dir uns sonst niemanden lesbar sein, ansonsten wird dierse aus Sicherheitsgründen ignoriert. (wobei sich FTP und Sicherheit quasi ausschließt 😉 )
chmod 600 ~/.netrc
sollte hier helfen.
|
caiusjuliuscaesar
(Themenstarter)
Anmeldungsdatum: 20. Januar 2009
Beiträge: 307
|
Habe ich alles gemacht und jetzt läufts. Außerdem war zu beachten, daß auf dem lokalen Rechner absolute Dateipfade erlaubt sind und akzeptiert werden. Auf dem entfernten Rechner sind nach meinber Erkenntnis nur relative Dateipfade möglich, wahrscheinlich, weil es dem ftp-Skripot nicht erlaubt ist, das ganze Dateisystem von der Root aus aufzurollen. Gruß und danke, CJC
|
romanb
Anmeldungsdatum: 16. August 2008
Beiträge: 109
|
Hallo, eine Anmerkung noch, was mir noch aufgefallen ist. Aufpassen mit dem löschen der Dateien, es funktioniert nicht ganz so wie ich das gedacht habe.
Eigentlich sollte das && bewirken, dass die Löschung nur aufgerufen wird wenn die Übetragung OK war, In deinem Auszug echo "$ copy_files" | ftp 10.8.0.10 && echo "$ delete_files" | ftp 10.8.0.10
ftp: connect: Connection refused
'copy_files' macro not found.
ftp: connect: Connection refused
'delete_files' macro not found. ist allerdings zu sehen, dass die Löschung trotzdem aufgerufen wird, hier unbedingt aufpassen, die nicht übertragenen Files werden gelöscht wenn z.B. die FTP Verbindung schiefgegangen ist. Ich habs selber mal kurz getestet, egal, welchen Fehler das FTP bringt, man kann wohl keinen Fehlercode abfragen. Hier ist es besser noch eine kurze Nachfrage einzubauen, damit man die Übetragung kontrollieren kann. echo "$ copy_files" | ftp 10.8.0.10
echo "Files löschen j/n ? )" ; read a
if [ "$a" = "j" ] ; then
echo "$ delete_files" | ftp 10.8.0.10
else
echo "Files werden behalten"
fi Alternativ müsste man den Output des FTP parsen um Fehler feststellen zu können. Gruß
Roman
|