ubuntuusers.de

Shellskript um MAC-Adresse zu ändern

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Developer92 Team-Icon

Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Hey Ho, ich hab wieder mal ein Problem beim programmieren. Ich werd die Geschichte mal dazu nicht erzählen (okay, auf Wunsch könnt ihr sie hören).

Das Problem ist noch, dass mein Skript nicht ganz das macht was ich will. Dazu aber später mehr. Hier erstmal das Skript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/bin/bash

#Funktionsdeklaration
function changemac() {
	#Erst ma saubermachen
	clear
	#Welches Interface?
	echo "Welches interface? (wlan0, eth0, etc...)"
	read interface
	#WLAN runterfahren
	sudo ifconfig $(echo $interface) down
	#alte MAC ausgeben
	oldmac="Öhm, alte MAC wie krieg ich die raus?"
	echo "Die alte MAC-Adresse: $oldmac"
	#Neue MAC einlesen
	echo "Bitte geben Sie eine neue MAC ein: "
	read newmac
	#MAC-Adresse ändern
	sudo ifconfig $(echo $interface) hw ether $(echo $newmac)
	#WLAN wieder hochfahren
	sudo ifconfig $(echo $interface) up
	#Beenden
	exit
}


function restoremac() {
	#Erst ma saubermachen
	clear
	echo "Die Funktion ${FUNCNAME}() ist noch nicht implementiert"
	#Welches Interface?
	#echo "Welches interface? (wlan0, eth0, etc...)"
	#read interface
	#WLAN runterfahren
	#sudo ifconfig $(echo $interface) down
	#MAC-Adresse ändern

	#WLAN wieder hochfahren
	#sudo ifconfig $(echo $interface) up
	#Beenden
	exit
}


#Reset MAC-Adresse oder neue zuweisen?
clear
echo "-------------------------------------------------"
echo "Drücken Sie eine Zahl zum ändern der MAC-Adresse"
echo "	1) MAC-Adresse ändern"
echo "	2) MAC-Adresse rücksetzen"
echo "	3) Beenden"
echo "-------------------------------------------------"
#Die Nummer einlesen
read -n 1 todo >/dev/null
#Tja, dann mal auswerten
if (( 0 < $todo )) && (( $todo <= 5 ))
  then
    case "$todo" in
      1) changemac;;
      2) restoremac;;
      3) exit;;
    esac
  else
    echo "Falsche Eingabe oder Zahl ausserhalb der Möglichkeiten"
  exit
fi

#Unnütz aber egal...
exit

Wie man sicher sieht hab ich keinen Plan wie ich die alte MAC-Adresse auslesen kann und deshalb kann ich auch die Funktion restoremac nicht implementieren.

Hoffe hier kann mir jemand helfen, mfg

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

mac=$(LANG=C ifconfig "$interface"|awk -F 'HWaddr ' '/HWaddr / {print $2}')

Warum benutzt du $(echo $interface) statt $interface?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Normalerweise würde ich ja auch einfach ifconfig benutzen um die MAC-ID abzufragen.

Geht das denn hier nicht ?

Bei der Suche auf den man-pages stieß ich auf den macchanger: http://linux.die.net/man/1/macchanger

track

Spelter

Anmeldungsdatum:
10. Januar 2008

Beiträge: 130

Wohnort: Hof

Hm, wie wäre es mit:

ifconfig $DEVICE | grep 'Hardware' | awk '{ print $6 }'

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

diesch schrieb:

mac=$(LANG=C ifconfig "$interface"|awk -F 'HWaddr ' '/HWaddr / {print $2}')

Ahja, danke. Funktioniert wunderbar.

Warum benutzt du $(echo $interface) statt $interface?

Sag bloß ich hab nicht erwähnt dass ich in der BASH nicht mehr so fit bin....

Danke fürn Hinweis, wurde korrigiert.

Jetz muss ich nur noch wissen wie ich die originale per Hardware festgelegte mac auslesen kann.

mfg

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Spelter schrieb:

Hm, wie wäre es mit:

ifconfig $DEVICE | grep 'Hardware' | awk '{ print $6 }'

Sorry, hab das zu spät gelesen. Komischerweise gibt das nur meine 2 LAN-Adressen aus, nicht aber die MAC vom WLAN

mfg

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Im Wiki finde ich auch noch einen Hinweis auf den macchanger: http://wiki.ubuntuusers.de/WLAN/MadWifi

Vielleicht hilft Dir der weiter.

track


p.s.: Das ist ein bisschen doppelt gemoppelt:

ifconfig $DEVICE | grep 'Hardware' | awk '{ print $6 }'

Es geht doch auch einfach ohne grep:

ifconfig $DEVICE | awk '/Hardware/{ print $6 }'

Spelter

Anmeldungsdatum:
10. Januar 2008

Beiträge: 130

Wohnort: Hof

Du musst am besten eine Statusfile schreiben mit dem Tupel aus Interface Name und original MAC, dann ist ein Restore ein Kinderspiel.

Vielleicht sowas wie:

1
2
3
# sichern
# das minus nehm ich mal weil eine MAC ja Doppelpunkte hat, du kannst aber auch gerne andere Trennzeichen nehmen
echo "$interface-$(ifconfig $interface | grep 'Hardware' | awk '{ print $6 }')" > .mac.cfg

Abgewandelt von diesch läuft das dann auch auf anderen Spracheinstellungen.

Der Restore ist easy:

1
ORIGNAL_MAC = $(grep $interface .mac.cfg | cut -d"-" -f2)

Zu deinem Problem mit der WLAN Schnittstelle. Kann ich nicht nachvollziehen, funzt bei mir einwandfrei:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ ifconfig wlan0
wlan0     Link encap:Ethernet  Hardware Adresse 00:17:9a:73:e4:42  
          inet Adresse:192.168.2.133  Bcast:192.168.2.255  Maske:255.255.255.0
          inet6-Adresse: fe80::217:9aff:fe73:e442/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
          RX packets:207 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:9706 (9.7 KB)  TX bytes:5558 (5.5 KB)

$ echo "wlan0-$(ifconfig wlan0 | grep 'Hardware' | awk '{ print $6 }')"
wlan0-00:17:9a:73:e4:42

Ich hab im übrigen mal im /sys Ordner gesucht ob es nicht einfacher geht, hab leider nix gefunden was jetzt einfacher wäre. Dazu bräuchte mal die PCI ID im System. Also doch auf ifconfig verlassen.

Spiel einfach mal ein bisschen mit den Kommandos rum. Wenn du die Pipes nacheinander aufbaust, lernst du auch wie der Filter funktioniert und kannst ihn anpassen, so habs ich am schnellsten gelernt.

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Die alte MAC speichern ist eine schlecht Idee bzw. darf nur einmal gemacht werden, dann ist es kein Problem. Wenn man die Adresse mehrmals ändert darf ja nur die erste, originale MAC gespeichert werden. Ich will halt hier keine Dateien erzeugen, bei einem Neustart wird ja eh alles resettet.

Ich hab jetz mal den Befehl

echo "wlan0-$(ifconfig wlan0 | grep 'Hardware' | awk '{ print $6 }')"

ausprobiert. Funktioniert zwar wunderbar, zeigt aber leider auch nur die veränderte Adresse an und nicht die originale. Ich werd mal auf restoremac() im Moment verzichten und weitersuchen. Evtl. gibts ja ne Möglichkeit...

mfg

Spelter

Anmeldungsdatum:
10. Januar 2008

Beiträge: 130

Wohnort: Hof

Nunja, wie willst du den die Original Mac rausfinden wenn du sie per Treiber geändert hast. Der Treiber ist das einzige was die Mac Adresse bereitstellt. Bei WLAN Karten im PCMCIA Slot ist das weniger das Problem, Karte raus, rein, fertig.

Du kannst das ganze gerne auch nach /tmp schreiben, das wird sowisso beim neustarten geleert. Wer paranoid ist, mountet /tmp sowisso nur als RAM Disc via tmpfs und da isses ja wurst.

Ein ifconfig eth0 down && ifconfig eth0 up hat bei mir die Mac auf jeden Fall nicht zurückgeändert, dazu müsste ich den Treiber mit rmmod entfernen und neuladen.

Vielleicht noch zum nachtrag: Der Befehl sollte vor dem ändern der Mac Adresse durchgeführt werden und die Mac in einer File gesichert.

Ändern: start->interface ermitteln->mac sichern->mac ändern->ende

Restore: start->interface ermitteln->mac für Interface aus file auslesen->mac ändern->ende

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Spelter schrieb:

Vielleicht noch zum nachtrag: Der Befehl sollte vor dem ändern der Mac Adresse durchgeführt werden und die Mac in einer File gesichert.

Ändern: start->interface ermitteln->mac sichern->mac ändern->ende

Restore: start->interface ermitteln->mac für Interface aus file auslesen->mac ändern->ende

Das ist mir soweit auch klar. Das Problem ist nur für jedes verfügbare Interface muss ich die MAC-Adresse speicher und später entsprechend wiederherstellen (auf Wunsch des Users).

Ich bastle grad ein wenig rum, mal gucken obs am Ende funktioniert.

mfg

EDIT: Weiß jemand wie ich die Interfaces in eine Liste bekomm (Bzw. erst mal abrufe?)? Also zum Beispiel so: "eth0, eth1, wlan0".

EDIT: Das mit der Liste hat sich erledigt. Mal gucken ob ich restoremac() hinbekomme

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

Das Skript ist jetzt fertig. Zwar nicht fehlerfrei aber es funktioniert. Wäre toll wenn ein paar Leute es mal ausprobieren könnten. Nach einem Neustart ist ja alles wieder beim alten, also keine Angst. Oder man nutzt die eingebaute restore-Funktion.

Im Anhang kompiliert als ausführbares Programm (64bit) und für alle anderen noch der Quellcode (Muss übrigens beides im Terminal ausgeführt werden, grafische Oberfläche gibts evtl. später noch....)

Wär cool wenns wie gesagt jemand testen könnte, Fehlerbehebungen/Hinweise oder ähnliches wie immer erwünscht.

mfg

macchanger.x (14.8 KiB)
Download macchanger.x
macchanger (3.6 KiB)
Download macchanger

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Spelter schrieb:

Hm, wie wäre es mit: ifconfig $DEVICE | grep 'Hardware' | awk '{ print $6 }'

Hmm vergleiche bei mir:

sidburn@sid:~$ /sbin/ifconfig eth0 | grep 'Hardware' | awk '{ print $6 }'
sidburn@sid:~$ perl -MNet::Ifconfig::Wrapper=Ifconfig -E 'say Ifconfig("list")->{eth0}{ether}'
00:1b:21:0d:a5:b5

ich gebe dir sogar ein Tipp bei der Fehlersuche indem ich dir meine ausgabe von ifconfig präsentiere:

sidburn@sid:~$ /sbin/ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:1b:21:0d:a5:b5  
          inet addr:192.168.168.101  Bcast:192.168.168.255  Mask:255.255.255.0
          inet6 addr: fe80::21b:21ff:fe0d:a5b5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:96363 errors:0 dropped:0 overruns:0 frame:0
          TX packets:87367 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:106825424 (101.8 MiB)  TX bytes:8993292 (8.5 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:216 errors:0 dropped:0 overruns:0 frame:0
          TX packets:216 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:9937 (9.7 KiB)  TX bytes:9937 (9.7 KiB)

und noch ein besserer Tipp wenn du nicht drauf kommen solltest:

sidburn@sid:~$ LC_ALL=de_DE.utf8 /sbin/ifconfig 
eth0      Link encap:Ethernet  Hardware Adresse 00:1b:21:0d:a5:b5  
          inet Adresse:192.168.168.101  Bcast:192.168.168.255  Maske:255.255.255.0
          inet6-Adresse: fe80::21b:21ff:fe0d:a5b5/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
          RX packets:102383 errors:0 dropped:0 overruns:0 frame:0
          TX packets:93427 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:113426996 (108.1 MiB)  TX bytes:9527758 (9.0 MiB)

lo        Link encap:Lokale Schleife  
          inet Adresse:127.0.0.1  Maske:255.0.0.0
          inet6-Adresse: ::1/128 Gültigkeitsbereich:Maschine
          UP LOOPBACK RUNNING  MTU:16436  Metrik:1
          RX packets:220 errors:0 dropped:0 overruns:0 frame:0
          TX packets:220 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:0 
          RX bytes:10452 (10.2 KiB)  TX bytes:10452 (10.2 KiB)

Developer92 Team-Icon

(Themenstarter)
Avatar von Developer92

Anmeldungsdatum:
31. Dezember 2008

Beiträge: 4101

@Sid Burn: Öhm, was is jetzt der Fehler. Ich seh keinen.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Schon wenn zufällig ein anderes "locale" aktiv ist, geht Dein grep "Hardware" schief !

Das ist der Punkt von Sid Burn. Deshalb sollte man das vielleicht doch lieber anders machen, so als Anregung ...

Die Suche nach nicht-Blank am Zeilenanfang wäre da z.B. schon viel robuster:

ifconfig $DEVICE  |  awk '/^[^ ]/{ print $6 }'

Aber womöglich ist es auch nicht immer das 6. Wort, deshalb vielleicht besser: "nimm das letzte Wort":

ifconfig $DEVICE  |  awk '/^[^ ]/{ print $NF }'

oder, "nimm alles nach dem letzten Leerzeichen":

ifconfig $DEVICE  |  sed -n '/^[^ ]/{ s/ *$//; s/.* //; p }'

Der erste s-Filter beseitigt vorher noch die Leerzeichen hinter der MAC-Adresse.

track

Antworten |