Разбор вывода команды Linux 'who' в PHP - PullRequest
3 голосов
/ 31 января 2010

Я попытался проанализировать список пользователей, подключенных в настоящее время через SSH к серверу, но результаты очень нерегулярные, поэтому я был вынужден просто сделать:

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

Есть ли лучший способ проанализировать вывод who в командной строке, прежде чем я позволю PHP возиться с этим? Я хочу это в массиве, который содержит имя пользователя (первый столбец ниже), терминал, к которому они подключены (второй столбец), дату и время, когда они подключены (третий), и IP-адрес, с которого они подключены (в скобках). Я предполагаю, что я должен использовать preg_split для разделения данных, но иногда это выглядит нерегулярно с длиной имени пользователя, имени терминала и т. Д.

(в некоторых примерах вывод 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)

Ответы [ 3 ]

4 голосов
/ 31 января 2010

explode() в новых строках (\n) дает массив с одним элементом на строку, а когда вы перебираете массив и используете preg_split("/\s+/", $sValue, 3), он должен давать вам новый массив с каждым столбцом в вещь. Затем вам нужно разделить дату и адрес.

Полный код будет выглядеть примерно так:

<?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
}
?>

Вы можете найти результат в $aUsers.

0 голосов
/ 31 января 2010
$who = shell_exec('who');
$s = split("\n",$who);
$func = function($value) { return preg_split("/\s{2,}/",$value ); };
print_r(array_map($func, $s));
0 голосов
/ 31 января 2010

preg_split требуется только для соответствия пробелу между данными, а не самим данным:

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