Dateiversand leicht gemacht (oder auch der kleinste Webserver der Welt)

Status
Für weitere Antworten geschlossen.

Rain_Maker

Administrator
Teammitglied
Wer kennt das lästige Problem nicht.

Man unterhält sich via Instant Messenger und möchte seinem Gegenüber eine Datei senden und das Theater geht los.

Funktioniert der Dateiversand?

Durch die vielen unterschiedlichen Clients, die jeweils nicht jede Kombination mit jedem anderen Client bzw. jedem der vefügbaren Protokolle beherrschen, wird Dateiversand zum Glücksspiel.

Hier nun eine einfache und auch recht sichere Lösung, da im Gegensatz zum Versand direkt via Messenger nicht die ganze Zeit ein Port geöffnet wird.

Des Rätsels Lösung nennt sich "woof", ein kleines Python-Script, welches eigentlich nur eine einfache Aufgabe erfüllt, diese aber perfekt.

- Es öffnet einen kleinen Webserver und bietet eine Datei oder auch einen ganzen Ordner (welcher dann noch netterweise als tar.gz verpackt angeboten wird) an

- Der Empfänger kann mittels eines direkten Downloads mit dem Webbrowser/Downloadmanager (als Linuxer verwendet man natürlich stilecht am besten wget) seiner Wahl die Datei runterladen

und

- Anschliessend beendet sich woof automatisch und der entsprechende Port ist wieder zu.

Da das Ganze mit einem Port aus dem "Non Privileged"-Bereich > 1024 funktioniert, sind hierzu keinerlei erhöhte Zugriffsrechte nötig, jeder normale Systemnutzer kann woof verwenden.

1. Woof installieren

Es handelt sich zwar nur um ein Script, jedoch gibt es auch fertige RPM-Pakete im openSUSE Build-Service:

Index of /repositories/network:/utilities

Distribution wählen und im Ordner "noarch" wird man fündig, das RPM ist sage und schreibe knappe 7 Kilobyte groß.

Wer keine Pakete für seine Distribution findet, der kann sich das Script auch von hier besorgen:

Woof - simply exchange files

(Ausführbar machen und z.B. nach /usr/bin, /usr/local/bin oder /home/Username/bin kopieren)

2. Woof konfigurieren

Eigentlich nicht nötig, per default hört woof auf Port 8080 und bietet eine Datei genau einmal an, bevor er sich beendet.

Wer dieses Verhalten ändern will, der kann sich eine Datei .woofrc in seinem $HOME-Verzeichnis mit folgendem Inhalt anlegen.

Code:
[main]
port = [b]Port auf dem woof lauschen soll[/b] # vorzugsweise ein Port > 1024
count = [b]wie oft soll eine Datei herunter geladen werden dürfen[/b] # default ist 1
3. Woof benutzen

Die Nutzung ist denkbar einfach, für eine Datei schreibt man:
Code:
woof /Pfad/zur/Datei/Dateiname
Für einen Ordner:

Code:
woof /Pfad/zum/Ordner/
Die Ausgabe lautet dann z.B.

Code:
Now serving on http://192.168.1.100:8080/
OK, hier taucht nun das erste Problem auf, welches es zu lösen gilt.

Ich hänge hinter einem Router und woof zeigt mir die interne IP-Adresse aus dem LAN an, ich muss meinem Gegenüber aber die externe IP-Adresse geben.

Hier hilft folgendes, kleines Script (ich habe es "whatsmyip.sh" genannt)

Code:
#!/bin/bash
echo $(date) |tr '\n' ' '
echo External IP: `curl -s http://checkip.dyndns.org/ | sed 's/[a-zA-Z<>/ :]//g'`
Dieses Script entweder nach /usr/bin oder /home/Benutzername/bin kopieren, ausführbar machen (chmod 755 whatsmyip.sh) und aufrufen:

Code:
whatsmyip.sh
Do 4. Sep 04:47:02 CEST 2008 External IP: *Hier steht dann die externe IP*
Mein Gegenüber erhält von mir nun folgenden Link via Messenger:

Code:
http://Meine_externe_IP:8080/
und kann sich unter dieser Adresse die Datei abholen, z.B. mit wget:

Code:
wget http://Meine_externe_IP:8080/
Das zweite Problem, welches es zu lösen gilt, betrifft ebenfalls vor allem Nutzer, die hinter einem Router hängen und/oder einen Paketfilter laufen haben.

Hier muss der entsprechende Port freigegeben und im Router auch weiter geleitet werden, damit es funktioniert (näheres entnehme man dem Handbuch des verwendeten Routers).

Ein nettes Extra-Feature bietet woof ebenfalls noch an, gibt man

Code:
woof -s
ein, so verteilt sich woof selbst.

Da Python plattformunabhängig ist, müsste woof auch auf anderen OS laufen, sofern dort eine Python-Laufzeitumgebung installiert ist.

Bei den meisten Linux-Distributionen dürfte Python zur Standardaustattung gehören (oder ist via Paketmanager einfach nach zu installieren).

Da die Übertragung mittels http erfolgt, muss man sich keine Sorgen mehr wegen irgendwelcher Kompatibilitätsprobleme unterschiedlicher Messengerprotokolle oder unterschiedlicher Betriebssysteme der miteinander kommunizierenden Partner machen, denn http "spricht" jedes moderne OS.

Wer sagt, daß gute Software nicht auch winzig klein sein kann?

Greetz,

RM
 

Rain_Maker

Administrator
Teammitglied
Neue Version (2009-12-27) - neues Feature: woof und Upload einer Datei.

Die neuste Version von woof vom 27. Dezember 2009

Woof - simply exchange files

bietet ein nettes, neues Feature, namentlich den Upload einer Datei.

Update auf die neue Version kann entweder von Hand

= Neuste woof-Version von der oben verlinkten Webseite herunterladen und nach /usr/bin/, /usr/local/bin/ oder /home/Username/bin/ kopieren

oder über Pakete aus dem Packman-Repository

PackMan :: Informationen zum Paket woof

erfolgen (wer also Packman schon eingebunden hat, dem reicht ein "zypper install woof" oder "zypper install woof=<Version des Packman-Pakets>").

Die Vorgehensweise ist ähnlich wie zuvor beschrieben, jedoch startet nun die Person woof, die eine Datei empfangen möchte (und diese Person muß natürlich auch die sein, die Zugriff auf den entsprechenden Port von aussen zulässt).

Nach einem simplen

Code:
woof -U
kann der Gegenüber mit dem Browser seiner Wahl wie im ersten Beitrag beschrieben auf den kleinen Webserver, den woof startet, zugreifen und erhält eine Maske um eine Datei hochzuladen.

Mit w3m sieht das dann in etwa so aus:

Code:
Woof Upload

[________________]

[Upload!]



≪ ↑ ↓ Viewing <Woof Upload>
Nun kann der "Hochlader" eine Datei auswählen und mit "Upload" versenden.

Die Datei landet übrigens beim Empfänger (logischerweise) in dem Verzeichnis aus welchem "woof -U" gestartet wurde, man sollte sich als Empfänger (die/derjenige, die/der "woof -U" ausführt) also vorher in ein geeignetes Verzeichnis (Zugriffsrechte!) z.B. in seinem $HOME bewegen, ich habe mir dazu z.B. ein Verzeichnis "~/woof-Uploads" angelegt.

Code:
mkdir ~/woof-Uploads
und starte woof (damit das Chaos auf meiner Kiste nicht noch schlimmer wird :)) immer aus diesem Verzeichnis

Code:
cd ~/woof-Uploads

woof -U
Wie man woof (oder andere, einfache Webserver, die dieses Feature nicht out of the Box anbieten) mit SSL-Verschlüsselung absichern und für alle Notfälle auch ohne die Möglichkeit/Notwendigkeit einen Port zu öffnen/im Router weiter zu leiten (unter Verwendung des TOR-Netzwerks) verwenden kann, wird Gegenstand eines weiteren Tutorials sein, welches hier hoffentlich in den nächsten paar Tagen/Wochen entstehen wird, also "stay tuned".

Greetz,

RM
 
Status
Für weitere Antworten geschlossen.
Oben