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
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
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
(Themenstarter)
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
(Themenstarter)
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
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:
| # 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: | 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
(Themenstarter)
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
(Themenstarter)
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
(Themenstarter)
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
(Themenstarter)
Anmeldungsdatum: 31. Dezember 2008
Beiträge: 4101
|
@Sid Burn: Öhm, was is jetzt der Fehler. Ich seh keinen.
|
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
|