POP3 Shellscript - komische Variablen
Hallo Liste, ich beginne gerade, mich mit Shellscripting auseinanderzusetzen. Ich habe mir ein kleines Script geschrieben, dass abfragen soll, wie viele Mails sich in eine bestimmten Inbox befindet. Diese sollen dann alle gelöscht (bisheriger stand...) Wenn ich mich per telnet auf dem POP3 Server einlogge und stat eingebe, bekomme ich 3 Ausgaben. In meinem Script möchte ich diese Werte mit "read" in 3 Variablen übernehmen. Das Problem an der Sache ist, dass die Variablen zwar Werte erhalten, allerdings nicht die,die ich per Telnet erhalte, sondern: ok=+OK (die stimmt) num=POP3 (sollte eigentlich die Anzahl der Mails sein x=server ready (wie schön für ihn;) ----------------------------------- #!/bin/bash CR=$'\r' x=0 stat=0 exec 3<>/dev/tcp/pop.1und1.de/110 echo user ptxxxxx-6>&3 echo pass 1Pxxxxx >&3 echo stat >&3 read ok num x <&3 #echo $num " Mails befinden sich auf dem Server" echo num= $num echo ok=$ok echo x=$x while [ $x -le $num ] do # dele $x echo dele $x >&3 x=`expr $x + 1` done echo quit >&3 exit -------------------------------------
Hallo, Am Mon, 22 Nov 2004, maX Bauer schrieb:
Wenn ich mich per telnet auf dem POP3 Server einlogge und stat eingebe, bekomme ich 3 Ausgaben.
In meinem Script möchte ich diese Werte mit "read" in 3 Variablen übernehmen.
Das Problem an der Sache ist, dass die Variablen zwar Werte erhalten, allerdings nicht die,die ich per Telnet erhalte, sondern:
ok=+OK (die stimmt) num=POP3 (sollte eigentlich die Anzahl der Mails sein x=server ready (wie schön für ihn;)
Da kommt offenbar nach dem einloggen erstmal eine Statusantwort, mach einfach noch ein read:
----------------------------------- #!/bin/bash CR=$'\r' x=0 stat=0 exec 3<>/dev/tcp/pop.1und1.de/110 echo user ptxxxxx-6>&3 echo pass 1Pxxxxx >&3
read ok ans <&3 # server antwort lesen if test "x$ok" != "x+OK"; then echo "cannot login" >&2 exit 2 fi
echo stat >&3 read ok num x <&3 [..]
HTH, -dnh -- "The only "intuitive" interface is the nipple. After that, it's all learned." -- Bruce Ediger on X interfaces.
David Haller wrote:
Hallo,
Am Mon, 22 Nov 2004, maX Bauer schrieb:
Wenn ich mich per telnet auf dem POP3 Server einlogge und stat eingebe, bekomme ich 3 Ausgaben.
In meinem Script möchte ich diese Werte mit "read" in 3 Variablen übernehmen.
Das Problem an der Sache ist, dass die Variablen zwar Werte erhalten, allerdings nicht die,die ich per Telnet erhalte, sondern:
ok=+OK (die stimmt) num=POP3 (sollte eigentlich die Anzahl der Mails sein x=server ready (wie schön für ihn;)
Da kommt offenbar nach dem einloggen erstmal eine Statusantwort, mach einfach noch ein read:
----------------------------------- #!/bin/bash CR=$'\r' x=0 stat=0 exec 3<>/dev/tcp/pop.1und1.de/110 echo user ptxxxxx-6>&3 echo pass 1Pxxxxx >&3
read ok ans <&3 # server antwort lesen if test "x$ok" != "x+OK"; then echo "cannot login" >&2 exit 2 fi
echo stat >&3
read ok num x <&3 [..]
HTH, -dnh
Danke erstmal für die Tipps ! Ich habe jetzt erstmal alle Antworten vom Server mit read entgegengenommen. Jetzt wäre nurnoch interessant, ob es eine Möglichkeit gibt, gewisse Antworten zu ignorieren, bzw. mehrere Worte in eine Variable zusammenzufassen, denn eigentlich interessiert mich nicht, ob der server "ready" ist. Das ist Sache des Providers. Ich habe einfach mal eine ganze Reihe Variablen abgefragt und bekomme für jedes besch..... Wort vom Server eine Variable (a1 -a9). Nach dem Login bekomme ich erstmal Info über meine Mailbox. Nur interessiert mich die Zeile aber nicht, da ich ja die Anzahl der Mails später per stat abfrage Kann man nicht einfach alle antworten des Servers nach /dev/null schicken und erst ab einem bestimmten Punkt wieder in Variablen einlesen ? Hier mein Output: mbauer@idefine:~> ./pop User loggt sich ein msg1=+OK okuser=POP3 server ready passwortabfrage user ist eingeloggt okpass=+OK stat a1=+OK a2=pt7674139-6's a3=mailbox a4=has num=13 a6=messages a7=(56778 a8=octets) a9=H mstoreng7 --------------------------------- Diese Mailbox enthaelt 13 Mails --------------------------------- ...und der jetzige Code: #!/bin/bash CR=$'\r' exec 3<>/dev/tcp/pop.1und1.de/110 #read msg1 >&3 #echo msg1=$msg1 echo User loggt sich ein echo user pt7674139-6>&3 read msg1 okuser <&3 echo msg1=$msg1 okuser=$okuser echo passwortabfrage echo pass 1PaLue123>&3 echo user ist eingeloggt read okpass <&3 echo okpass=$okpass echo stat echo stat >&3 read a1 a2 a3 a4 num a6 a7 a8 a9<&3 echo a1=$a1 a2=$a2 a3=$a3 a4=$a4 num=$num a6=$a6 a7=$a7 a8=$a8 a9=$a9 echo echo echo --------------------------------- echo Diese Mailbox enthaelt $num Mails echo --------------------------------- exit Danke und Gruß maX Bauer
Hallo, Am Mon, 22 Nov 2004, maX Bauer schrieb: [..]
Ich habe jetzt erstmal alle Antworten vom Server mit read entgegengenommen. Jetzt wäre nurnoch interessant, ob es eine Möglichkeit gibt, gewisse Antworten zu ignorieren, bzw. mehrere Worte in eine Variable zusammenzufassen, denn eigentlich interessiert mich nicht, ob der server "ready" ist. Das ist Sache des Providers.
Du solltest schon schauen, ob die Verbindung und das einloggen klappen und geeignet darauf reagieren.
Ich habe einfach mal eine ganze Reihe Variablen abgefragt und bekomme für jedes besch..... Wort vom Server eine Variable (a1 -a9).
Gib nur soviel an wie du brauchst, der Rest wird in den letzten Namen gepackt.
mbauer@idefine:~> ./pop User loggt sich ein msg1=+OK okuser=POP3 server ready passwortabfrage user ist eingeloggt okpass=+OK stat a1=+OK a2=pt7674139-6's a3=mailbox a4=has num=13 a6=messages a7=(56778 a8=octets) a9=H mstoreng7
--------------------------------- Diese Mailbox enthaelt 13 Mails ---------------------------------
...und der jetzige Code:
==== #!/bin/bash CR=$'\r' ansok() { if test "x$1" != "x+OK"; then echo "$2" >&2 exit 1 fi } exec 3<>/dev/tcp/pop.1und1.de/110 read status ans <&3 ## ggfs. vorher/nachher noch weitere Zeilen einlesen und ignorieren, ## bei der mit "+OK" sollte man dann ansok $status $ans ## einfuegen echo user xxx >&3 read status ans <&3 ansok $status $ans echo pass yyyyyyyyyy >&3 ansok $status $ans echo user ist eingeloggt echo stat >&3 read a1 a2 a3 a4 num rest <&3 echo "a1=$a1 a2=$a2 a3=$a3 a4=$a4 num=$num rest=$rest" echo "Diese Mailbox enthaelt $num Mails" ===== -dnh, fast Zufallssig! :) [die erste sig war zu lang fuer hier, die kam im zweiten Versuch] -- I believe the technical term is "Oops!"
Hallo maX On Mon, Nov 22, 2004 at 04:22:40PM +0100, maX Bauer wrote:
Das Problem an der Sache ist, dass die Variablen zwar Werte erhalten, allerdings nicht die,die ich per Telnet erhalte, sondern:
ok=+OK (die stimmt) num=POP3 (sollte eigentlich die Anzahl der Mails sein x=server ready (wie schön für ihn;)
Das ist der "Begrüssungsstrings"
----------------------------------- #!/bin/bash CR=$'\r' x=0 stat=0 exec 3<>/dev/tcp/pop.1und1.de/110
hier fehlen wohl ein paar read um den Begrüssungsstring + einiges andere zu empfangen.
echo user ptxxxxx-6>&3 echo pass 1Pxxxxx >&3 echo stat >&3 read ok num x <&3
wenn der Begrüssungsstring aus dem buffer gelöscht wurde
funktioniert das wohl (ungetestet)
Client: Verbindung aufgebaut
Server: +OK ($PROTO $HOST $VERSION $STATUS)
Client: $USERNAME
Server: +OK (User name accepted, password please)
Client: $PASSWORD
Server: +OK ($MAILBOX $MESSAGES)
Client: stat
Server: +OK $num $x
Vielleicht kannst du damit was anfangen ;) ansonsten RFC (2)821
lesen.
für dein Vorhaben würde ich übrigens eher netcat verwenden.
nc pop.1und1.de 110 < commands.txt | \
while read ANS; do echo $ANS; done
Am Montag, 22. November 2004 16:22 schrieb maX Bauer:
Hallo Liste,
ich beginne gerade, mich mit Shellscripting auseinanderzusetzen. Ich habe mir ein kleines Script geschrieben, dass abfragen soll, wie viele Mails sich in eine bestimmten Inbox befindet. Diese sollen dann alle gelöscht (bisheriger stand...)
Wenn ich mich per telnet auf dem POP3 Server einlogge und stat eingebe, bekomme ich 3 Ausgaben.
In meinem Script möchte ich diese Werte mit "read" in 3 Variablen übernehmen.
ganz ander Lösung: wie wäre es mit Perl? Da gibt es das Modul Net::Pop3 (siehe auch http://search.cpan.org/~gbarr/libnet-1.19/Net/POP3.pm) z.B. gibt's da die Funktion delete ( MSGNUM ) Mark message MSGNUM to be deleted from the remote mailbox. All messages that are marked to be deleted will be removed from the remote mailbox when the server connection closed. usw. usf. Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Dr. Jürgen Vollmer wrote:
Am Montag, 22. November 2004 16:22 schrieb maX Bauer:
Hallo Liste,
ich beginne gerade, mich mit Shellscripting auseinanderzusetzen. Ich habe mir ein kleines Script geschrieben, dass abfragen soll, wie viele Mails sich in eine bestimmten Inbox befindet. Diese sollen dann alle gelöscht (bisheriger stand...)
Wenn ich mich per telnet auf dem POP3 Server einlogge und stat eingebe, bekomme ich 3 Ausgaben.
In meinem Script möchte ich diese Werte mit "read" in 3 Variablen übernehmen.
ganz ander Lösung: wie wäre es mit Perl? Da gibt es das Modul Net::Pop3 (siehe auch http://search.cpan.org/~gbarr/libnet-1.19/Net/POP3.pm)
z.B. gibt's da die Funktion
delete ( MSGNUM ) Mark message MSGNUM to be deleted from the remote mailbox. All messages that are marked to be deleted will be removed from the remote mailbox when the server connection closed.
usw. usf.
Bye Jürgen
Perl ???? Oh Gott !! Jetzt soll ich auch noch Perl lernen. Dabei hab' ich mich um's Programmieren immer so schön herumgedrückt.... : ) Vielleicht sollte ich wirklich mal anfangen, in dieser Richtung ein bisschen was zu tun. Wer kann mir was empfehlen ? (PHP, Perl und was es da sonst noch so gibt) Mit was fang ich an ? Gruß und Danke maX Bauer
Am Montag, 22. November 2004 19:07 schrieb maX Bauer:
Perl ????
Oh Gott !! Jetzt soll ich auch noch Perl lernen. Dabei hab' ich mich um's Programmieren immer so schön herumgedrückt.... : ) Vielleicht sollte ich wirklich mal anfangen, in dieser Richtung ein bisschen was zu tun.
Wer kann mir was empfehlen ? (PHP, Perl und was es da sonst noch so gibt) Mit was fang ich an ?
Nun für diese Aufgabe ist Perl das Werkzeug der Wahl! PHP ist ja doch mehr für das Erzeugen von HTML-Seiten da. (Aber das kann Perl natürlich auch) Ein guter Einstieg in Perl ist: @BOOK{schwartz.1995a, AUTHOR = "Schwartz, Randal L.", TITLE = "Einführung in Perl", PUBLISHER = oreilly, YEAR = 1995, EDITION = 1, KEYWORD = "Programmiersprachen, Perl, Einführung", } Die Referenz, ohne die dann nichts mehr geht: @BOOK{wall.2001a, AUTHOR = "Wall, Larry AND Christiansen, Tom AND Orwant, Jon", TITLE = "Programmieren mit Perl", PUBLISHER = oreilly, YEAR = 2001, EDITION = 3, KEYWORD = "Programmiersprachen, Perl, Manual", } Unverzichtbar für Fortgeschrittene @BOOK{christiansen.1999a, AUTHOR = "Christiansen, Tom AND Torkington, Nathan", TITLE = "Perl Kochbuch", PUBLISHER = oreilly, YEAR = 1999, EDITION = 1, KEYWORD = "Programmiersprachen, Perl, viele Programmbeispiele", } Für angehende Perl-Gurus: @BOOK{srinivasan.1998a, AUTHOR = "Srinivasan, Siriam", TITLE = "Fortgeschrittene Perl Programmierung", PUBLISHER = oreilly, YEAR = 1998, EDITION = 1, KEYWORD = "Programmiersprachen, Perl, Anbindung nach C, Interna, Objekt-Orientiertung", } Wer gerne graphische GUI's mag: @BOOK{walsh.2000a, AUTHOR = "Walsh, Nancy", TITLE = "Einführung in Perl/Tk", PUBLISHER = oreilly, YEAR = 2000, EDITION = 1, KEYWORD = "Programmiersprachen, Perl, graphische Oberflächen, Tcl/Tk, Manual", } (Nein ich bekomme keine Provision von O'reilly :-) Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Hallo, Am Mon, 22 Nov 2004, Dr. Jürgen Vollmer schrieb:
Am Montag, 22. November 2004 19:07 schrieb maX Bauer:
Perl ????
Oh Gott !! Jetzt soll ich auch noch Perl lernen. Dabei hab' ich mich um's Programmieren immer so schön herumgedrückt.... : ) Vielleicht sollte ich wirklich mal anfangen, in dieser Richtung ein bisschen was zu tun.
Wer kann mir was empfehlen ? (PHP, Perl und was es da sonst noch so gibt) Mit was fang ich an ?
Nun für diese Aufgabe ist Perl das Werkzeug der Wahl!
ACK. Wobei netcat auch schoen ist, z.B. um nur nachzuschauen, wieviele Mails in einer MBox sind ist netcat sehr gut geeignet. Aber wenn man ein bisserl mehr machen moechte wuerde ich auch perl nehmen.
PHP ist ja doch mehr für das Erzeugen von HTML-Seiten da. (Aber das kann Perl natürlich auch)
Ack. Und mit Embperl auch eingebettet wie PHP. Kurz: mit Perl ist man flexibler, z.B. es mit Perl::Tk, Perl::Gtk(2), Perl::QT, u.a. diverse Moeglichkeiten fuer GUIs gibt. Und sonst finden man wahnsinnig viel auf CPAN.
Ein guter Einstieg in Perl ist:
AUTHOR = "Schwartz, Randal L.", TITLE = "Einführung in Perl",
Ist das das "Llama Book" "Learning Perl" von Schwartz, Christiansen und Wall? Das ist gut zum Lernen.
Die Referenz, ohne die dann nichts mehr geht: @BOOK{wall.2001a, AUTHOR = "Wall, Larry AND Christiansen, Tom AND Orwant, Jon", TITLE = "Programmieren mit Perl",
Das "Camel Book", in der 2nd Ed. noch von Wall, Christiansen und Schwartz. Auch in der Version noch empfehlenswert fuer Perl < 6. Es hat viele Ueberschneidungen mit "Learning Perl".
Unverzichtbar für Fortgeschrittene AUTHOR = "Christiansen, Tom AND Torkington, Nathan", TITLE = "Perl Kochbuch",
Das "Perl Cookboook". Nicht unverzichtbar, stellt aber schoen diverse Loesungen fuer uebliche Probleme, auf die man als nicht mehr ganz Anfaenger oft stoesst dar.
Für angehende Perl-Gurus: AUTHOR = "Srinivasan, Siriam", TITLE = "Fortgeschrittene Perl Programmierung",
Das "Jaguar Book" "Advanced Perl Programming" halte ich fuer das interssanteste, ist aber nix fuer Anfaenger.
Wer gerne graphische GUI's mag: AUTHOR = "Walsh, Nancy", TITLE = "Einführung in Perl/Tk",
Das kenne ich nicht. Ist das gut? Erzaehl mal (per PM). Das zu Recht fehlende "Perl in a Nutshell" dupliziert IMO fast nur die Manpages.
(Nein ich bekomme keine Provision von O'reilly :-)
*g* BTW: ich empfehle es jedem, der gut genug Englisch kann, sich die Original-Versionen auf Englisch anzuschauen. -dnh -- Q: What's the difference between a Used Car SalesPerson and a Computer SalesPerson? A: The Used Car SalesPerson KNOWS when they're lying.
ich:
Ein guter Einstieg in Perl ist:
AUTHOR = "Schwartz, Randal L.", TITLE = "Einführung in Perl",
Am Dienstag, 23. November 2004 00:26 schrieb David Haller:
Ist das das "Llama Book" "Learning Perl" von Schwartz, Christiansen und Wall?
Das ist gut zum Lernen.
jau. David:
BTW: ich empfehle es jedem, der gut genug Englisch kann, sich die Original-Versionen auf Englisch anzuschauen. find ich nicht, die deutschen Übersetzungen sind ganz gut. Alle von mir genannten Bücher sind die deutschen Übersetzungen der englischen Vorlagen.
Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
maX Bauer wrote:
Hallo Liste,
So, ich habe es geschafft ! Bin auch ganz stolz auf mich und alle, die mir geholfen haben ! Danke und hier ist es nochmal in der kompletten Fassung: Ihr habt bestimmt alle eigene Ideen, wie man dieses Script noch verbessern könte, bzw. wisst wahrscheinlich wie man sowas in 10 Zeilen schreibt... Ich nicht ! (will es aber mit der Zeit lernen) Also wenn jemand bessere Ideen dazu hat, oder meint es erweitern zu wollen, den bitte ich, diese unter diesem Thread zu Posten. gruß maX Bauer #!/bin/bash ################################# # Mailcheck # # von maX Bauer # ################################# function popmailcheck() { ########### No Mail ########################### echo stat >&3 read ok num size<&3 if [ $num -eq 0 ] then echo echo Keine Mails ! echo echo quit >&3 exit fi return } function popdel() { ############ Mails loeschen ########################## x=1 while [ $x -le $num ] do echo dele $x >&3 read ok <&3 echo "$ok Message $x deleted" x=`expr $x + 1` done ###################################### echo quit >&3 return } function popshowmail() { ########## Anzahl Mails ############################ echo echo --------------------------------- echo maximilian@formtransfer.de hat echo $num "Mails mit einer Groesse von" $size echo --------------------------------- echo quit >&3 return } function poplogin() { exec 3<>/dev/tcp/pop.1und1.de/110 ######## LOGIN ############################## echo user mxxxxxx>&3 read okuser msg1<&3 ######### PASS ############################# echo pass 1xxxxxx>&3 read okpass <&3 ######### Antwort abfangen ############################# read a1 a2 a3 a4 a5 a6 a7 a8 a9<&3 return } case "$1" in del) poplogin popmailcheck popdel ;; show) poplogin popmailcheck popshowmail ;; *) echo "Syntax: {del|show}" ;; esac exit
participants (4)
-
Daniel Lord
-
David Haller
-
Dr. Jürgen Vollmer
-
maX Bauer