FTP Upload innerhalb eines Shell Scripts mit AVM Firmware

_Steffen_

Neuer User
Mitglied seit
27 Mai 2006
Beiträge
17
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,

ich möchte innerhalb eines Shell-Scripts was auf der FB läuft eine Datei auf eine Web-Server per FTP hochladen.

In der aktuellen AVM Firmware konnte ich leider keinen FTP Client finden.
Daraufhin habe ich mit netcat (nc) "experiementiert". Leider ist das nicht ganz trivial...

Hat jemand einen Vorschlag?

Danke,
Steffen
 
Siehe hier. Übrigens hilft Google auch dir!
 
ftpput steht bei meiner Firmware nicht zur Verfügung.

Andere Vorschläge?
 
Ich hatte schonmal so ein Skript erstellt:

Code:
mkdir -p /var/uploader
cd /var/uploader
wget http://fritz.v3v.de/busybox/busybox -O ./busybox-tools
wget http://fritz.v3v.de/ftp_uploader/ftp_uploader.sh
chmod +x *
Code:
# ./ftp_uploader.sh 

FTP Uploader
 Uploads a directory with subdirectories onto a FTP server

 usage:
 ./ftp_uploader.sh /path/to/upload
 or
 ./ftp_uploader.sh /path/to/upload [remote_path] [user] [pass] [host:port]

Die FW muss halt für die busybox passen.
 
Ich benutze die aktuelle AVM Firmware für die 7170.

Ja, netcat (nc) ist vorhanden.

Ich habe mich gestern schon einige Stunden "durch" das Internet gelesen.
Ich muss allerdings gleich vorweg sagen, dass ich mich auf Linux-System nicht heimisch fühle.

Ich war soweit gekommen, dass ich in einem Telnet Fenster mit netcat eine Verbindung zum FTP Server aufgebaut habe und mit USER, PASS, PASV, STOR einen Upload initiert habe. Aus der Rückmeldung vom PASV Kommando habe ich dann das Server-Port für die Daten ermittelt und in einem zweiten Telnet Fenster dann mit netcat die entsprechende Datei geschickt.

Das funktioniert soweit gut. Allerdings hatte ich dann Probleme diese Logik in ein (oder zwei) Shell-Script(e) zu packen. Leider habe ich dazu nichts im Internet gefunden.
Ich habe angefangen zwei Scripte zu schreiben die sich gegenseitig per named pipes (mknod <name> p) die Eingaben und Ausgaben zuschicken. Ich befürchte aber, dass ich da viel zu kompliziert denke.
 
... also eine ftp session mit zwei nc zu simulieren ist schon 'ne Herausforderung ;)

Ich sehe da zwei Möglichkeiten:
1) Einen ftp client auf die FB zu packen: Der lässt sich relativ einfach über ein shell-script steuern.
Also busybox mit ftpput installieren http://www.ip-phone-forum.de/showthread.php?t=98747&page=3 und dann im shell-script "ftpput remote-host remote-file local-file" eintragen
Die Anleitung uzr Installation der busybox (und den link von /bin/ftpput -> /bin/busybox) solltest du hier auch im Forum finden (wahrscheinlich sogar im gleichen Thread).

2) Die andere Richtung zu versuchen: Die Datei vom Webserver aus zu holen. Dazu musst du allerdings deinen USB Speicher über ftp freischalten (Sicherheitsrisiko).

Thomas
 
Zuletzt bearbeitet:
Hallo Thomas,

... also eine ftp session mit zwei nc zu simulieren ist schon 'ne Herausforderung ;)
Ja, habe ich auch gemerkt. Allerdings habe ich es gestern doch noch geschafft. Ich denke ich werde noch ein bisschen weiter daran "feilen". Ist eine ganz gut Übung zum Thema Shell-Script-Programmierung. Ich denke ich werde dann das Ergebnis hier zur Diskussion stellen...

1) Einen ftp client auf die FB zu packen: Der lässt sich relativ einfach über ein shell-script steuern.
Ja, wäre vielleicht einfacher gewesen. Ich hatte allerdings den Ehrgeiz mit "Bordmitteln" auszukommen.

2) Die andere Richtung zu versuchen: Die Datei vom Webserver aus zu holen. Dazu musst du allerdings deinen USB Speicher über ftp freischalten (Sicherheitsrisiko).
Geht in meinem Fall leider nicht, weil ich nur per FTP Client Zugriff auf den Web-Server habe (kostenloser Web-Space von 1&1 DSL).

Gruß Steffen
 
Hier nun mein Script zum FTP Upload per netcat:
Code:
#!/bin/sh
TCP_PORT=21

# Check parameter count
if [ ! $# -eq 5 ] ; then
	echo
	echo Usage: ./ftpupload.sh SERVER USER PASSWORD FILE SERVERPATH
	echo
	exit 1
fi

# Check if FILE is readable
if [ ! -r $4 ] ; then
	echo ERROR: $4 is not a readable file.
	exit 2
fi

# Split filename from path
FILENAME=$(echo $4 | sed -e 's/^.*\///g')

# Start netcat with commands
nc $1 $TCP_PORT <<END_OF_INPUT |
USER $2
PASS $3
CWD $5
PWD
TYPE I
PASV
STOR $FILENAME
QUIT
END_OF_INPUT

while read LINE ; do 
	# read output of netcat line by line and capture data port
	echo $LINE
	if (echo $LINE | grep -e '^227' >/dev/null); then
		# Calculate data port 
		PORTH=$(echo $LINE | sed -e 's/,/\n/g' | sed -n '5p')
		PORTL=$(echo $LINE | sed -e 's/,/\n/g' | sed -n '6p' | sed -e 's/[^0123456789]*//g')
		let PORT=$PORTH*256+$PORTL
		echo Upload port = $PORT

		# Send file to data port
		nc $1 $PORT <$4
	fi
done

Ich habe das Script auf meiner FB mit der Firmware 29.04.49-9710 und meinem FTP-Zugang zum 1&1 Web-Space getestet.
Es gibt bestimmt noch einiges zu verbessern => Feedback ist willkommen.

Gruß Steffen
 
Zuletzt bearbeitet:
Ich glaub ich steh heut Abend aufm Schlauch....

Aber wo trägts Du denn die Variablen für die Quelldatei, Server, Pass und Username und so weiter ein?
 
Ok...ich geh ins Bett...ist wohl besser so....:-)

THX

Der Tom
 
So, natürlich funzt das Script mit der Eingabe, war wohl doch zu viel gestern auf Arbeit....lol

So nun habe ich das Script mal in ruhe angesehen...leider erfüllt es auch nicht so ganz meinen Wünschen...

Ich müsste nicht ein ganzes Verzeichnis hochladen, sondern nur eine Datei. Ja schon klar, geht mit ftpput auch ganz einfach, allerdings kann ich mit ftpput nicht mit Wildcats arbeiten. Die Datei die ich hochladen will hat immer einen anderen Namen. Daher wollte ich *.tar.gz als Dateinamen nutzen...aber wie gesagt geht nicht.

So siehst aus:
PHP:
ftpput -v -u BENUTZERNAME -p PASSWORT SERVER  /uploadordner /var/media/ftp/uStor01/zumhochladen/*.tar.gz
Was könnte man denn da machen? Ich würd es auch gern vermeiden, dass ich für 6-8 Datein ich jedesmal mich neu am Server anmelden muss. Alle hochzuladene Datein in einen Ordner zu kopieren geht auch nicht, da ja der Zielordner nicht immer der selbe ist...Alles blöd...

Achso, im Grunde würde ich auch einen ftp client nutzen können....einfach aufm USB-Stick...da ist ja genug Platz. Ich weis nur nicht welcher, woher und so weiter...

Der Tom
 
Zuletzt bearbeitet:
Hi Tom,

also eigentlich habe ich mein Script zu geschrieben, dass es nur genau eine Datei hochlädt. Mit ganzen Verzeichnissen dürfte es nicht funktionieren.

Du kannst sogar Wildcards für den Dateinamen verwenden, wenn es genau eine Datei gibt, die auf dieses Muster passt.

z.B.
Code:
./ftpupload.sh SERVER USER PASSWORD /var/tmp/mini.* /

Kopiert bei meiner FB die Datei mini.xml auf das root Verzeichnis des FTP-Servers.

Gruß Steffen
 
Hi Tom,

willst du denn nun eine oder mehrere Dateien auf einen Rutsch übertragen?
(Deine Aussagen waren mir nicht ganz klar: "Die Datei die ich hochladen will... " und dann "dass ich für 6-8 Datein ich jedesmal mich neu am Server anmelden muss...") Für eine steht es oben, für mehrere ginge dann vielleicht ein
Code:
for x in *.tar.gz; do
ftpput -v -u BENUTZERNAME -p PASSWORT SERVER  /uploadordner $x 
done

Jörg
 
mehrere Datein mit einem rutsch...

ich werd das mal testen...

Der Tom
 
Ich habe ne Lösung...Danke für den Tip...

Der Tom
 
Kostenlos!

Statistik des Forums

Themen
248,923
Beiträge
2,305,217
Mitglieder
378,647
Neuestes Mitglied
nightdeck