ifupdown + mapping

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

ifupdown + mapping

Beitrag von Duff » 28.10.2006 14:44:20

Hallo,

ich lese gerade das Buch "Das Debian-System" und bin im Kapitel der Netzwerkkonfiguration.

Dort steht auch was zur mapping-Konfiguration bei ifupdown beschrieben.

Als Beispiel wird dort folgendes angegeben:

Code: Alles auswählen

mapping eth0
   script /usr/local/sbin/map-location.sh
   map HOME eth0-home
   map UNI eth0-uni

iface eth0-home inet static
   address 192.168.1.10
   netmask 255.255.255.0
   gateway 192.168.1.1

iface eth0-uni inet dhcp

Ok, soweit verstehe ich ja die Datei interfaces. Doch was muss in dem angegebenen Skript stehen? Und wie mache ich das ganze für verschiedene wlans mit verschiedenen Verschlüsselungen (wpa-psk, wep, usw.).
Oh, yeah!

Benutzeravatar
neuss
Beiträge: 2165
Registriert: 06.11.2004 17:56:02
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von neuss » 28.10.2006 17:53:24

Hallo,

ist natürlich doof, wenn einer ein Buch schreibt und dann nur die man-page schlecht umformuliert.
Mit "map-location.sh" kann man natürlich nichts ergooglen, da das Script nur in dem Buch so heisst.
Ein passender Suchbegriff wäre "map-scheme", so wird das Script in man interfaces genannt.
Damit findest Du auch etwas hier im Forum.

gruss neuss
stell dir vor, es geht, und keiner kriegt es hin.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 28.10.2006 19:00:46

Naja, wirklich viel findet man mit dem Suchbegriff "map-scheme" ja nicht hier.
Aber ist ja auch egal. Ich dachte vielleicht hätte ja noch einer ein gutes Beispiel für seine persönliche Konfiguration oder so.

Habe es denke ich jetzt mit diesem Schema und dem dazugehörigen Skript verstanden. Schaue mir jetzt noch mal guessnet an und überlege mir dann, welche Variante ich am besten für meine Zwecke nutze.

Werde mir wohl auch ein Skript schreiben, damit ich nachher zwischen den verschiedenen wlans entscheiden kann. Ich will nämlich nicht, dass diese automatisch beim Starten gesucht werden (bei meinem wlan zumindest!).
Oh, yeah!

Benutzeravatar
deadeye
Beiträge: 561
Registriert: 14.04.2004 15:32:18
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Ukio, rechts hinterm Feld
Kontaktdaten:

Beitrag von deadeye » 29.10.2006 00:13:10

Wenn Du ne Lösung für Dich gefunden hast, kannst Du sie ja hier und/oder im Wiki mal vorstellen. Brauche auch noch sowas, im Moment nur zu faul zum Basteln.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 29.10.2006 10:04:57

Ok, kann ich machen, sobald ich mich dazu bewegen kann, damit anzufangen :-)
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 06.11.2006 21:48:12

So, habe jetzt eine kleinere Version zum Automatischen Starten der gefundenen und konfigurierten Netzwerke geschrieben. Allerdings habe ich noch ein Problem. Ich kann das entsprechende WLAN-Netzwerk nur als root übers Skript starten.

Wie muss man das ganze abändern, damit ich auch als normaler Benutzer über ein Skript das WLAN starten kann?

Beispiel:

Code: Alles auswählen

IF=${1:-"eth2"}
file='/home/daniel/scripts/selected_network'

if [ -f ${file} ]
then
        SSID=`cat $file`
        #echo $SSID
else
        exit 1
fi

case ${SSID} in
        SSID01 | SSID02)
                echo "${IF}-${SSID}"
                ;;
        *)
                exit 1;
                ;;
esac
exit 0
Und die dazugehörige Datei /etc/network/interfaces

Code: Alles auswählen

# The wlan network interface
auto eth2
mapping eth2
        sudo script /home/daniel/scripts/wlan-test.sh
        map SSID01 eth2-SSID01
        map SSID02 eth2-SSID02

iface eth2-SSID01 inet dhcp
        wpa-driver wext
        wpa-ssid SSID01
        wpa-passphrase <password>

iface eth2-SSID02 inet dhcp
        wpa-driver wext
        wpa-ssid SSID02
        wpa-passphrase <password>
Der Inhalt der Datei /home/daniel/scripts/selected_network ist dann z.B.

Code: Alles auswählen

SSID01
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 07.11.2006 11:11:33

Noch so als Nachtrag. Ich habe in die /etc/sudoers auch schon den Pfad zu ifup und ifdown eingetragen, so dass normale Benutzer über sudo ifup eth2 oder sudo ifdown eth2 die WLAN-Schnittstelle hoch- und runterfahren können. Dies funktioniert aber nur, wenn in der Datei /home/daniel/scripts/selected_network ein gültiges Netzwerk steht.

Deshalb möchte ich das ganze lieber scriptgesteuert machen, nur funktioniert dies noch nicht.
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 08.11.2006 19:38:40

Mein Script zum Starten und Suchen der verfügbaren und konfigurierten WLAN-Netze sieht so aus:

Code: Alles auswählen

#!/usr/bin/perl -w

use strict;
use warnings;

my @wlan_networks;                                      # Alle �er iwlist verf�baren wlan-Netze
my @essid;                                              # Speichern der ESSID aus @wlan_networks
my @ssid;                                               # Speichern der eigenen SSIDs aus /etc/network/interfaces
my @quality;                                            # Signalst�ke aus @wlan_networks speichern
my @equal;                                              # �ereinstimmende Netze aus @ssid und @essid finden
my @all;                                                # Speichern aller gefundenen WLAN-Netze
my $k;                                                  # Durchlaufvariable f� Arrays
my $input;                                              # Variable f� die Tastatur-Eingabe
my $datei="/home/daniel/scripts/selected_network";      # Datei, in die das ausgew�lte WLAN-Netz geschrieben wird

# Alle verf�baren WLAN-Netze aufsp�en
#
@wlan_networks=`iwlist eth2 scanning`;

foreach $k (@wlan_networks)
{
        # Nach den ESSIDs suchen
        if ($k =~ /.*ESSID:"(.*)"/){
                push(@essid, $1);
        }
        # Nach der Empfangsqualit� suchen
        if ($k =~ /.*Quality.*(\d{2,3}\/\d{3}).*/){
                push(@quality, $1);
        }
        push (@all,$k);
}

# Konfigurierte Netzwerke suchen
# ssid in @array speichern
#
open (IN,"<","/etc/network/interfaces") or die "Kann die Datei /etc/network/interfaces nicht �fnen";
while (<IN>)
{
        if ($_ =~ /.*ssid\s+(.*)\s+/){
                push(@ssid, $1);
        }
}
close (IN);

# Funktion array_compare zum Suchen von �ereinstimmenden Netzen
#
sub array_compare {
        my @z;
        my $x_ref=shift;
        my $y_ref=shift;
        my %hash;
        $hash{$_}++ for @{$x_ref};
        @z=grep $hash{$_}, @{$y_ref};
        return @z;
}

# Aufruf der Funktion array_compare
# R�kgabewert in @equal speichern
#
@equal=array_compare(\@ssid,\@essid);

# R�kgabewert (Array) ist nicht leer
#
if (@equal >= 1){
        my $i=1;
        foreach $k (@equal){
                # Ausgabe der �ereinstimmenden Netze
                printf "%2d.WLAN-Netz: %-s\n", $i,$k;
                $i++;
        }
        print "Mit welchem der oberen WLAN-Netze soll eine Verbindung aufgebaut werden?\n";
        print "Bitte das gew�schte WLAN-Netz eingeben: ";
        chomp ($input = <STDIN>);
        if ($input ne '') {
                for $k(@equal){
                        if ("$k" eq "$input"){
                                # Die SSID des Netzes in eine Datei schreiben
                                open (DAT,">","$datei") or die "Konnte die Datei \"$datei\" nicht �fnen!\n";
                                print DAT $input;
                                close(DAT);
                                print "Verbindung zu WLAN-Netz \"$input\" wird aufgebaut...\n"; 
                                my @system=`sudo ifup eth2`;
                                print "@system\n";
                        }
                }
        }
        else {exit;}
}

# R�kgabewert (Array) ist leer
# Keine konfigurierten WLAN-Netze gefunden
#
print "Keine konfigurierten WLAN-Netze gefunden.\n" if(@equal < 1);
print "Es wurden aber folgende, NICHT konfigurierte WLAN-Netze gefunden:\n\n @all" if(@equal < 1 && @essid > 0);
Ok, dass ganze ist noch ein wenig ausbaufähig und müsste vielleicht auch noch mal hier und da überarbeitet werden.

Doch das Problem bisher ist, dass ich das Script öfter ausführen muss (und immer das selbe eingebe), bevor eine Verbindung aufgebaut wird (zu sehen durch die Ausgabe des arrays @systems).
Ansonsten kommt nach Eingabe des gefundenen WLANs nur die Ausgabe von

Code: Alles auswählen

print "Verbindung zu WLAN-Netz \"$input\" wird aufgebaut...\n"; 
Jemand ne Idee woran das liegen könnte?
Oh, yeah!

Benutzeravatar
deadeye
Beiträge: 561
Registriert: 14.04.2004 15:32:18
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Ukio, rechts hinterm Feld
Kontaktdaten:

Beitrag von deadeye » 09.11.2006 01:23:26

Noch nicht. Wenn ich dran denke werd ich es morgen Abend ma ausprobieren.

Denke, wenn es dann läuft, gehört das auf jeden Fall ins Wiki.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 09.11.2006 21:01:12

Also ich habe es gerade eben noch mal probiert und da hat es ohne Probleme geklappt:

Code: Alles auswählen

daniel@daniel-laptop:~/scripts$ wlan
 1.WLAN-Netz: WLAN01
Mit welchem der oberen WLAN-Netze soll eine Verbindung aufgebaut werden?
Bitte das gewünschte WLAN-Netz eingeben: WLAN01
Verbindung zu WLAN-Netz "WLAN01" wird aufgebaut...
Internet Software Consortium DHCP Client 2.0pl5
Copyright 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.
All rights reserved.

Please contribute if you find this software useful.
For info, please visit http://www.isc.org/dhcp-contrib.html

sit0: unknown hardware address type 776
eth0: unknown hardware address type 24
sit0: unknown hardware address type 776
eth0: unknown hardware address type 24
Listening on LPF/eth2/00:0e:35:5c:f4:bf
Sending on   LPF/eth2/00:0e:35:5c:f4:bf
Sending on   Socket/fallback/fallback-net
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 3
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 4
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 5
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 13
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 10
DHCPOFFER from 192.168.3.1
DHCPREQUEST on eth2 to 255.255.255.255 port 67
DHCPACK from 192.168.3.1
bound to 192.168.3.104 -- renewal in 43200 seconds.
Werde es noch ein paar Mal probieren und wenn es keine Probleme mehr geben sollte, ins Wiki posten.
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 11.11.2006 12:25:29

Nach mehrmaligen Test, habe ich ab und zu das Problem, dass ich das Skript 3mal oder aufrufen muss, bis eine Verbindung hergestellt wird.

Wenn ich noch folgende print-Zeilen einfüge,

Code: Alles auswählen

          if ("$k" eq "$input"){
                                # Die SSID des Netzes in eine Datei schreiben
                                open (DAT,">","$datei") or die "Konnte die Datei \"$datei\" nicht öffnen!\n";
                                print DAT $input;
                                close(DAT);
                                print "Verbindung zu WLAN-Netz \"$input\" wird aufgebaut...\n";
                                print "...\n";
                                my @system=`sudo ifup eth2`;
                                print "...\n";
                                print "@system\n";
                                print "...\n";
                        }
um zu schauen was so passiert, sehe ich folgende Ausgabe:

Code: Alles auswählen

daniel@daniel-laptop:~/scripts$ wlan
 1.WLAN-Netz: WLAN01
Mit welchem der oberen WLAN-Netze soll eine Verbindung aufgebaut werden?
Bitte das gewünschte WLAN-Netz eingeben: WLAN01
Verbindung zu WLAN-Netz "WLAN01" wird aufgebaut...
...
...

...
Es sieht so aus, als ob der Shell-Befehl sudo ifup eth2 gar nicht ausgeführt wird, weil die Ausgabe des arrays, in dem der Befehl gespeichert werden soll, leer ist (wie oben zu sehen).

Hat jemand eine Idee, woran das liegen kann?

[edit]
Habe nun in dem Skript noch die vollständigen Pfade ergänzt, was aber auch leider nichts zu bringen scheint.

Code: Alles auswählen

my @system=`/usr/bin/sudo /sbin/ifup eth2`;
So wie es aussieht, wir der Befehl einfach nicht ausgeführt (warum auch immer).
[/edit]
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 18.11.2006 12:09:22

So, bin wieder einen kleinen Schritt bei meinem Skript weiter gekommen.

Habe folgende Zeilen ergänzt und bekomme nun eine Fehlermeldung:

Code: Alles auswählen

                        if ("$k" eq "$input"){
                                # Die SSID des Netzes in eine Datei schreiben
                                open (DAT,">","$datei") or die "Konnte die Datei \"$datei\" nicht öffnen!\n";
                                print DAT $input;
                                close(DAT);
                                print "Verbindung zu WLAN-Netz \"$input\" wird aufgebaut...\n";
                                #my @system=`/usr/bin/sudo /sbin/ifup eth2`;
                                #print join("--", @system)."\n";
                                my @args=("/usr/bin/sudo /sbin/ifup eth2");
                                system(@args) == 0
                                        or die "system @args failed: $?";
                        }
Die Fehlermeldung in der Zeile mit dem Aufruf von system(@args)... ist folgende:

Code: Alles auswählen

daniel@daniel-laptop:~/scripts$ wlan
 1.WLAN-Netz: WLAN01
Mit welchem der oberen WLAN-Netze soll eine Verbindung aufgebaut werden?
Bitte das gewünschte WLAN-Netz eingeben: WLAN01
Verbindung zu WLAN-Netz "WLAN01" wird aufgebaut...
system /usr/bin/sudo /sbin/ifup eth2 failed: 13 at /home/daniel/scripts/select_wlan.pl line 93, <STDIN> line 1.
Weiß jemand, was diese Fehlermeldung genau bedeutet und eventuell wie man diesen Fehler vermeiden kann???

Danke.
Oh, yeah!

Antworten