Script für Installation von getmail

Status
Für weitere Antworten geschlossen.

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Hallo zusammen

habe die letzten Tage an einem Installer-Script für getmail rumgebastelt. Funzt soweit auch ganz gut nur ein klitze kleines Problemchen habe ich noch. Es geht drum wie ich am "einfachsten" einen String zusammensetzen kann und danach in ein File schreiben kann.
In einem File habe ich die Filenamen der getmail-rc Files. Aus diesen Namen sollte ich einen String zusammensetzen für das Shell-Script welches getmail für diesen User starten wird. Probiert habe ich folgendes, was aber nicht mehr als Fehler gebracht hat:
Code:
str='/path/to/getmail -option -option --getmaildir /path/to/.getmail'
for i in $(cat /tmp/getmailCreate.tmp)
do
 str = $str" -r $i"
done
das Ziel wäre es jeden Namen aus dem tmp File zusammen mit dem Schalter -r gefolgt vom Namen an str anzuhängen.
Bin mir sicher, dass hier jemand eine Idee hat wie man das sauber machen kann ;)

Danke für jeden Tipp

Gruss

tobi
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Warum schreibst es nicht ohne Leerstellen in der 4. Zeile?

Rich (BBCode):
str='/path/to/getmail -option -option --getmaildir /path/to/.getmail'
for i in $(cat /tmp/getmailCreate.tmp)
do
str=$str" -r $i"
done

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Warum schreibst es nicht ohne Leerstellen in der 4. Zeile?
Wie meinst du das jetzt "ohne Leerstellen"? Zwischen -r und dem Namen braucht es ja eine weil -r eine Option für die Funktion ist und den Filenamen als Parameter erwartet. Oder wo meinstest du "ohne Leerstelle"? Oder heisst das die Leerstelle zwischen = und Stringbeginn führt ebenfalls zu einer zusätzlichen Leerstelle in str? Da sieht man wieder mal wie wenig ich von der Shell verstehe :D
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Eigentlich hatte ich es schon hingeschrieben, was ich gemeint hatte.
Variables and Parameters

The shell maintains a set of parameters. A parameter denoted by a name is called a variable. When starting up, the shell turns all the environment variables into shell variables. New variables can be set using the form

name=value

Variables set by the user must have a name consisting solely of alphabetics, numerics, and underscores - the first of which must not be numeric. A parameter can also be denoted by a number or a special character as explained below.
Quelle: http://linux.die.net/man/1/ash

Rechts und links der Rheins ist auch noch Mainz ... und bei der Zuweisung einer Shell-Variablen eben keine Leerstelle.

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Rechts und links der Rheins ist auch noch Mainz ... und bei der Zuweisung einer Shell-Variablen eben keine Leerstelle.
Dann werde ich das dann heute abend mal so probieren. Danke für die Hilfe an einen PHP-Geschädigten (dort sind ja solche Leerzeichen egal) :)
Du hast nicht noch zufällig eine Idee wie man einen String zuverlässig auf "leer" resp nur ein LineBreak (durch Enter bei der Eingabe) prüfen kann? Verwende dafür z.Z. ein php Script welches mir einen trim auf den String macht und bei einem Leerstring als Resulat einen Fehlercode ausgibt. Geht das irgendwie auch zuverlässig auf der Shell?
Besteht denn Interesse für Mailstation User an diesem Script? (wenn es denn mal fertig wird)
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Leerprüfung: test -z "$string" oder [ -z "$string" ]
Das habe ich probiert. Da ich die Vars aber mittels read hole kann es sein, dass nur ein \n drin ist und das wird mit -z so wie ich das gestern gesehen habe ned abgedeckt. eigentlich bräuchte ich wohl einen RegExp, der auf "printable" prüfen würde. Allerdings bin ich mit diesem Vorhaben grandios gescheitert und darum auf die PHP Lösung ausgewichen
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
[ -z "$string" -o "$string" == "\n" ]

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
2
Punkte
84
echo ohne Anführungszeichen entfernt so ziemlich alles:
Rich (BBCode):
DS1010> l=`echo -e '   test  \n  \n   \t  test  `
DS1010> echo $l
test test
DS1010> echo "$l"
   test  
  
          test

Also vor der Prüfung:
Rich (BBCode):
string=`echo $string`
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@Merthos
Super Idee. Wenn ich das richtig verstanden habe kann man damit mehrfache Leerzeichen zu einem umwandeln. So was hätte ich auch schon brauchen können. Habe dazu immer ein php Script missbraucht :)
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@itari
Bei
Code:
if test -n $server && test $server = "\n"
erhalte ich auf alle möglichen Wege (auch [] anstelle von test) immer
sh: \n: unknown operand
Irgendeine Idee?
Ich belass es dann mal bis auf weiteres bei der Version mit php-trim ;)

@merthos
beim echo ohne Anführungszeichen kommt zwar kein Fehler, aber scheinbar geht der Code bei nur einem \n als Usereingabe trotzdem immer in die folgende Bedingung rein
Code:
if ! test "$(echo $server)" = "\n"
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Meine und deine Denkfehler:

1] der &&-Operand in einer Shell ist was ganz anderes als in PHP

2] Shell-Varibalen müssen immer in Quotes stehen, sonst haut man sich die Logig dumm und dämlich, weil Shell-Variablen eigentlich keine Varibalen sind, sondern nur Textsubstitutionsplatzhalter

3] mein Equal-Operator (==) war natürlich falsch. Richtig wäre =

4] '\n' geht wohl so nicht; da muss man wahrscheinlich eine Shellvariable mit vorbesetzen: NL="<ctrl-j>", dann kannst "$string" = "$NL" nutzen

Itari
 

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
2
Punkte
84
@merthos
beim echo ohne Anführungszeichen kommt zwar kein Fehler, aber scheinbar geht der Code bei nur einem \n als Usereingabe trotzdem immer in die folgende Bedingung rein
Code:
if ! test "$(echo $server)" = "\n"

Wie itari schon schrieb, sind Sachen wie \n nicht so einfach. Müsste ehr sowas sein:
Rich (BBCode):
if [ -z `echo $server` ]
then
  ... nix eingegeben ...
else 
  ... doch was eingegeben ...
fi

Wenn Du allerdings auch noch zwischen leer bzw. nur Leerzeichen und \n + Leerzeichen unterscheiden willst, dann wüsste ich jetzt momentan auch nicht weiter.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
@itari && merthos

erstmal sorry, dass ich mich gestern ned mehr gemeldet habe. Hatte da einen kleinen Notfall mit meinem Mailserver. Irgendwann kurz vor Mitternacht habe ich so komische Meldungen vom Mailserver gehabt, die auf abgestürzte Prozesse hindeuteten. Also gedacht, dass ein Neustart wohl helfen könnte. Gedacht getan und die Kiste kam kaum mehr hoch. Da wurde es mir plötzlich klar warum:
Ich Idiot habe mein getmail Script auf dem Mailserver getestet. Da ich aber zu faul war jedesmal die Userdaten einzugeben, habe ich einfach nicht existierende Accounts und nicht existierende Domains verwendet. Wollte ja nur sehen ob diese Daten korrekt in die Files übernommen werden. Dazu extra einen Testuser angelegt.
Dummerweise habe ich vergessen, dass ich einen Daemon habe, der mir die Userverzeichnisse nach getmail.sh und rc Files scannt und diese dann automatisch abrufen will. Der automatische Aufruf von Phantasiedomains hat natürlich entsprechende DNS Requests ausgelöst.
Unterm Strich eine sehr gelungene DOS-Attacke auf meinen eigenen Mailserver :eek:
Der Reboot war nach gut 20min und einem vollständigen Filesystemcheck abgeschlossen. Nachdem ich die entsprechenden Dateien gelöscht habe, funzte dann alles wieder wie gewohnt.

Mein Fazit:
Achtet Euch immer drauf wo ihr was testet. Und bei einem langen Reboot sollte man der DS die Zeit lassen, den Filesystemcheck abzuschliessen und nicht das Stromkabel ziehen

Gruss

tobi

p.s. danke Euch für Eure Tipps. Meine Lektion daraus: Ich muss noch viel mehr lernen über die Shell :)
Anbei mal die erste Alpha des Scripts: http://svn.brain-force.ch/filedetai...skstation/getmail-installer/installGetmail.sh
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat