+2

Criando um painel de rede em PHP

criado por Fábio Berbert de Paula em 30/06/2002 11:50am
No bloco abaixo temos o coração do aplicativo. Utilizo uma estrutura de looping para percorrer cada máquina do array servidores, executando um ping e imprimindo seu estado na tela. Aproveitei do recurso de tabelas do HTML para melhorar a formatação da saída do programa.

<?php
while (list($site,$ip) = each($servidores)) {
  $comando = "/bin/ping -c 1 " . $ip;
  $saida = shell_exec($comando);

  echo "<td>".$site."<br>".$ip."<br>"."Status:";
  if ( ereg("bytes from",$saida) ) {
    echo "online</td>";
  } else {
    echo "<font color=red>não responde</font></td>";
  }
}
?>

Note que o comando ping acima está no formato padrão de servidores *UNIX*. Se você pretende executar este script numa máquina que roda Windows, pode substituir essa linha por:

$comando = "C:\\windows\\ping -n 1 " . $ip;

Outra particularidade foi a expressão regular utilizada para verificar se o host
está ativo. No Linux, a resposta ao comando ping é algo parecido com:

64 bytes from 200.215.128.83: icmp_seq=0 ttl=255 time=0.3 ms

Logo, se o valor da variável $saida capturada pelo comando shell_exec contiver a expressão "bytes from", sabemos que o host está ativo.

ereg("bytes from",$saida)

Altere essa expressão regular de acordo com a saída do comando ping do seu sistema operacional. No Windows em Português, a saída é parecida com:

Resposta de 200.215.129.6:bytes=32 tempo=1ms Tempo de vida=254

Logo podemos definir uma expressão regular que combine com "Resposta de", por exemplo. Os parâmetros "-n 1" ou "-c 1" dizem ao ping para enviar apenas 1 (um) pacote ICMP para a máquina-alvo. Se você não definir um limite de pacotes enviados, seu script pode ficar em loop enquanto espera pelo retorno do comando.

Comentários:

Mostrando 1 - 10 de 10 comentários
jcopacJulio disse:
Galera sou novo aki no PhpBrasil. Por isso estou tendo algumas dificuldades com este script, vcs podem me ajudar na alteração para pingar em maquinas Windows?
22/05/2009 8:05pm (~15 anos atrás)

Olá. Preciso, através do PHP, criar uma ferramenta que bloqueie e desbloqueie a internet de alguns IPs. Olhei este artigo e achei interessante, só que com o comando iptables, no meu caso, não está funcionando. Existe alguma restrição do uso da shell_exec para o comando iptables?
15/04/2005 10:23am (~19 anos atrás)

Uma alternativa Windows!

Pode-se muito facilmente portá-lo para PHP.

http://www.phpbrasil.com/scripts/script.php/id/854
19/03/2003 10:07pm (~21 anos atrás)

Luciano Reis disse:
Olá Pessoal, achei muito interessando este script do Fábio e pensei em algo diferente usando a sua idéia. Estou tentando fazer isso para identificar problemas com roteadores e assim sendo mudar as tabelas de rotas no Linux.
Eu desenvolvi o script abaixo, mas estou tendo alguns problemas, com a instrução If (ela se comporta de forma diferente quando eu executo pelo browser e direto pelo shell do linux - php arp.php)

Se alguém tiver alguma idéia, agradeço desde já.

Luciano C. dos Reis
Net Maringá Internet

<?php
$gw = "10.1.1.3";
$gw2 = "10.1.1.4";
$ip_rede = "192.168.1.0/24";
$cmd_arp = "/sbin/arp -n " . $gw;
$cmd_delroute = "/sbin/route del -net $ip_rede gw $gw";
$cmd_addroute = "/sbin/route add -net $ip_rede gw $gw2";
$saida = shell_exec($cmd_arp);
echo "$saida" . "<br>";
if ( !ereg("no entry",$saida) ) {
echo "Saindo...";
} else {
echo "Excluindo rota: " . $cmd_delroute . "<br>";
$delroute = shell_exec($cmd_delroute);
echo "Incluindo rota: " . $cmd_addroute . "<br>";
$addroute = shell_exec($cmd_addroute);
}
?>
23/10/2002 8:54am (~22 anos atrás)

Juan Roldán disse:
Achei muito interessante seu belo sistema, ocorreu uns problemas mais ja arrumei, gostaria de sabe como eu fasso para descobrir o ip do cara, tipo, se eu abrir um documento limpo, o q devo fazer para que ache o ip do individio?
26/09/2002 4:15pm (~22 anos atrás)

Cléver Anjos disse:
Eu dei uma incrementada no programa usando tabela para ficar "mais bonitinho", heheh
Tambem mudei um pouco a estrutura de dados.
<?php

function teste ( $ip ) {
exec("ping -q -c 1 $ip",$foo,$res);
return ($res==0);
}
$lista['CDL-BH'] = "cdlnet.com.br";
$lista['roteador'] = "cisco.acip.org.br";

echo "<font face=verdana>";
echo "<center>";
echo "<H3>Checagem geral do sistema</H3>";
echo "<table cellspacing=1 cellpadding=2 style=\"border-style:solid;border-width:1px;border-color:black\">";
foreach ( $lista as $k => $v ) {
$cf = ($i++&1)?"#dddddd":"#ffffff";
echo "<tr bgcolor=$cf><td>".ucfirst($k);
echo "<td>$v</td>";
if ( teste ($v) ) {
echo "<td><font color=green>OK</font>";
} else {
echo "<td><font color=red>Problemas!</font>";
}
echo "</tr>";
};
echo "</table>";

?>
13/08/2002 4:21pm (~22 anos atrás)

Felipe Lopes disse:
Só uma observação:
Esse problema foi solucionado no php 4.2 ;-)
Para resgatar uma variavel passada por URL soh pondo $_GET["comando"];

[]'s

Felipe Lopes
05/07/2002 8:43am (~22 anos atrás)

Marco,


Dê uma lida no complemento desse artigo que é
outro artigo como título: "Verificando integridade de servidores POP com PHP/sockets".

Daí basta você mudar a porta 110 usada no
exemplo do mesmo para a porta 80.

Ixalá !


Fábio Berbert de Paula
fabio@vivaolinux.com.br
www.vivaolinux.com.br
02/07/2002 7:39am (~22 anos atrás)

Eu fiz uma pequena alteração no script para que este possa dar quebra de linha na tabela e o resultado dos status das maquinas não fiquem em uma única linha ...

<!-- painel.php -->
<html>
<head>
<META HTTP-EQUIV="Refresh" CONTENT="60">
</head>
<body>
<h2>Painel de Monitoramento de Hosts</h2>
<table border=1 cellspacing=3>
<tr>
<?php
$servidores = array (
"fabio.vivaolinux.com.br" => "200.215.128.83",
"webmail.vivaolinux.com.br" => "200.215.128.241"
);

$aux = 0;
while (list($site,$ip) = each($servidores))
{
$comando = "/bin/ping -c 1 " . $ip;
$saida = shell_exec($comando);
if($aux == 5)
{
echo "</tr><tr>";
}
echo "<td>".$site."<br>".$ip."<br>"."Status:";
if ( ereg("bytes from",$saida) ) {
echo "online</td>";
} else {
echo "<font color=red>não responde</font></td>";
}
$aux++;
}
?>
</tr>
</table>
</body>
</html>
<!-- fim do programa -->

02/07/2002 6:59am (~22 anos atrás)

Eu teste executar uma serie de comandos simples com ls, cp, mv e nenhum deles funciou.
O Motivo de não funcionar é que mesmo que vc passe o conteudo da variavel $comando pela URL (QueryString), quando chegar na linha do comando ping "$comando = "/bin/ping -c 1 " . $ip; " o que vc passou por QueryString vai ser substituido por este...
Sendo assim acho que da para rodar sem preocupações ....
02/07/2002 6:54am (~22 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)