Also ich habe eine Lösung für das/mein Problem. Und zwar hat mir youdonotexist, vielen Dank nochmal, erklärt wie man ein Skript schreibt, dass die drei Befehle beim starten für mich ausführt. Und zwar:
Merkmale eines Shellskriptes:
1. Textdatei
2. erste Zeile gibt den zu verwendenden Interpreter/die Shell an
3. Befehle werden in den einzelnen Zeilen notiert
4. Das x-Recht wird gesetzt und macht das Skript zu einer ausführbaren Datei.
Unser Skript soll in einem normalen Texteditor erzeugt werden. Nehmen wir mal den "joe", der ist ganz einfach zu bedienen.
Die Dateinamenserweiterung ist eigentlich unnötig, aber Menschen haben gern etwas, an dem sie sich orientieren können.
Unser Skript soll mit der normalen Bash abgearbeitet werden. Die erste Zeile lautet daher:
Das hat zur Folge, dass später beim Aufruf die Shell erstmal in die Datei reinguckt, die erste Zeile liest und feststellt: "das Skript soll mit /bin/bash abgearbeitet werden". Anschliessend schließt die Shell die Datei wieder, um direkt danach "/bin/bash skriptname.sh" auszuführen (die Raute ist eigentlich ein Kommentarzeichen, daher wird die erste Zeile bei diesem Aufruf ignoriert).
Die Befehle die zum Anmelden im W-Lan nötig sind folgen nun in der Reihe in der sie ausgeführt werden sollen.
Code: Alles auswählen
iwconfig ath0 essid "DEINE_ESSID"
iwconfig ath0 key XXXXXXXXXXXXXXXXXXXXXXXXXX
dhclient -nw
echo "Skript wurde ausgeführt"
Die kommen jetzt in die Textdatei rein, jeder Befehl auf einer eigenen Zeile. Den dhclient starten wir mit einem "-nw", das sorgt dafür, dass das Kerlchen im Hintergrund gestartet wird, eine Art Background-Schalter für den dhclient (siehe "man dhclient")
Nun müssen wir das ganze noch abspeichern: Bei joe per Strg-K-X, also Steuerung halten, und nacheinander K und X drücken.
Das Skript soll ausführbar sein: X-Recht setzen:
Probieren wir es erstmal aus:
./ wird vorangestellt, weil der ".", der das aktuelle Verzeichnis repräsentiert normalerweise nicht im Suchpfad für Programme (Variable $PATH) enthalten ist.
Funktioniert jetzt dein wlan? Dann können wir uns noch überlegen, wo wir den Kram jetzt am besten platzieren.
Erstmal kopierst du es aber nach /usr/local/bin/, damit es im Suchpfad für Programme liegt, und man es einfach aus einer ganz normalen Shell heraus aufrufen kann:
Damit ist der erstet Teil gegessen. Unser Skript ist sehr einfach geworden, da natürlich nur ein paar Befehle hintereinander abgearbeitet werden sollen. Man kann in Bash aber auch richtig programmieren und hat dann die üblichen Elemente einer Programmiersprache zur Verfügung
(Es gibt verschiedene Tutorials dazu im Netz, einfach mal google anwerfen).
Möglichkeiten zur Automatisierung:
a) /etc/init.d/boot.local: Wird leider zu früh abgearbeitet (bevor das Netzwerk an sich initialisiert wurde).
b) /etc/crontab: Eignet sich prima für periodisch wiederkehrende Jobs (Hierfür also auch ungeeignet).
c) /etc/init.d: Runlevelsystem (ist eine Möglichkeit, würde dann bei jedem booten automatisch ausgeführt).
d) per "sudo" und einem Icon auf dem Desktop (Das ist praktisch, wenn die Kiste ständig zwischen verschiedenen Netzwerken pendelt)
Im weiteren ist Variante c) beschrieben, da sie wohl das Gängiste sein dürfte.
Hintergrund:
Man möchte Dienste beim Booten automatisch starten. Die Unix-Lösung ist, dass bestimmte Skripte abgearbeitet werden. Früher (und bei BSD-Artigen) passierte dies über ein einzelnes Skript, wo einfach alles drin stand. Das wurde dann zu Umfangreich (Generell neigen Shellskripte dazu, zu verkrauten, man fügt dies und jenes ein, und irgendwann weiss man nicht mehr, was man getan hat...).
Die Lösung war, verschiedene Skripte, eines pro Dienst, zu verwenden. Diese Skripte findest Du unter /etc/init.d/. Dazu gibt es noch einige Verzeichnisse, die z.B. rc3.d oder rc5.d heißen. Diese Verzeichnisse enthalten symbolische Links auf die entsprechenden Skripte. Diese Links gibt es jeweils doppelt, einmal mit einem S und einmal mit einem K am Anfang.
Die Verzeichnisbenamung korrespondiert mit den entsprechenden Runleveln, die vom "init"-Programm abgearbeitet werden. Zwei Runlevel sind besonders: 0 und 6, der eine nennt sich "halt", der andere "reboot". Der normale Runlevel 5 unterscheidet sich von Nummer 3 dadurch, dass hier ein Programm, Xdm (oder auch KDM) gestartet wird, das eine grafische Anmeldung ermöglicht.
Init sorgt nun dafür, dass beim Wechsel in einen Runlevel alle Skripte mit "S" vorn abgearbeitet werden (Startskripte) und beim Wechseln aus einem Runlevel heraus die "K"-Skripte. Da es sich um symbolische Links handelt, die auf dieselbe Datei unterhalb von /etc/init.d/ verweisen, muss es da noch einen weiteren Mechanismus geben. Den hast du aber schon herausgefunden, denn die Skripte können mit dem Argument "start" oder aber mit dem Argument "stop" aufgerufen werden (genau das tut init an der stelle auch).
Tip am Rande:
Das sind ganz normale Skripte, die der Admin durchaus mal benutzen kann: "/etc/init.d/postfix stop" hält z.B. den Mailserver an, "/etc/init.d/postfix start" startet ihn wieder ( "/etc/init.d/postfix restart" kombiniert beides). SuSE hat diese Skripte dankenswerterweise gleich nach /sbin/rc* verlinkt, "rcpostfix restart" ist also ebenfalls möglich.
Zum Anlegen eines Initskriptes gibt es eine Vorlage: "/etc/init.d/skeleton", die kann leicht auf die eigenen Bedürfnisse abgeändert werden.
Öffne einfach mal /etc/init.d/skeleton mit einen beliebigen Editor und speichere es gleich unter einem anderen Namen z.B. "meinwlan". Ich habe das mit kwrite gemacht, also ALT+F2 dann kwrite eingegeben und unter "Einstellungen", "Mit anderer Benutzerkennung ausführen" als root gestartet.
Wir gehen erstmal zu Zeile 36 ff, da steht (unter KWrite kann man durch drücken von F11 die Zeilennummerrierung einblenen):
Code: Alles auswählen
### BEGIN INIT INFO
# Provides: FOO
# Required-Start: $syslog $remote_fs
# Should-Start: $time ypbind sendmail
# Required-Stop: $syslog $remote_fs
# Should-Stop: $time ypbind sendmail
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: FOO XYZ daemon providing ZYX
# Description: Start FOO to allow XY and provide YZ
# continued on second line by '#<TAB>'
# should contain enough info for the runlevel editor
# to give admin some idea what this service does and
# what it's needed for ...
# (The Short-Description should already be a good hint.)
### END INIT INFO
Diese Zeilen sind zwar auskommentiert, werden von einem SuSE-eigenen Mechanismus aber trotzdem verwendet, um sich in die Runlevelverwaltung in Yast zu integrieren und um festzulegen, dass bestimmte Sachen vorher schon laufen sollen.
Ändern wir das ein wenig ab:
Code: Alles auswählen
# Provides: Wlan-Start
# Required-Start: $syslog $remote_fs network
# Short-Description: Eigenes Wlan-Startskript
Das ist fast alles nur Verwaltungsinformation, bis auf Required-Start, da habe ich "network" hinzugefügt, und das bedeutet, dass das "network"-Skript vor unserem neuen gestartet werden soll. Yast (genauer: das Programm "insserv") errechnet anhand dieser Information eine Nummer, die in den Symbolischen Link eingefügt wird).
Weiter gehts: Zeile 122:
Das ist eine Variablendeklaration, den Namen übernehmen wir, aber den Inhalt der Variablen ändern wir ab (und Vorsicht: da düfen keine Freizeichen um das = herum auftauchen, das mag die Shell nicht).
Das war schon das wichtigste.
Danach, Zeile 127 bis 131, kommt eine Abfrage ob config Dateien benötigt werden.
Code: Alles auswählen
# Check for existence of needed config file and read it
FOO_CONFIG=/etc/sysconfig/FOO
test -r $FOO_CONFIG || { echo "$FOO_CONFIG not existing";
if [ "$1" = "stop" ]; then exit 0;
else exit 6; fi; }
Da wir das nicht tun habe ich diesen Part auskommentiert (den Zeilenanfang mit einer '#' versehen).
Code: Alles auswählen
# Check for existence of needed config file and read it
# FOO_CONFIG=/etc/sysconfig/FOO
# test -r $FOO_CONFIG || { echo "$FOO_CONFIG not existing";
# if [ "$1" = "stop" ]; then exit 0;
# else exit 6; fi; }
Ab Zeile 177 beginnt eine Case-Abfrage ("$1" ist, du ahnst es sicher schon, das erste Argument auf der Kommandozeile, also z.B. start oder stop)
Zeile 179 (im "start"-Teil der Case-Anweisung):
Das ist das, was beim Starten auf der Konsole ausgegeben wird. Kann man auch ändern:
Dann weiter zu Zeile 182:
An dieser Stelle wird zum ersten mal auf den Inhalt der Variable $FOO_BIN zugegriffen. Dir fällt sicher das "$"-Zeichen auf: In Bash oder Sh darf es bei der Variablendeklaration nicht da sein, sondern erst, wenn der Wert ausgelesen werden soll. Da wir die Variable oben geändert haben, kann das hier so bleiben.
Ab Zeile 188 (im "stop"-Teil der Case-Anweisung) sind wieder 2 Sachen interessant:
Code: Alles auswählen
echo -n "Shutting down FOO "
/sbin/killproc -TERM $FOO_BIN
Das erste ist der Text, der beim Stoppen des Dienstes ausgegeben werden soll, kann man auch wieder ändern, das zweite der Stop-Befehl.
killproc ist für uns relativ nutzlos, weil unser ursprüngliches Skript nach dem Starten des dhclient beendet sein sollte. Machen wir also unsere Änderungen manuell rückgängig:
Code: Alles auswählen
echo -n "Herunterfahren meines Wlans "
# /sbin/killproc -TERM $FOO_BIN
kill `pidof dhclient`
ifconfig ath0 down
kill `pidof dhclient` ist übrigens ein interessantes Konstrukt, es werden hier Backticks verwendet (Umschalt+<das Zeichen neben der Backspace-Taste>). Die sorgen dafür, dass die Shell erst den Ausdruck innerhalb der Backticks ausführt, und den Befehl durch seine Ausgabe ersetzt. pidof sucht eine ProzessID zu einem Programmnamen, mit dem kill-Programm senden wir also ein Beendigungssignal an die entsprechende ProzessID. (killall kann zwar auch auf Programmnamen angesetzt werden, aber nicht auf allen Unix-Systemen, auf den anderen beendet killall *alle* Prozesse...)
So. Im großen und ganzen war es das schon, aber auch dieses Initskript sollte ausführbar gemacht werden. Also nach dem Abspeichern:
Probier wir nun mit "/etc/init.d/meinwlan start" und "/etc/init.d/meinwlan stop", ob alles korrekt funktioniert und achte darauf, dass die Eingabeaufforderung auch brav wieder angezeigt wird (später beim Bootvorgang darf das ganze unter keinen Umständen auf einen Tastendruck warten, da gibts nämlich noch keine Keyboardunterstützung).
Wenn dhclient beendet ist kommt nicht zwingend die gewohnte Zeile mit
Wenn du aber
eingibst, Enter drückst und eine Auflistung mit den Dateien, die sich in dem Ordner befinden in dem du auch gerade bist, ist alles in Ordnung und du kannst fortfahren.
Da wir den Info-Block angepasst haben, können wir nun mit
die entsprechenden Symlinks erstellen lassen.
Alternativ kann man die Symlinks auch zu Fuss anlegen:
Code: Alles auswählen
cd /etc/init.d/rc5.d
ln -s ../meinwlan S99meinwlan
ln -s ../meinwlan K01meinwlan
Nun steht dem ersten Neustart nichts mehr im Wege, bei dem ihr automatisch im W-Lan angemeldet worden seid.