ubuntuusers.de

dialog script für iptables

Status: Ungelöst | Ubuntu-Version: Server 9.04 (Jaunty Jackalope)
Antworten |

Xabot

Anmeldungsdatum:
26. Dezember 2009

Beiträge: 11

Hi,

ich versuche mich grad an bash Programmierung. Ich habe auch schon einiges hinbekommen. Ich wollte jetzt ein einfaches Iptables Script mit dialog vereinfachen (nur aus Lehrzwecken, muss nicht unbedingt sinnvoll sein;) ).

Das Problem ist mir fehlt der Ansazt.

Es soll halt so ausehen: Man startet das Script und landet halt in einem dialog Fenster wo man durch anwählen entweder eine Regel hinzufügen kann oder beenden und somit das Script ausführen kann. Beim Regel hinzufügen stoße ich auf das erste Problem. (Aus der Eingabe (dialog --backtitle IPT --title "Bitte Port und Protokoll eingeben" --inputbox "" 0 0 2> tmp.dialog1) müsste ich ja zwei Variablen abfangen, (bzw aus der temporären Textdatei) einmal den Port und einmal das Protokoll, z.B: 80 tcp.)


/Edit (Wie ich zwei Variablen aus einer tmp Datei auslese habe ich jetzt herausgefunden)

var1=`head -n 1 temp.dialog`
var2=`tail -n 1 temp.dialog`

Auch ein passendes Menu hätte ich jetzt gefunden:

dialog --backtitle "IPT" \
            --form " Bitte Port und Protokoll eingeben " 21 70 18 \
            "port" 2 4 "" 2 15 20 0\
            "protokoll" 4 4 "" 4 15 20 0\  2> temp.dialog

Was bleibt ist das beim klick auf weiter das auswahlfenster wider kommt um einen neuen Port und Protokoll einzugebn. Und diese dann in zwei anderen Variablen zu speichern. ))) ///Edit


Wenn ich dann auf Weiter klicke müsste ich wider auf das Auswahlfenster von vorhin kommen um zb eine neue Regel hinzu zu fügen. (Eig müsste das Script dann in dem Teil wider von vorne los laufen) So nur wenn dann wider die Eingabe von Port und Protokoll kommt muss ich diese ja in zwei neuen Variablen Speichern da diese dann ja neue Werte enthalten. Wenn man dann seine 4 bis 5 Regeln eingegeben hat geht es dann ins eigentliche Script über, wo dann die Variablen in die jeweiligen Variablen für die Iptables Befehle eingesetzt werden.

IN_ALLOWED_Variable2(Protokoll)="Variable1(Port)"
OUT_ALLOWED_Variable4="Variable3"
IN_ALLOWED_Variable6="Variable5"
usw
Diese Werden dann halt weiter unten in die Befehele eingesetzt also zb:

 for $Variable1(Port) in $IN_ALLOWED_$Variable2(Protokoll); do
        echo "Accepting $Variable2 port $Variable1"
        iptables -A INPUT -t filter -p $Variable2 --dport $Variable1(port) -j ACCEPT
      done

Joa das alles will ich eig nur machen weil es mich interessiert wie es geht und weil ich diese Art von Script öfters einsetzen könnte. Leider weiß ich nicht wie ich dies Realisieren soll. Ich würde mich freuen wenn mir jemand einen Ansatzt sagen könnte wie ich die einzelnen Stellen realisieren könnte.

Hoffe man versteht einigermaßen was ich meine.

Danke

MFG Xabot

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Wenn dialog sowas ähnliches ist wie zenity, was ich meine, dann ist der Weg über eine temporäre Datei überflüssig.

foo=$(dialog....)

müßte die Ausgabe von dialog nach foo schreiben.

paar=$(zenity --entry --text "zwei Werte, bitte")
echo $paar
49 50
echo ${paar/ */}
49
echo ${paar/* /}
50

man bash
/string expansion

Zeigt ein paar Möglichkeiten, wie man Strings zerlegt.

Dalai

Avatar von Dalai

Anmeldungsdatum:
16. Juni 2008

Beiträge: 2316

Wohnort: Meiningen

user unknown schrieb:

Wenn dialog sowas ähnliches ist wie zenity, was ich meine, dann ist der Weg über eine temporäre Datei überflüssig.

foo=$(dialog....)

Nein, so geht's nicht. dialog schreibt das Ergebnis bzw. die Auswahl nach Stderr. Der Dialog selbst wird nach Stdout geschrieben. Daraus folgt: entweder man bringt dialog per Parameter --stdout dazu, nach Stdout zu schreiben, oder man nutzt dies (danke nochmal an Vain):

foo=$(dialog --parameter --menu ... 3>&2 2>&1 1>&3)

Damit landet Stdout weiterhin dort, wo es gebraucht wird und Stderr landet in der Variable. Der Parameter --stdout muss aber nicht funktionieren, wie in der Manpage zu lesen ist.

Das mit den Eingaben in einer Form von dialog löse ich so:

1
2
3
4
5
6
input=$(dialog --backtitle "IPT" \
               --form " Bitte Port und Protokoll eingeben " 21 70 18 \
               "port" 2 4 "" 2 15 20 0\
               "protokoll" 4 4 "" 4 15 20 0 3>&2 2>&1 1>&3)
port=$(echo "${input}" | sed -n '1p')
protokoll=$(echo "${input}" | sed -n '2p')

Wahrscheinlich gibt's dafür noch einfachere Methoden (head und tail haben bei mir irgendwie nicht sauber funktioniert, wenn die Eingabezeilen leer gelassen wurden).

MfG Dalai

Antworten |