Get MAC Address
-
Garry.. this is safer and faster to use boolean Constants throughout your module(s) [ie, Strings are slow.]
At the top of your module:
MAC = OSX = RUBY_PLATFORM !~ /mswin|mingw/ PC = WIN = (not MAC)
Then say down further:
if WIN # do this else # it's a Mac, do that end
another example, showing a webdialog:
WIN ? @dlg.show() : @dlg.show_modal()
~
-
@garry k said:
then for windows I can redirect the output of ipconfig
null = test(?e, '/dev/null') ? '/dev/null' : 'NUL'
Why? The
%x
or backquoted string method returns it's result.so:
ip = %x[ipconfig /all]
Then parse the stringip
,.. iterate it usingeach_line
or
split("\n")
it into an array of lines, then usefind
, etc. -
does
reply_from_ifconig.split("\n").grep("Physical Address")
or similar work on a PC?john
EDIT for something as un-changing as ifconfig on a mac you could use(%x(ifconfig -a)).split("\n")[10].split[1]
-
@dan rathbun said:
similar:
ipa = %x[ipconfig /all].split("\n").grep /\A\s*(Physical Address)/
....Scanning for “Physical Address” only gives a result with an EN/US OS
This works also on the old continent :def MyModule.mac_address platform = RUBY_PLATFORM.downcase iptxt = `#{(platform =~ /win32/) ? 'ipconfig /all' ; 'ifconfig'}` ## delete DHCPv6 ; iptxt.gsub!(/..\-..\-..\-..\-..\-..\-..\-..\-..\-..\-..\-..\-..\-../,"") # delete Tunnel ; iptxt.gsub!("00-00-00-00-","") ## create array with all the physical adresses ; t_array=iptxt.scan(/..\-..\-..\-..\-..\-../) #puts t_array.inspect ## returns first physical adresses if one found return t_array[0] if t_array.length>0 return nil end
-
There's also this one
mac_MAC = %x(ioreg -rd1 -c IOPlatformExpertDevice | awk "/IOPlatformUUID/ { print $3; }")
returns
"IOPlatformUUID" = "00000000-0000-1000-8000-00**********"
[my address obscured with ***]john
-
@dan rathbun said:
DUh... I just stumbled upon GetMAC.exe on my Win 7 machine....
Yes, i have it also on Win8.1
For the MAC-world (Apple-users) is there an equivalent -
@pgarmyn said:
For the MAC-world (Apple-users) is there an equivalent :?:
I just posted it above?
The command ioreg located in /usr/sbin/ioreg is used to display the I/O Kit registry.
-
-
@pgarmyn said:
:thumb: :thumb: :thumb: @driven
Well, maybe not three thumbs... it's unclear to me if that's a standard or an xtool instal, so a safer bet would be
getMACADDRESS = %x(/usr/sbin/networksetup -getMACADDRESS en0 | /usr/bin/awk '{print $3}' | /usr/bin/sed s/;//g)
which returns
001ec*******
the mac MAC address using standard instal items...
john
-
There IS a gem that can be used for reference (perhaps it can be made SketchUp friendly.)
https://github.com/ahoward/macaddr/blob/master/lib/macaddr.rb
-
I'm back at this MAC address - specifically for first Ethernet device.
This code seems to work fine for Windows 7 - but will it work for OSX ??
Has anyone tried this in a French computer or some other language?
` def get_mac_address()
return @mac_address if defined?( @mac_address )@win = ( RUBY_PLATFORM =~ /darwin/i ) == nil
tmp = ""
str = ""
first = trueif ( @win )
# for windows put results in array - splitting on newline
ipa = %x[ipconfig /all].split("\n")# check begining of string for 'Ethernet' and set flag once found # then check for 'Physical Address' and look at everything after the ':' # set mac_address and return ipa.each {|line| tmp = line.strip str = tmp[0..7] if ( first ) first = false if ( "Ethernet" == str ) elsif ( "Physical" == str ) pos = tmp.rindex( ":" ) @mac_address = tmp[pos+2, tmp.length ] return @mac_address end }
else
tmp = %x[ifconfig eth0].strip
pos = tmp.rindex( " " )
@mac_address = tmp[pos+1, tmp.length ]
return @mac_address
endreturn ""
end` -
@Garry
As i said before, this only works for US or EN OS.
The output of ipconfig depends on the OS language.
In French you will have to scan for "adresse physique" and for the other languages.... -
This works in Windows 7
def get_mac_address() return @@mac_address if defined?( @@mac_address ) if ( ( RUBY_PLATFORM =~ /darwin/i ) == nil ) cmd = 'ipconfig /all' else cmd = 'ifconfig' end macs = [] lines = %x[#{cmd}].split("\n").grep( /^.*\s([0-9a-f|A-F]{2}[:-]){5}([0-9a-f|A-F]{2})$/ ) lines.each{|line| macs << line.strip[-17,17] } @@mac_address = macs.first.gsub( '-', ':' ) return @@mac_address end
-
Thanks pgarmyn - I was just confirming the language thing
I did try running the code that you posted earlier - but it gave me an error so I decided this was a good opportunity to learn more.I have cleaned this up so if it is benefit to others
` def get_mac_address()
return @@mac_address if defined?( @@mac_address )mac_addr = [] cmd = @@windows ? 'ipconfig /all' : 'ifconfig' # choose lines that have only six pairs of 2 char hex values separated by either a : or - # pattern must start with a space and be at the end of the line # there can be white space at the end of the line lines = %x[#{cmd}].split("\n").grep( /\s([0-9A-F]{2}[-:]){5}([0-9A-F]{2})\s*$/ ) lines.each{|line| mac_addr << (line.strip[-17,17]).gsub( /-/, ':' ) } # if windows and we have more than 1 mac address use the second one otherwise use the first # if not windows then use the first address index = @@windows && mac_addr.length > 1 ? 1 : 0 @@mac_address = mac_addr[index] return @@mac_address
end`
-
@gary
couple of changes needed to run on my mac,
got rid of class variables
addedwindows =
added simplifiedregex =
with..
forgrep
def get_mac_address() windows = ( ( RUBY_PLATFORM =~ /darwin/i ) == nil ) return mac_address if defined?( mac_address ) mac_addr = [] cmd = windows ? 'ipconfig /all' ; 'ifconfig' # choose lines that have only six pairs of 2 char hex values separated by either a ; or - # pattern must start with a space and be at the end of the line # there can be white space at the end of the line regex = Regexp.compile("(..[;-]){5}..") lines = %x[#{cmd}].split("\n").grep( regex ) lines.each{|line| mac_addr << (line.strip[-17,17]).gsub( /-/, ';' ) } # if windows and we have more than 1 mac address use the second one otherwise use the first # if not windows then use the first address index = windows && mac_addr.length > 1 ? 1 ; 0 mac_address = mac_addr[index] return mac_address end
> get_mac_address 00:1e:c4:16:08:46
-
Thank-you very much, I appreciate this, since I don't have access to a mac.
I will test on Windows with your simplified regex.You show the mac_address as lower case - can you confirm that is indeed the output.
Also - off topic - but how do you get the source code to go into the embedded window? -
@garry k said:
You show the mac_address as lower case - can you confirm that is indeed the output.
yes it's lower-case, I realised that obscuring it in my other posts was counter productive, so I just adjusted only the number values to show the return this time...
@unknownuser said:Also - off topic - but how do you get the source code to go into the embedded window?
-
Thanks again. I checked the code for windows and it works fine.
I've added an upcase on the following linelines.each{|line| mac_addr << (line.strip[-17,17]).upcase().gsub( /-/, ':' ) }
-
Hello
This works fine in Sketchup 2013 but not in 2014.
Any tips?
-
@jaimeda said:
This works fine in Sketchup 2013 but not in 2014.
Due to the upgrade of the Ruby core this broke. We haven't been able to figure out why. But the workaround is to pipe the result from the command to a temporary file and read it after executing the command.
<span class="syntaxdefault"><br />tempfile </span><span class="syntaxkeyword">= </span><span class="syntaxstring">"C;/Users/Thomas/Desktop/temp.txt"<br /></span><span class="syntaxkeyword">`</span><span class="syntaxstring">ipconfig /all > #{tempfile}</span><span class="syntaxkeyword">`<br /></span><span class="syntaxdefault">puts File</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">read</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">tempfile</span><span class="syntaxkeyword">)<br /> </span><span class="syntaxdefault"></span>
Advertisement