2010-01-30 6 views
3

J'ai essayé l'analyse syntaxique une liste des utilisateurs connectés via SSH à un serveur, mais les résultats sont très irréguliers, donc j'été obligé de le faire simplement:analysant la sortie de commande Linux « qui » en PHP

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

Existe-t-il un meilleur moyen d'analyser la sortie de who dans la ligne de commande avant de laisser PHP jouer avec lui? Je le veux dans un tableau qui contient le nom d'utilisateur (première colonne ci-dessous), le terminal auquel ils sont connectés (deuxième colonne), la date et l'heure auxquelles ils se sont connectés (troisième) et l'IP d'où ils sont connectés (entre parenthèses). Je suppose que je devrais utiliser preg_split pour diviser les données, mais il semble vraiment parfois irrégulière avec une longueur de nom d'utilisateur, le nom du terminal, etc ..

(une sortie exemple de 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) 

Répondre

4

explode() ing sur les nouvelles lignes (\n) vous donne un tableau avec un élément par ligne, et quand vous l Oop à travers le tableau, et utiliser preg_split("/\s+/", $sValue, 3), il devrait vous donner un nouveau tableau avec chaque colonne comme un élément. Ensuite, vous devez diviser la date et l'addr.

Le code complet serait quelque chose comme ceci:

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

Vous pouvez trouver le résultat dans $aUsers.

0

preg_split seulement besoins pour correspondre à l'espace entre les données, et non les données elles-mêmes:

$who = shell_exec('who'); 
$users = array(); 
foreach(split("\n", $who) as $user) { 
    $users[] = preg_split("/\s{2,}/", $user); //Match 2 or more whitespace chars 
} 
0
$who = shell_exec('who'); 
$s = split("\n",$who); 
$func = function($value) { return preg_split("/\s{2,}/",$value); }; 
print_r(array_map($func, $s)); 
Questions connexes