PHP '' Linux komut çıkışını Ayrıştırma

2 Cevap php

Ben şu anda bir sunucuya SSH ile bağlanan kullanıcıların bir listesini ayrıştırma denedim, ama sonuç çok düzensiz, bu yüzden ben sadece yapmak zorunda kaldı:

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

Onunla etrafında PHP karmaşa izin vermeden önce komut satırında who çıkışını ayrıştırmak için daha iyi bir yolu var mı? Ben adınızı (parantez içerisinde) birbirlerine bağlı yerden (ilk aşağıda sütun), onlar (ikinci sütun) üzerine bağlı olduğunuz terminal, tarih ve bunların bağlı zaman (üçüncü) ve IP içeren bir dizi istiyorum. Ben preg_split verileri bölmek ama vb adınızı uzunluğu, terminal adı, bazen gerçekten düzensiz görünüyor kullanmanız gerekir tahmin ediyorum.

(Bazı örnek çıktı 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)

2 Cevap

explode() satırsonlarının üzerine ing (\n) size her satıra bir madde ile bir dizi verir ve dizi döngü ve kullanmak preg_split("/\s+/", $sValue, 3), bu vermelidir zaman bir öğe olarak her sütun ile yeni bir dizi. Sonra Tarih ve Addr bölmek gerekir.

Tam kod böyle bir şey olacaktır:

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

Sen $aUsers olarak sonucu bulabilirsiniz.

preg_split, sadece veri değil, veri kendisi arasında boşluk eşleşmesi gerekir:

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