开发者

Parsing the output of Linux command 'who' in PHP

开发者 https://www.devze.com 2022-12-18 09:26 出处:网络
I\'ve tried parsing a list of users currently connected via SSH to a server, but the results are very irregular, so I was forced to simply do:

I've tried parsing a list of users currently connected via SSH to a server, but the results are very irregular, so I was forced to simply do:

$users = shell_exec('who');
echo "<pre>$users</pre>";

Is there a better way to parse the output of who in the command 开发者_高级运维line before I let PHP mess around with it? I want it in an array which contains the username (first column below), the terminal they're connected on (second column), the date and time they connected (third), and the IP from where they connected (in parenthesis). I'm guessing I should use preg_split to split the data but it seems really irregular sometimes with username length, terminal name, etc..

(some example output of who):

alex     tty7         2010-01-23 17:04 (:0)
alex     pts/0        2010-01-30 17:43 (192.168.1.102)
root     pts/1        2010-01-30 17:45 (192.168.1.102)


explode()ing on newlines (\n) gives you an array with one item per line, and when you loop through the array, and use preg_split("/\s+/", $sValue, 3), it should give you a new array with every column as an item. Then you need to split the Date and the Addr.

The full code would be something like this:

<?php
$sTempUsers = shell_exec('who');
$aTempUsers = explode("\n", $sTempUsers);

$aUsers = array();
foreach($aTempUsers AS $sUser)
{
    $aTempUser = preg_split("/\s+/", $sUser, 3); // username | terminal | date addr
    preg_match("/^(.+)\s\((.+)\)$/", $aTempUser[2], $aDateAndAddr); // full match | date | addr

    $aUsers[] = array(
        $aTempUser[0], 
        $aTempUser[1], 
        $aDateAndAddr[1], 
        $aDateAndAddr[2]
    ); // username | terminal | date | addr
}
?>

You can find the result in $aUsers.


preg_split only needs to match the space between the data, not the data itself:

$who = shell_exec('who');
$users = array();
foreach(split("\n", $who) as $user) {
  $users[] = preg_split("/\s{2,}/", $user); //Match 2 or more whitespace chars
}


$who = shell_exec('who');
$s = split("\n",$who);
$func = function($value) { return preg_split("/\s{2,}/",$value ); };
print_r(array_map($func, $s));
0

精彩评论

暂无评论...
验证码 换一张
取 消