Hallo Tim,
Kann mir das jemand erklären?
echo "
…
bye
" > ftp -n > ftp_$$.log
Dann schreibt der mir das doch nur in ne log-Datei oder nicht?
Meine Schuld 
Ich denke, in dem Skript ist ein Schreibfehler. Es sollte so aussehen:
#/bin/sh
# $1 is the file name
# usage: this\_script
IP\_address="ftp.server.de"
username="myname"
password="mypassword"
echo "
verbose
open $IP\_address
user $username $password
put $1
bye
" | ftp -n \> ftp\_$$.log
also die Ausgabe von echo per pipe | nach ftp. ftp erledigt seine Aufgabe und schreibt ein Protokoll in eine Logdatei ftp_$$.log. $$ = Process-ID des Skriptes, damit ein eindeutiger Dateiname erzeugt wird. So funktioniert das jetzt bei mir, sorry, hätte ich vorher genauer durchsehen müssen, war mir beim ersten Mal nicht aufgefallen.
Außerdem schreibt das Skript die Datei $1 natürlich ins Wurzelverzeichnis deines FTP-Servers, da sollte also eventuell noch ein cd $verzeichnis rein, um das flexibler zu handhaben, oder eben per put $1 $remote_file, wie in der Variante mit dem Here-Dokument, die ich bevorzuge.
Und was deine Variablen angeht, schreib sie doch erstmal mit echo aus, vielleicht stimmt da was nicht. Über deine Firewall kann ich nichts sagen, vielleicht blockt sie FTP-Aufrufe. Steht da was in den Logdateien?
Viele Grüße
Marvin