sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Get MAC Address

    Scheduled Pinned Locked Moved Developers' Forum
    55 Posts 8 Posters 4.9k Views 8 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S Offline
      slbaumgartner
      last edited by

      @garry k said:

      I'm reading that back ticks ` won't work in OSX

      Where are you reading that? They work fine for me (of course, SU may "beachball" while Ruby blocks waiting for output from a slow command).

      Steve

      1 Reply Last reply Reply Quote 0
      • G Offline
        Garry K
        last edited by

        This link makes references to it

        Link Preview Image
        Getting output of system() calls in Ruby

        If I call a command using Kernel#system in Ruby, how do I get its output? system("ls")

        favicon

        Stack Overflow (stackoverflow.com)

        1 Reply Last reply Reply Quote 0
        • D Offline
          driven
          last edited by

          @garry k said:

          I'm reading that back ticks ` won't work in OSX

          where are you reading that? they are interchangeable on a mac. Both return in Ruby Console.

          > puts `ifconfig -a | grep "ether"`
          	ether 00;** ;** ;** ;** ;36 
          	ether 00;** ;** ;** ;** ;ad 
          nil
          > puts %x(ifconfig -a | grep "ether")
          	ether 00;** ;** ;** ;** ;36 
          	ether 00;** ;** ;** ;** ;ad 
          nil
          
          

          but ifconfig will give you more that one ether, so...

           puts (%x(ifconfig -a | grep "ether")).split[1]
          "00;** ;** ;** ;** ;36"
          nil
          
          

          or mac only [I think]

          
          > > puts (%x(netstat -in | grep "en0")).split[3].inspect
          "00;** ;** ;** ;** ;36"
          nil
          

          you'll get what you want...

          john

          learn from the mistakes of others, you may not live long enough to make them all yourself...

          1 Reply Last reply Reply Quote 0
          • S Offline
            slbaumgartner
            last edited by

            @garry k said:

            This link makes references to it

            Link Preview Image
            Getting output of system() calls in Ruby

            If I call a command using Kernel#system in Ruby, how do I get its output? system("ls")

            favicon

            Stack Overflow (stackoverflow.com)

            That link discusses the various ways to capture the output of a system command and security issues that arise from issuing a system command from Ruby. Nowhere does it say that the backtick syntax does not work on Mac OS X!

            1 Reply Last reply Reply Quote 0
            • Dan RathbunD Offline
              Dan Rathbun
              last edited by

              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()

              ~

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • Dan RathbunD Offline
                Dan Rathbun
                last edited by

                @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 string ip,.. iterate it using each_line or
                split("\n") it into an array of lines, then use find, etc.

                I'm not here much anymore.

                1 Reply Last reply Reply Quote 0
                • D Offline
                  driven
                  last edited by

                  @dan

                  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]
                  

                  learn from the mistakes of others, you may not live long enough to make them all yourself...

                  1 Reply Last reply Reply Quote 0
                  • P Offline
                    pgarmyn
                    last edited by

                    @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
                    
                    1 Reply Last reply Reply Quote 0
                    • D Offline
                      driven
                      last edited by

                      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

                      learn from the mistakes of others, you may not live long enough to make them all yourself...

                      1 Reply Last reply Reply Quote 0
                      • P Offline
                        pgarmyn
                        last edited by

                        @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 ❓

                        1 Reply Last reply Reply Quote 0
                        • D Offline
                          driven
                          last edited by

                          @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.

                          learn from the mistakes of others, you may not live long enough to make them all yourself...

                          1 Reply Last reply Reply Quote 0
                          • P Offline
                            pgarmyn
                            last edited by

                            👍 👍 👍 @driven

                            1 Reply Last reply Reply Quote 0
                            • D Offline
                              driven
                              last edited by

                              @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

                              learn from the mistakes of others, you may not live long enough to make them all yourself...

                              1 Reply Last reply Reply Quote 0
                              • Dan RathbunD Offline
                                Dan Rathbun
                                last edited by

                                There IS a gem that can be used for reference (perhaps it can be made SketchUp friendly.)

                                Link Preview Image
                                macaddr/lib/macaddr.rb at master · ahoward/macaddr

                                cross platform mac address determination for ruby. Contribute to ahoward/macaddr development by creating an account on GitHub.

                                favicon

                                GitHub (github.com)

                                I'm not here much anymore.

                                1 Reply Last reply Reply Quote 0
                                • G Offline
                                  Garry K
                                  last edited by

                                  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 = true

                                  if ( @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
                                  end

                                  return ""
                                  end`

                                  1 Reply Last reply Reply Quote 0
                                  • P Offline
                                    pgarmyn
                                    last edited by

                                    @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....

                                    1 Reply Last reply Reply Quote 0
                                    • G Offline
                                      Garry K
                                      last edited by

                                      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
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • G Offline
                                        Garry K
                                        last edited by

                                        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`

                                        1 Reply Last reply Reply Quote 0
                                        • D Offline
                                          driven
                                          last edited by

                                          @gary
                                          couple of changes needed to run on my mac,
                                          got rid of class variables
                                          added windows =
                                          added simplified regex = with .. for grep

                                          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

                                          learn from the mistakes of others, you may not live long enough to make them all yourself...

                                          1 Reply Last reply Reply Quote 0
                                          • G Offline
                                            Garry K
                                            last edited by

                                            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?

                                            1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 3
                                            • 1 / 3
                                            • First post
                                              Last post
                                            Buy SketchPlus
                                            Buy SUbD
                                            Buy WrapR
                                            Buy eBook
                                            Buy Modelur
                                            Buy Vertex Tools
                                            Buy SketchCuisine
                                            Buy FormFonts

                                            Advertisement