Criando um painel de rede em PHP
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.
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:
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:
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.
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:
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.
<?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.
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
Pode-se muito facilmente portá-lo para PHP.
http://www.phpbrasil.com/scripts/script.php/id/854
19/03/2003 10:07pm
(~22 anos atrás)
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);
}
?>
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)
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)
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>";
?>
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)
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
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
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 -->
<!-- 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 ....
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)