Get MAC Address
-
@tt_su said:
This is one of those areas where you probably would end up with code branching for the different ruby interpreters.
Then branching it is.
mac_addr = [] cmd = @@windows ? 'ipconfig /all' ; 'ifconfig' # choose lines that have only six pairs of 2 char hex values separated by either a ; or - regex = Regexp.compile('(..[;-]){5}..') if (RUBY_VERSION[0..2] == '1.8') lines = %x[#{cmd}].split("\n").grep(regex) lines.each { |line| mac_addr << (line.strip[-17, 17]).upcase().gsub(/-/, ';') } else temp_path = File.expand_path(ENV['TMPDIR'] || ENV['TMP'] || ENV['TEMP']) tempfile = File.join(temp_path, 'temp.txt') `#{cmd} > #{tempfile}` File.open(tempfile, 'r') do |file| lines = file.grep(regex) lines.each { |line| mac_addr << (line.strip[-17, 17]).upcase().gsub(/-/, ';') } end File.unlink(tempfile) end
-
similar:
ipa = %x[ipconfig /all].split("\n").grep /\A\s*(Physical Address)/
The regular expression means:
\A start of line
\s* one or more space characters
and the parens group the stringreturns:
[ " Physical Address. . . . . . . . . ; XX-XX-XX-ED-C2-XX", " Physical Address. . . . . . . . . ; 00-XX-XX-ED-C2-XX", " Physical Address. . . . . . . . . ; XX-XX-XX-E5-20-XX", " Physical Address. . . . . . . . . ; 00-00-00-00-00-00-00-E0", " Physical Address. . . . . . . . . ; 00-00-00-00-00-00-00-E0", " Physical Address. . . . . . . . . ; 00-00-00-00-00-00-00-E0" ]
The first 2 are the Wireless:
- Microsoft Virtual Miniport Adapter
- the actual 802.11b/g/n Adaptor
The third is the Ethernet port.
The last 2 are virtual tunneling ports.
~
-
DUh... I just stumbled upon GetMAC.exe on my Win 7 machine. (It is in the "%WINDIW%/System32" directory.)
Ironic given the title of the topic.
Win 7 comes with it installed.
It is installed on XP Pro, but other editions need to install the Resource Kit or Support Tools. (They are separate installers on the install CD.)
Documentation page: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/getmac.mspx?mfr=true
Output looks like:
%(#008080)[C:\Users\Dan>getmac]
Physical Address Transport Name =================== ========================================================== XX-XX-XX-2B-E5-XX \Device\Tcpip_{<a GUID is output here>} XX-XX-XX-C2-1B-96 Media disconnected XX-XX-XX-C2-1B-96 Media disconnected
-
A fellow in Russian has been testing this and ends up with this error when running SU 2014.
Error: #<ArgumentError: invalid byte sequence in UTF-8>
The line of code that is fails on islines = file.grep(regex)
So the next thing we did was change the prior line to but had the same error.
File.open(tempfile, 'r', :encoding => 'iso-8859-1') do |file|
What is interesting and confusing is that when we ran this code from the web-console it worked
mac_addr = [] cmd = 'ipconfig /all' regex = Regexp.compile('(..[;-]){5}..') if (RUBY_VERSION[0..2] == '1.8') lines = %x[#{cmd}].split("\n").grep(regex) lines.each { |line| mac_addr << (line.strip[-17, 17]).upcase().gsub(/-/, ';') } else temp_path = File.expand_path(ENV['TMPDIR'] || ENV['TMP'] || ENV['TEMP']) tempfile = File.join(temp_path, 'temp.txt') `#{cmd} > #{tempfile}` File.open(tempfile, 'r', ;encoding => 'iso-8859-1') do |file| lines = file.grep(regex) lines.each { |line| mac_addr << (line.strip[-17, 17]).upcase().gsub(/-/, ';') } end File.unlink(tempfile) end mac_addr[1]
-
Encoding::default_internal
has not been set correctly in the first release of SU2014.SO try:
File.open(tempfile, 'r', :encoding => 'iso-8859-1:utf-8') do |file|
-
My mistake this does work.
We got our versions crossed up.File.open(tempfile, 'r', :encoding => 'iso-8859-1') do |file|
Thanks anyway Dan
-
OH he is in Russia, so he's likely running a different codepage.
Get his default system Encoding:
Encoding::find("filesystem")
>> an encoding
(On my machine it returns the#<Encoding:Windows-1252>
object reference.)
or
Encoding::locale_charmap
>> returns a name for the encoding.
(On my machine it returns the string"CP1252"
.) -
For me it just returns an error.
(eval):5:in `run': uninitialized constant JF::WebConsole::Encoding -
Sorry - I see this only works in SU 2014
-
I've run into issues with taking the fist or second Mac Address out of ifconfig or ipconfig /all.
I've changed the code to look at the entire file and then to step through it line by line and treat it as a bit of a state machine.
Thanks to pgarmyn and Driven I think I've got some code that will work. They both helped with files as have a handful of other people.
With windows I've tested files in English, French, Russian and some with VMWare set up.
With OSX I've just tested in English.
Advertisement