#

FTP on demand

Das kennt man: wenn man von einem etwas weiter entfernten Server (womöglich aus Übersee) eine große Binärdatei holen will, wird die maximale Übertragungsrate nicht mehr richtig ausgenutzt - besonders bei ISDN passiert das schnell. Nun hat man sich keinen ISDN-Anschluß legen lassen, um dem Fernmeldeanbieter das Geld in den Rachen zu werfen, und außerdem benutzen wir das beste Betriebssystem der Welt :-) Und zumindestens Leute, die einen Uni-Zugang haben, und dort ein paar Unix-Befehle loswerden können, können hier tricksen.

## Die Theorie

Aber wie? Der Trick besteht darin, daß die Datei nicht sofort und direkt downgeloadet wird, sondern daß man das zunächst den Server an der Uni machen läßt. Nach einiger Zeit holt man sich die gewünschte Datei dann von dort - die Verbindung zum Uniserver ist ja in der Regel so gut, daß die maximale Übertragungsrate voll ausgenutzt wird. UNIX kennt den Befehl `nohup`, mit dem man Befehle ausführen kann, ohne eingeloggt zu sein - das ist die Voraussetzung. Man kann sich also beim Provider einloggen und folgende Befehlssequenz eingeben:

      provider:# nohup ftp -i ftp.leo.org &
      provider:# exit
      connection closed by foreign host.
      root:# _

Das ganze dauert nicht mehr als ein paar Sekunden, eine Telefoneinheit wurde der guten Sache geopfert.

Allerdings muß man etwas Vorarbeit leisten, denn `ftp` ist ein interaktives Programm, welches zur Arbeit eine ganze Menge Informationen benötigt (zum Bleistift, was es denn holen soll). Die Interaktivität kann man ihm abgewöhnen, dafür ist die Option "-i" da. Die Informationen muß man trotzdem übergeben, und das kann man, indem man eine Datei `.netrc` beim Provider hinterlegt, in dem alles das drinsteht, was ftp tun soll. (Gibt man als Option "-n" an, wird diese Datei nicht beachtet!)

So könnte die Datei `.netrc` aussehen, wenn man sich beispielsweise den Kernel 2.0.7 (immerhin mehr als 5 Megabyte!) vom Server bei LEO.ORG holen will:

    provider:~/.netrc
      machine ftp.leo.org
      login anonymous
      password <eigene@email.adresse>
      macdef init
        lcd /usr/src
        cd /pub/comp/os/linux/Linus/v2.0
        bin
        get linux-2.0.7.tar.gz
        close
        quit

So kann man sich für jeden Server einen Eintrag machen. Diese Datei muß vor dem `nohup ftp` im Heimatverzeichnis beim Provider abgelegt werden. Eine Stunde später kann man sich den Kernel mit Höchstgeschwindigkeit beim Provider abholen. Schön, gell?

## Automatisierung

So. Nun wollen wir das automatisieren. Hierzu muß natürlich wieder der cron herhalten, der die datenintensive Übertragung in die billigen Nachtstunden verlegt.

... Aber daran arbeite ich noch - laßt Euch überraschen!

Ich hatte bisher keine Zeit für weitere Forschungen - aber einige Leute haben mir geschrieben.

Uwe Bonnes <bon@elektron.ikp.physik.th-darmstadt.de> schrieb:

    Hallo,

    zu "FTP on Demand " solltest Du auf "ncftp" verweisen. Ich oeffne mit "nohup
    ncftp" das Programm, oeffne den Server, denn ich brauchte, waehle mit
    "Tab"-Expansion das File aus, das ich will, starte den Download. Ein CTRL-Z
    und "bg" bringen den Download in den Hintergrund und mich auf die
    Kommandozeile, so das ich den Connect beenden kann.

Gunnar Larisch <Gunnar.Larisch@lpr.e-technik.tu-muenchen.de> schrieb:

    anscheinend hast Du auch ISDN, da Du so schöne Anleitungen geschrieben
    hast. Ich hab da paar schöne Skripten, die Dich vielleicht interessieren.

    getme <Server> <Dir> <File>
    Per cron muss dann noch cronftp gestartet werden. Am nächsten Tag kannst
    Du Dir Dein File abholen.

    getfrom ist vielleicht auch ganz nützlich.

    -----------getme--------------
    #!/usr/local/bin/bash

    # Parameters: Server Path File(s)

    FTPFILE="/tmp/.$UID.ftpjobs"
    echo Server : $1
    echo Dir    : $2
    echo "File   : $3"
    echo Jobfile: $FTPFILE

    touch $FTPFILE

    echo lcd ~/tmp/ftpjobs >>$FTPFILE
    echo open $1 >>$FTPFILE
    echo user anonymous t8231ah@sunmail.lrz-muenchen.de >>$FTPFILE
    echo bin >>$FTPFILE
    echo "cd $2" >>$FTPFILE
    echo "mget $3" >>$FTPFILE
    echo close >>$FTPFILE
    -------------------------------

    ---------getfrom---------------
    echo Hole $2 von $1...
    echo ftp -i $1 >>~/tmp/ftpjob
    echo bin >>~/TMP/ftpjob
    echo cd $2 >>~/tmp/ftpjob
    -------------------------------

    ---------cronftp--------------
    #!/usr/local/bin/bash
    FTPFILE="/tmp/.$UID.ftpjobs"
    NEWFTPFILE="/tmp/.bgjob_$UID_$RANDOM"
    mkdir ~/tmp/ftpjobs
    echo Using $FTPFILE... as $NEWFTPFILE
    mv $FTPFILE $NEWFTPFILE
    nohup ftp -in >$NEWFTPFILE &
    -------------------------------------

    Ciao Gunnar

Siggi Thoma <sthoma@twilight.rhein-neckar.de> schrieb:

    Hast Du diesbezüglich mal von FTPMAIL gehört? Vielleicht erfüllt das auch den
    gewünschten Zweck und ein bißchen einfacher.

    Schreib mal mail an ftpmail@ftp.uni-stuttgart.de
    subject HELP
    body:
    help
    quit

    ---------------
    Dieser Server der da an der Uni läuft ermöglicht es beliebige Dateien
    von jedem ftp-archive auf der Welt nach Stuttgart zu holen. Von dort
    sendet Dir der FTPMAIL-Server die Datei uuencoded als email zu. Von
    Stuttgart aus als EMAIL. Da fällt also nur die
    Übertragungsgeschwindigkeit zu Deinem Provider ins Spiel.

    Genauere Beschreibungen gibts überall im Netz. Such mal in Yahoo oder
    Altavista unter FTPMAIL.

    Tschau
    Siggi