Hi!
Der Thread ist ja schon etwas älter, aber ich hatte das gleiche Problem und habe mir ein kleines Skript geschrieben, dass eine große case-Bedingung enthielt die je nachdem welchen String ich übergebe die notwendigen Befehle (ipconfig, route) mit den entsprechenden Parametern ausführt.
Gestern habe ich dann hier nochmal reingeschaut und gedacht, dass der ein oder der andere sowas vielleicht auch benötigt und es sich selbst von Grund auf programmieren müsste. Also hab ich noch einige Verbesserungen daran vorgenommen und den Tipp von supersucker übernommen die Profile in eigene Dateien auszulagern.
Die von Theton geposteten Programme sehen alle gut aus, erschienen mir allerdings als overkill für mein kleines Problemchen das ich momentan regelmäßig zwischen 2-3 Netzwerk-Konfigurationen wechseln muss.
Hier nun mein Skript und ein Beispiel-Profil:
netup.sh
Code:
#!/bin/sh
#
# NETwork setUP
# Version 0.4.1
#
# Configuration
PFDIR="."
# Flags
PF=""
VRB=0
SIM=0
PRT=0
# Initialisation
IF="eth0"
PN=""
IP=""
NM=""
GW=""
NS1=""
NS2=""
DHCP=0
netup_config () {
local PN=$1
local IF=$2
local IP=$3
local NM=$4
local GW=$5
local NS1=$6
local NS2=$7
echo "Setup:"
echo "------"
if [ $PN ] ; then
echo "Profile : $PN"
fi
if [ $IF ] ; then
echo "Interface : $IF"
fi
if [ $IP ] ; then
echo "Address : $IP"
fi
if [ $NM ] ; then
echo "Netmask : $NM"
fi
if [ $GW ] ; then
echo "Gateway : $GW"
fi
if [ $NS1 ] ; then
echo "Nameserver1 : $NS1"
fi
if [ $NS2 ] ; then
echo "Nameserver2 : $NS2"
fi
return 0;
}
netup_interface () {
local SIM=$1
local IF=$2
local IP=$3
local NM=$4
if [ $IF ] && [ $IP ] && [ $NM ] ; then
(($SIM)) || ifconfig $IF $IP netmask $NM >/dev/null 2>&1
else
return 1
fi
return $?
}
netup_gateway () {
local SIM=$1
local IF=$2
local GW=$3
if [ $IF ] && [ $GW ] ; then
(($SIM)) || route add default gw $GW dev $IF >/dev/null 2>&1
else
return 1
fi
return $?
}
netup_nameserver () {
local SIM=$1
local NS1=$2
local NS2=$3
if [ ! -w "/etc/resolv.conf" ] ; then
return 1
fi
if [ $NS1 ] ; then
(($SIM)) || echo "nameserver $NS1" >/etc/resolv.conf 2>/dev/null
if [ $? = 0 ] && [ $NS2 ] ; then
(($SIM)) || echo "nameserver $NS2" >>/etc/resolv.conf 2>/dev/null
fi
else
return 1
fi
return $?
}
netup_dhcp () {
local SIM=$1
local IF=$2
if [ $IF ] ; then
(($SIM)) || dhclient $IF >/dev/null 2>&1
else
return 1
fi
return $?
}
title () {
echo "netup (NETwork setUP) 0.4.1"
echo ""
}
usage () {
echo "Usage: ${0##*/} [options] profile"
echo ""
echo "Options:"
echo " -i, --interface IF Set the interface to IF (default: eth0)"
echo " -s, --simulate Don't do anything just simulate"
echo " -v, --verbose Verbose outputs (e.g. for debugging)"
echo " -l, --list Give a list of available profiles"
echo " -p, --print Print setup of the given profile"
echo " -h, --help Display this help and exit"
echo ""
return 0
}
profiles () {
IFS=$'\t'
echo "Profiles:"
echo "---------"
for file in $PFDIR/*.pf ; do
file=${file##*/}
file=${file%\.pf}
if [ "$file" = "*" ] ; then
echo "None"
elif [ -f "$PFDIR/$file.pf" ] ; then
echo "$file"
fi
done
return 0
}
title
if [ $# -lt 1 ] ; then
usage
exit 1
fi
while [ "$1" ] ; do
if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then
usage
exit 0
elif [ "$1" = "-l" ] || [ "$1" = "--list" ] ; then
profiles
exit 0
elif [ "$1" = "-p" ] || [ "$1" = "--print" ] ; then
PRT=1
elif [ "$1" = "-s" ] || [ "$1" = "--simulate" ] ; then
SIM=1
elif [ "$1" = "-v" ] || [ "$1" = "--verbose" ] ; then
VRB=1
elif [ "$1" = "-i" ] || [ "$1" = "--interface" ] ; then
IF="$2"
shift
elif [ -f "$PFDIR/$1.pf" ] ; then
PF="$PFDIR/$1.pf"
else
if [ -z "${1##-*}" ] ; then
echo "Unknown option"
else
echo "No such profile"
fi
exit 1
fi
shift
done
if [ -z "$PF" ] ; then
echo "No profile specified"
exit 1
else
. "$PF"
fi
if [ $PRT = 1 ] || [ $VRB = 1 ] ; then
netup_config $PN $IF $IP $NM $GW $NS1 $NS2
(($PRT)) && exit 0
echo ""
fi
if [ $DHCP = 0 ] ; then
echo -n "Configuring interface '$IF'... "
if netup_interface $SIM $IF $IP $NM ; then
echo "Done"
else
echo "Failed"
fi
echo -n "Configuring default gateway... "
if netup_gateway $SIM $IF $GW ; then
echo "Done"
else
echo "Failed"
fi
echo -n "Configuring nameserver... "
if netup_nameserver $SIM $NS1 $NS2 ; then
echo "Done"
else
echo "Failed"
fi
else
echo -n "Starting DHCP client... "
if netup_dhcp $SIM $IF ; then
echo "Done"
else
echo "Failed"
fi
fi
exit 0
sample.pf
Code:
#
# Profile: Sample
#
PN="Sample"
IP="192.168.0.2"
NM="255.255.255.0"
GW="192.168.0.1"
NS1="192.168.0.1"
Verbesserungsvorschläge oder Anpassungen an dem Skript sind herzlich willkommen
!
Ich weiß nicht ob ich z.Z. noch dazu komme Änderungen daran vorzunehmen aber hier mal eine Liste was aus meiner Sicht noch zu verbessern wäre:
To-Do:
- Anpassbarkeit an andere Systeme erhöhen durch seperate Config-Datei
- Fehler-Ausgaben der aufgerufenen Programme speichern und am Ende ausgeben (nach 'echo "Failed"')
- Erstellung von Profilen durch das Skript (aus übergebenen Parametern oder der aktuellen Netzwerk-Konfiguration)
- Mehr Optionen zu den Profilen hinzufügen (z.B. Broadcastmaske)
- etc.
Hoffe das es jemand nützlich findet
!
EDIT:
Ach ja, der Aufruf sieht am Beispiel von sample.pf so aus:
Code:
$./netup.sh sample
netup (NETwork setUP) 0.4
Configuring interface 'eth0'... Done
Configuring default gateway... Done
Configuring nameserver... Done
EDIT (2006-12-15 17:12):
Wer mein Script ausprobiert sollte wissen das ich gerade herausgefunden habe das die Optionen zum Simulieren (-s) nicht wie gewünscht funktioniert. Die Datei /etc/resolv.conf wird dabei überschrieben auch wenn der Schalter "-s" auf der Kommandozeile angegeben ist!
EDIT (2006-12-15 17:50):
Ich habe den Fehler den ich in EDIT (2006-12-15 17:12) beschrieben habe behoben und den Code oben aktualisiert.
Gruß,
Philip