Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get operating system info

I recently started wondering about sites like http://thismachine.info/ that get the user's operating system info. I have not been able to find out how to do that with PHP, and wanted to try to figure it out.

I noticed that they list the user-agent, which gives lots of info about the browser. Do they get the operating system information from that, or from something else? Is there an API I could use to get the user's operating system?

I see how they got the Browser and IP, but could not figure out the Operating System part!

like image 557
pattyd Avatar asked Aug 06 '13 00:08

pattyd


People also ask

How do I find my os version using CMD?

Press [Windows] key + [R] to open the “Run” dialog box. Enter cmd and click [OK] to open Windows Command Prompt. Type systeminfo in the command line and hit [Enter] to execute the command.

How do I find the Linux os version?

The command “uname -r” shows the version of the Linux kernel that you're currently using. You'll now see which Linux kernel you're using. In the above example, the Linux kernel is 5.4. 0-26.


2 Answers

The code below could explain in its own right, how http://thismachine.info/ is able to show which operating system someone is using.

What it does is that, it sniffs your core operating system model, for example windows nt 5.1 as my own.

It then passes windows nt 5.1/i to Windows XP as the operating system.

Using: '/windows nt 5.1/i' => 'Windows XP', from an array.

You could say guesswork, or an approximation yet nonetheless pretty much bang on.

Borrowed from an answer on SO https://stackoverflow.com/a/15497878/

<?php  $user_agent = $_SERVER['HTTP_USER_AGENT'];  function getOS() {       global $user_agent;      $os_platform  = "Unknown OS Platform";      $os_array     = array(                           '/windows nt 10/i'      =>  'Windows 10',                           '/windows nt 6.3/i'     =>  'Windows 8.1',                           '/windows nt 6.2/i'     =>  'Windows 8',                           '/windows nt 6.1/i'     =>  'Windows 7',                           '/windows nt 6.0/i'     =>  'Windows Vista',                           '/windows nt 5.2/i'     =>  'Windows Server 2003/XP x64',                           '/windows nt 5.1/i'     =>  'Windows XP',                           '/windows xp/i'         =>  'Windows XP',                           '/windows nt 5.0/i'     =>  'Windows 2000',                           '/windows me/i'         =>  'Windows ME',                           '/win98/i'              =>  'Windows 98',                           '/win95/i'              =>  'Windows 95',                           '/win16/i'              =>  'Windows 3.11',                           '/macintosh|mac os x/i' =>  'Mac OS X',                           '/mac_powerpc/i'        =>  'Mac OS 9',                           '/linux/i'              =>  'Linux',                           '/ubuntu/i'             =>  'Ubuntu',                           '/iphone/i'             =>  'iPhone',                           '/ipod/i'               =>  'iPod',                           '/ipad/i'               =>  'iPad',                           '/android/i'            =>  'Android',                           '/blackberry/i'         =>  'BlackBerry',                           '/webos/i'              =>  'Mobile'                     );      foreach ($os_array as $regex => $value)         if (preg_match($regex, $user_agent))             $os_platform = $value;      return $os_platform; }  function getBrowser() {      global $user_agent;      $browser        = "Unknown Browser";      $browser_array = array(                             '/msie/i'      => 'Internet Explorer',                             '/firefox/i'   => 'Firefox',                             '/safari/i'    => 'Safari',                             '/chrome/i'    => 'Chrome',                             '/edge/i'      => 'Edge',                             '/opera/i'     => 'Opera',                             '/netscape/i'  => 'Netscape',                             '/maxthon/i'   => 'Maxthon',                             '/konqueror/i' => 'Konqueror',                             '/mobile/i'    => 'Handheld Browser'                      );      foreach ($browser_array as $regex => $value)         if (preg_match($regex, $user_agent))             $browser = $value;      return $browser; }   $user_os        = getOS(); $user_browser   = getBrowser();  $device_details = "<strong>Browser: </strong>".$user_browser."<br /><strong>Operating System: </strong>".$user_os."";  print_r($device_details);  echo("<br /><br /><br />".$_SERVER['HTTP_USER_AGENT']."");  ?> 

Footnotes: (Jan. 19/14) There was a suggested edit on Jan. 18, 2014 to add /msie|trident/i by YJSoft a new member on SO.

The comment read as:

Comment: because msie11's ua doesn't include msie (it includes trident instead)

I researched this for a bit, and found a few links explaining the Trident string.

  • http://www.sitepoint.com/ie11-smells-like-firefox/
  • http://www.upsdell.ca/BrowserNews/res_sniff.htm
  • How can I target only Internet Explorer 11 with JavaScript?
  • http://en.wikipedia.org/wiki/Trident_%28layout_engine%29
  • https://stackoverflow.com/a/17907562/1415724
  • http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.110).aspx
  • An article on MSDN Blogs
  • An article on NCZOnline

Although the edit was rejected (not by myself, but by some of the other editors), it's worth reading up on the links above, and to use your proper judgement.


As per a question asked about detecting SUSE, have found this piece of code at the following URL:

  • http://codes-sources.commentcamarche.net/source/49533-operating-system-detection

Additional code:

/* return Operating System */ function operating_system_detection(){     if ( isset( $_SERVER ) ) {         $agent = $_SERVER['HTTP_USER_AGENT'];     }     else {         global $HTTP_SERVER_VARS;         if ( isset( $HTTP_SERVER_VARS ) ) {             $agent = $HTTP_SERVER_VARS['HTTP_USER_AGENT'];         }         else {             global $HTTP_USER_AGENT;             $agent = $HTTP_USER_AGENT;         }     }     $ros[] = array('Windows XP', 'Windows XP');     $ros[] = array('Windows NT 5.1|Windows NT5.1)', 'Windows XP');     $ros[] = array('Windows 2000', 'Windows 2000');     $ros[] = array('Windows NT 5.0', 'Windows 2000');     $ros[] = array('Windows NT 4.0|WinNT4.0', 'Windows NT');     $ros[] = array('Windows NT 5.2', 'Windows Server 2003');     $ros[] = array('Windows NT 6.0', 'Windows Vista');     $ros[] = array('Windows NT 7.0', 'Windows 7');     $ros[] = array('Windows CE', 'Windows CE');     $ros[] = array('(media center pc).([0-9]{1,2}\.[0-9]{1,2})', 'Windows Media Center');     $ros[] = array('(win)([0-9]{1,2}\.[0-9x]{1,2})', 'Windows');     $ros[] = array('(win)([0-9]{2})', 'Windows');     $ros[] = array('(windows)([0-9x]{2})', 'Windows');     // Doesn't seem like these are necessary...not totally sure though..     //$ros[] = array('(winnt)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'Windows NT');     //$ros[] = array('(windows nt)(([0-9]{1,2}\.[0-9]{1,2}){0,1})', 'Windows NT'); // fix by bg     $ros[] = array('Windows ME', 'Windows ME');     $ros[] = array('Win 9x 4.90', 'Windows ME');     $ros[] = array('Windows 98|Win98', 'Windows 98');     $ros[] = array('Windows 95', 'Windows 95');     $ros[] = array('(windows)([0-9]{1,2}\.[0-9]{1,2})', 'Windows');     $ros[] = array('win32', 'Windows');     $ros[] = array('(java)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})', 'Java');     $ros[] = array('(Solaris)([0-9]{1,2}\.[0-9x]{1,2}){0,1}', 'Solaris');     $ros[] = array('dos x86', 'DOS');     $ros[] = array('unix', 'Unix');     $ros[] = array('Mac OS X', 'Mac OS X');     $ros[] = array('Mac_PowerPC', 'Macintosh PowerPC');     $ros[] = array('(mac|Macintosh)', 'Mac OS');     $ros[] = array('(sunos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'SunOS');     $ros[] = array('(beos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'BeOS');     $ros[] = array('(risc os)([0-9]{1,2}\.[0-9]{1,2})', 'RISC OS');     $ros[] = array('os/2', 'OS/2');     $ros[] = array('freebsd', 'FreeBSD');     $ros[] = array('openbsd', 'OpenBSD');     $ros[] = array('netbsd', 'NetBSD');     $ros[] = array('irix', 'IRIX');     $ros[] = array('plan9', 'Plan9');     $ros[] = array('osf', 'OSF');     $ros[] = array('aix', 'AIX');     $ros[] = array('GNU Hurd', 'GNU Hurd');     $ros[] = array('(fedora)', 'Linux - Fedora');     $ros[] = array('(kubuntu)', 'Linux - Kubuntu');     $ros[] = array('(ubuntu)', 'Linux - Ubuntu');     $ros[] = array('(debian)', 'Linux - Debian');     $ros[] = array('(CentOS)', 'Linux - CentOS');     $ros[] = array('(Mandriva).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)', 'Linux - Mandriva');     $ros[] = array('(SUSE).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)', 'Linux - SUSE');     $ros[] = array('(Dropline)', 'Linux - Slackware (Dropline GNOME)');     $ros[] = array('(ASPLinux)', 'Linux - ASPLinux');     $ros[] = array('(Red Hat)', 'Linux - Red Hat');     // Loads of Linux machines will be detected as unix.     // Actually, all of the linux machines I've checked have the 'X11' in the User Agent.     //$ros[] = array('X11', 'Unix');     $ros[] = array('(linux)', 'Linux');     $ros[] = array('(amigaos)([0-9]{1,2}\.[0-9]{1,2})', 'AmigaOS');     $ros[] = array('amiga-aweb', 'AmigaOS');     $ros[] = array('amiga', 'Amiga');     $ros[] = array('AvantGo', 'PalmOS');     //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1}-([0-9]{1,2}) i([0-9]{1})86){1}', 'Linux');     //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1} i([0-9]{1}86)){1}', 'Linux');     //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1})', 'Linux');     $ros[] = array('[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}', 'Linux');     $ros[] = array('(webtv)/([0-9]{1,2}\.[0-9]{1,2})', 'WebTV');     $ros[] = array('Dreamcast', 'Dreamcast OS');     $ros[] = array('GetRight', 'Windows');     $ros[] = array('go!zilla', 'Windows');     $ros[] = array('gozilla', 'Windows');     $ros[] = array('gulliver', 'Windows');     $ros[] = array('ia archiver', 'Windows');     $ros[] = array('NetPositive', 'Windows');     $ros[] = array('mass downloader', 'Windows');     $ros[] = array('microsoft', 'Windows');     $ros[] = array('offline explorer', 'Windows');     $ros[] = array('teleport', 'Windows');     $ros[] = array('web downloader', 'Windows');     $ros[] = array('webcapture', 'Windows');     $ros[] = array('webcollage', 'Windows');     $ros[] = array('webcopier', 'Windows');     $ros[] = array('webstripper', 'Windows');     $ros[] = array('webzip', 'Windows');     $ros[] = array('wget', 'Windows');     $ros[] = array('Java', 'Unknown');     $ros[] = array('flashget', 'Windows');     // delete next line if the script show not the right OS     //$ros[] = array('(PHP)/([0-9]{1,2}.[0-9]{1,2})', 'PHP');     $ros[] = array('MS FrontPage', 'Windows');     $ros[] = array('(msproxy)/([0-9]{1,2}.[0-9]{1,2})', 'Windows');     $ros[] = array('(msie)([0-9]{1,2}.[0-9]{1,2})', 'Windows');     $ros[] = array('libwww-perl', 'Unix');     $ros[] = array('UP.Browser', 'Windows CE');     $ros[] = array('NetAnts', 'Windows');     $file = count ( $ros );     $os = '';     for ( $n=0 ; $n<$file ; $n++ ){         if ( preg_match('/'.$ros[$n][0].'/i' , $agent, $name)){             $os = @$ros[$n][1].' '.@$name[2];             break;         }     }     return trim ( $os ); } 

Edit: April 12, 2015

I noticed a question yesterday that could be relevant to this Q&A and may be helpful for some. In regards to:

Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-GT-I9505 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36

  • Question: Store specific data in variable from another variable with regex with PHP
  • Answer: https://stackoverflow.com/a/29584014/

Another edit, and adding a reference link that was asked (and answered/accepted today, Nov. 4/16) which may be of use.

Consult the Q&A here on Stack:

  • PHP Regex for OS detection
like image 52
Funk Forty Niner Avatar answered Sep 25 '22 00:09

Funk Forty Niner


When you go to a website, your browser sends a request to the web server including a lot of information. This information might look something like this:

GET /questions/18070154/get-operating-system-info-with-php HTTP/1.1   Host: stackoverflow.com   User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36              (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36  Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8   Accept-Language: en-us,en;q=0.5   Accept-Encoding: gzip,deflate,sdch   Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7   Keep-Alive: 300   Connection: keep-alive   Cookie: <cookie data removed>  Pragma: no-cache   Cache-Control: no-cache 

These information are all used by the web server to determine how to handle the request; the preferred language and whether compression is allowed.

In PHP, all this information is stored in the $_SERVER array. To see what you're sending to a web server, create a new PHP file and print out everything from the array.

<pre><?php print_r($_SERVER); ?></pre> 

This will give you a nice representation of everything that's being sent to the server, from where you can extract the desired information, e.g. $_SERVER['HTTP_USER_AGENT'] to get the operating system and browser.

like image 27
kba Avatar answered Sep 24 '22 00:09

kba