• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Script für Server-upload schreiben

logic88

Newbie
Hallo!


Ich habe vor, mir eine Routine zu schreiben, welche über das FTPclient-Programm "ftp" zyklisch alle 2 sec. eine Textdatei an den Server "synchronisiert". Anders wird es wohl nicht gehen, wenn die auf dem Server gespeicherte Textdatei den Wert ändern soll.

Wie kann ich das in der Console verwirklichen und wie kann ich es so einbinden, dass das Script (+FTPclient) automatisch beim Starten von Suse linux startet?
 

tkbah

Member
das alle 2sec, kannst du mit crontab einrichten (da crontab mit linux automatisch startet)

hier eine seite mit denn ftp befehlen auf der Konsole

http://www.pc-magazin.de/praxis/cm/page/page.php?table=pg&id=476


greets TK
 

Gimpel

Guru
Cron kennt keine Sekundengenauigkeit.

Da musst du vermutlich den ftp befehl entweder so alle zwei Sekunden laufen lassen, ala
Code:
while true; do echo foo; sleep 2; done
Oder du schreibst ein script das den Befehl in einer Minute 29x ausführt alle 2 Sek. und steuerst das mit cron.
Code:
for ((i=1;i<30;i+=1));do echo $i; sleep 2;done
 
OP
L

logic88

Newbie
Danke erstmal für die Antwort, leider kann ich aber mit meinem bisherigen Wissensstand euere Gedankengänge nicht verstehen.... :(


Wo schreibe ich denn die...

while true; do echo foo; sleep 2; done

..rein? ich nutze das "ftp"-FTP-client-programm an meinem linux-rechner. das ist schön simpel. Schreibe ich das in eine config-datei von diesem"ftp"-ftp-programm?

Was bedeutet im zweiten Code das $i? und wo finde ich den befehl, dass es 29x in der Minute das FTP-client programm öffnen, die datei hochladen und wieder schließen soll?

Danke
 

Gimpel

Guru
Also für scripting eignet sich ncftp wesentlich besser. Für den upload ncftpput. Das "echo foo", bzw das "echo $i" im 2. Beispiel ersetzt du mit dem ncftpput command.

Ich würde aber zunächst mal hier anfangen:
http://www.selflinux.org/selflinux/html/shellprogrammierung.html

PS: wenn du keine Möglichkeit hast auf der Kiste ncftp zu installieren, musst du mit ftp arbeiten. Hier was brauchbares zu batch-ftp:
http://sysadminscorner.uherbst.de/dateitransfer/ftp.html
 
OP
L

logic88

Newbie
ok danke erstmal für deine schnelle Antwort.


Nun habe ich mal eine Frage zu "ftp", auch wenn du "ncftp" vorschlägst: wie scriptet man dann so ein Problem:

beim Starten von ftp muss man # ftp home.arcor.de eingeben. darauf hin ist das programm "ftp" geöffnet und es können NUN erst weitere Parameter eingegeben werden, wie z.B. der Username und das Passwort des zu verbindenden Servers.
Ich kann aber ja in einem Shellskript nur "eine Zeile" eingeben die etwa wie folgt lautet # ftp home.arcor.de Username Passwort. Gibt es da eine Möglichkeit, ohne erst wie hier das ftp starten zu müssen und DANN weitere eingaben zu machen, gleich alle wichtigen Parameter in eine Zeile schreiben?

Wie würde das bei mir (mit ncFTP oder FTP) aussehen?

Vielen Dank
 

Gimpel

Guru
logic88 schrieb:
ok danke erstmal für deine schnelle Antwort.


Nun habe ich mal eine Frage zu "ftp", auch wenn du "ncftp" vorschlägst: wie scriptet man dann so ein Problem:
Gimpel schrieb:
PS: wenn du keine Möglichkeit hast auf der Kiste ncftp zu installieren, musst du mit ftp arbeiten. Hier was brauchbares zu batch-ftp:
http://sysadminscorner.uherbst.de/dateitransfer/ftp.html
Da ist ein prima Beispiel wie man es mit ftp macht. ^^

Hier die ncftp manpage:
http://www.ncftp.com/ncftp/doc/ncftpput.html

Code:
#!/bin/sh
while true; do 
   ncftpput -u <username> -p <passwort> -V -DD ftp.server.tld /ziel/verzeichnis /pfad/zur/lokalen/datei.txt
   sleep 2
done
 
OP
L

logic88

Newbie
ok, dann mache ich das so mit deinem codebeispiel:

Code:
#!/bin/sh 
while true; do 
   ncftpput -u <username> -p <passwort> -V -DD ftp.server.tld /ziel/verzeichnis /pfad/zur/lokalen/datei.txt 
   sleep 2 
done

Aber: wo schreibe ich den Code nun rein? kommt das nun in die "crontab"?

Danke!
 
OP
L

logic88

Newbie
ich habe nun nochmal den von dir geposteten Code durchgelesen.


Zum öffnen der Crontab muss ich folgenden Befehl eingeben?! (laut Link):

http://de.gentoo-wiki.com/Crontab

Code:
crontab -e

Das bedeutet, da immer die X.te Minute einer Stunde eingegeben wird, dass ich 59 Zeilen mit unten genanntem Code eingeben muss mit der jeweiligen Minute der Stunde. (Minute 1, Minute 2, Minute 3,....) oder?
Würde ich dann also nur eine Zeile Code in dei Crontab schreiben, so würde das Skript in der x.ten Minute 29x (alle 2sec) ausgeführt werden.


Er würde dann in der Crontabelle so eingetragen sein müssen:


Code:
for ((i=1;i<30;i+=1));do ncftpput -u <username> -p <passwort> -V -DD home.arcor.de/   /etc/solldaten/text.txt ; sleep 2;done

oder?

- Wie speichere und finde ich die Crontab-Tabelle?
- Wie führe ich die Crontabelle aus?

Danke![/code]
 

Gimpel

Guru
Nein. Ich würde es nicht über cron steuern. Wenn man es recht überlegt, war die Idee mit cron total sinnlos, da der ftp-command sicher länger als eine Sekunde braucht bis er durch ist, und somit das mit 29mal/min + 2 sek sleep nicht klappt, bis cron schon die nächste Runde anschmeißt.

Nimm die while-do Schleife, schreibs in ein script, und führ es aus. Das läuft dann einfach als Prozess im Hintergrund. Und lies dir die ncftpget manpage nochmal durch. Das passwort schreibt man nicht einfach in ein Script. Das war nur als simples Beispiel gedacht.
 
OP
L

logic88

Newbie
ok dann schreibe ich es in ein normales Skript.


wo ich das skript dann speichere ist eigentl. egal oder?

ausführen tu ich es mit ./<Dateiname>.sh

Wie aber mach ich das mit dem Passwort, wie du geschrieben hast, damit es nicht im shell-skript steht, bzw verschlüssetl?


Skript würde dann so aussehen?!

Code:
#! /bin/bash
#Programm ftp_updater.sh


while true; do 
   ncftpput -u <username> -p <passwort> -V -DD ftp.server.tld /ziel/verzeichnis /pfad/zur/lokalen/datei.txt 
   sleep 2


danke
 

Gimpel

Guru
Das mit dem Passwort steht in der Manpage. -c und so. Auch den Rest anschauen, ob es so passt, -DD löscht das lokale file.
 
OP
L

logic88

Newbie
ok, noch eine frage, bevor ich es dann zuhause probieren werde ;)

was ist mit "zielverzeichnis" gemeint?

ich möchte es auf den server home.arcor.de mit dem benutzernamen "peterlein" laden, auf das root-Verzeichnis des Servers.

Die Textdatei befindet sich unter /root/test.txt



DAnke
 

Gimpel

Guru
logic88 schrieb:
was ist mit "zielverzeichnis" gemeint?

ich möchte es auf den server home.arcor.de mit dem benutzernamen "peterlein" laden, auf das root-Verzeichnis des Servers.
Da hast du dir die Frage schon selbst beantwortet ;)
 
OP
L

logic88

Newbie
ah sorry :) stimmt.... muss ich dann also den Bereich im Script freilassen?!

also etwa so:

Code:
while true; do 
   ncftpput -u peterlein -p SagIchNet -V -DD home.arcor.de  /root/test.txt
   sleep 2 
done

Woher weiß dann linux, dass das "/root/test.txt" nicht zu "home.arcor.de" gehört? Es wird ja lediglich durch ein Leerzeichen im Code getrennt?!

ich weiß ich bin dumm - . -
 

panamajo

Guru
logic88 schrieb:
Ich habe vor, mir eine Routine zu schreiben, welche über das FTPclient-Programm "ftp" zyklisch alle 2 sec. eine Textdatei an den Server "synchronisiert".
Alle 2s? Wozu soll das gut sein?
Ich glaube kaum dass die Admins von home.arcor.de das lustig finden werden...
Mal abgesehen davon dass die Datei bei der "Lösung" mit ncftpput immer übertragen wird (also auch wenn sich gar nichts geändert hat oder wenn die Datei gerade verkrüppelt ist).
 

Gimpel

Guru
Hast du dir je die Mühe gemacht, die ncftpput manpage mal zu lesen, und evtl. auch zu verstehen? :shock:

ncftpput -f login.cfg [options] remote-directory local-files...
"remote-directory" ist halt dann /

Über den Sinn warum alle 2 sek wollte ich garnichtmal nachdenken. Error handling bezüglich "file is busy" ist auch noch so ein Thema, aber mei, wenn's schee macht.. :p
 
OP
L

logic88

Newbie
Alle 2 Sekunden deswegen, weil ich Messdaten (siehe meinen Thread in "Hardware" -> RS232) aktuell an den Webserver übermitteln will.

Gerne nehme ich auch eine andere Möglichkeit in Kauf, mit der ich aktuelle Daten an meinen Webserver übertrage um diese im Netz zu veröffentlichen.


Danke
 

Gimpel

Guru
Langt es nicht die alle in einer Datei zu sammeln, und diese Datei dann jede Minute oder alle 5 auf den Server zu schieben?
 
OP
L

logic88

Newbie
naja ich möchte meiner Freundin ein Webinterface machen, welches diese textdatei auswertet und grafisch und somit in Echtzeit einen Drehzahlmesser im Browser darstellt.

Das ist auch der Grund warum ich mir zur Zeit einen Apache-Server einrichte, damit ich keine Probleme mit meinem Arcor-Provider bekomme, da ich zu oft connecte und disconnecte. Auf meinem eigenen Webserver darf ich ja tun und lassen was ich will....
Also er sollte mindestens alle 5 sekunden aktualisieren.

Sorry dass ich so frage, aber ist das nicht ein alltägliches Problem eines jeden Wetterdienstes, welcher Messdaten zeitgleich übermittelt bzw. veröffentlicht?


Danke
 
Oben