在PHP中解析Linux命令“who”的输出

4

我尝试解析当前通过SSH连接到服务器的用户列表,但结果非常不规则,所以我只能简单地执行以下操作:

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

在让PHP操作之前,我有没有更好的方法来解析命令行中who的输出? 我想要将它放入一个数组中,该数组包含用户名(下面的第一列),他们连接的终端(第二列),他们连接的日期和时间(第三列)以及他们连接的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

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
$who = shell_exec('who');
$s = split("\n",$who);
$func = function($value) { return preg_split("/\s{2,}/",$value ); };
print_r(array_map($func, $s));

0

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接