Встала задача узнать IP DSL раутера DLINK-2500U (модем сам устанавливает PPPoE соединение).
Можно, конечно, воспользоваться сервисами, типа этого
checkip.dyndns.org ,
но хотелось в пёрвую очередь определить ip своим силами.
У модема есть telnet сервис. Можно подключиться, и "узнать" нужную информацию у модема.
В результате был написал php скрипт, который работает на web сервере.
Исходник:
$ip = "172.16.19.27"; //modem ip
$user = "admin";
$pass = "admin";
$conn = "ppp_0_33_1";
set_time_limit(6); //Modem not answered?
function read_search($sock, $search)
{
$str = "";
while(!feof($sock))
{
$cur_str = fread($sock, 65536);
// echo $cur_str;
$str .= $cur_str;
if(@strstr($cur_str, $search) != false)
break;
}
return $str;
}
$sock = fsockopen($ip, 23, $errno, $errstr, 5);
if(!$sock)
{
echo "Error: ". $errstr . "(" . $errno . ") \n";
} else
{
read_search($sock, "ogin:");
fwrite($sock, $user . "\n");
read_search($sock, "assword:");
fwrite($sock, $pass . "\n");
read_search($sock, "#");
fwrite($sock, "ifconfig\n");
$str = read_search($sock, $conn);
$str = explode("\n", $str);
//search
$conn_len = strlen($conn);
$found = 0;
for($i = 0; $i < count($str); $i++)
{
if(substr($str[$i], 0, $conn_len) == $conn)
{
$found = 1;
break;
}
}
if($found == 1)
{
$strs1 = split(" ", trim($str[$i + 1]));
$strs2 = split(":", $strs1[1]);
$modem_ip = $strs2[1];
}
//end
//Logout
fwrite($sock, "exit\n");
read_search($sock, "");
//end
}
//Like http://checkip.dyndns.org/
?>
Current IP Check
= "Current IP Address: " . $modem_ip . "\n"; ?>
Вот что происходит при работе скрипта:
BCM96338 ADSL Router
(none) login: admin
Password:
BusyBox v1.00 (2005.04.12-18:11+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.
# ifconfig
br0 Link encap:Ethernet HWaddr 00:19:5B:11:56:D1
inet addr:172.16.19.27 Bcast:172.16.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1
RX packets:102008 errors:0 dropped:0 overruns:0 frame:0
TX packets:92566 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:40975551 (39.0 MiB) TX bytes:58218590 (55.5 MiB)
eth0 Link encap:Ethernet HWaddr 00:19:5B:11:56:D1
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:102334 errors:1 dropped:0 overruns:0 frame:0
TX packets:95240 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:42835240 (40.8 MiB) TX bytes:61273089 (58.4 MiB)
Interrupt:23 Base address:0x2800
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:2 errors:0 dropped:0 overruns:0 frame:0
TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:272 (272.0 B) TX bytes:272 (272.0 B)
nas_0_33 Link encap:Ethernet HWaddr 02:19:5B:11:56:D1
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:90231 errors:0 dropped:0 overruns:0 frame:0
TX packets:97359 errors:0 dropped:20 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:58885326 (56.1 MiB) TX bytes:43629570 (41.6 MiB)
ppp_0_33_1 Link encap:Point-Point Protocol
inet addr:88.147.186.207 P-t-P:88.147.128.92 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1
RX packets:87329 errors:0 dropped:0 overruns:0 frame:0
TX packets:96802 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:55778156 (53.1 MiB) TX bytes:40488721 (38.6 MiB)
# exit
Current IP Check
Current IP Address: 88.147.186.207
Думаю всё тут понятно - скрипт просто парсит вывод команды ifconfig...