Как изменить IP-адрес с помощью perl (что-то вроде ipconfig release/renew)

Я новичок в Perl, и мне нужно написать скрипт, который может менять IP-адрес через каждые 1 час. Я хочу изменить его, потому что я получаю некоторые данные от ключа с веб-сайта, и у этого веб-сайта есть некоторое время для получения этих данных, поэтому в настоящее время нам необходимо отключить подключенное устройство и использовать другое для изменения IP-адреса. (Я имею в виду, я должен запросить DHCP для другого IP.)

Но в настоящее время меня просят написать скрипт на Perl. Может ли кто-нибудь помочь мне, как это сделать?

Моя попытка сделать это:

#!/usr/bin/perl
# Simple DHCP client - sending a broadcasted DHCP Discover request

use IO::Socket::INET;
use Net::DHCP::Packet;
use Net::DHCP::Constants;

use POSIX qw(setsid strftime);

# sample logger
sub logger{
    my $str = shift;
    print STDOUT strftime "[%d/%b/%Y:%H:%M:%S] ", localtime;
    print STDOUT "$str\n";
}

logger("DHCPd tester - dummy client");

logger("Opening socket");
$handle = IO::Socket::INET->new(Proto => 'udp',
                                Broadcast => 1,
                                PeerPort => '67',
                                LocalPort => '68',
                                PeerAddr => '255.255.255.255',
                )
      || die "Socket creation error: $@\n";     # yes, it uses $@ here

# create DHCP Packet DISCOVER
$discover = Net::DHCP::Packet->new(
                      Xid => 0x12345678,
                      DHO_DHCP_MESSAGE_TYPE() => DHCPDISCOVER(),
                      DHO_VENDOR_CLASS_IDENTIFIER() => 'foo',
                      );
logger("Sending DISCOVER to 127.0.0.1:67");
logger($discover->toString());
$handle->send($discover->serialize())
              or die "Error sending:$!\n";

logger("Waiting for response from server");
$handle->recv($buf, 4096) || die("recv:$!");
logger("Got response");
$response = new Net::DHCP::Packet($buf);
logger($response->toString());

# create DHCP Packet REQUEST
$request = Net::DHCP::Packet->new(
                      Xid => 0x12345678,
                      Ciaddr => $response->yiaddr(),
                      DHO_DHCP_MESSAGE_TYPE() => DHCPREQUEST(),
                      DHO_VENDOR_CLASS_IDENTIFIER() => 'foo',
                      DHO_DHCP_REQUESTED_ADDRESS() => $response->yiaddr(),
                      );

logger("Sending REQUEST to 127.0.0.1:67");
logger($request->toString());

$handle->send($request->serialize())
              or die "Error sending:$!\n";
logger("Waiting for response from server");
$handle->recv($buf, 4096) || die("recv:$!");
logger("Got response");
$response = new Net::DHCP::Packet($buf);
logger($response->toString());

Это вывод на терминал:

C:\shekhar_Axestrack_Intern\IpAddressChangeScripts>test6.pl
[08/Jan/2015:18:01:01] DHCPd tester - dummy client
[08/Jan/2015:18:01:01] Opening socket
[08/Jan/2015:18:01:01] Sending DISCOVER to 127.0.0.1:67
[08/Jan/2015:18:01:01] op = BOOTREQUEST
htype = HTYPE_ETHER
hlen = 6
hops = 0
xid = 12345678
secs = 0
flags = 0
ciaddr = 0.0.0.0
yiaddr = 0.0.0.0
siaddr = 0.0.0.0
giaddr = 0.0.0.0
chaddr =
sname =
file =
Options :
 DHO_DHCP_MESSAGE_TYPE(53) = DHCPDISCOVER
 DHO_VENDOR_CLASS_IDENTIFIER(60) = foo
padding [0] =

[08/Jan/2015:18:01:01] Waiting for response from server
//And it is stuck here since last 45 minutes....

Моя идея сделать это: я отправлю запрос на сервер (DHCP) (я думаю, что DHCPREQUEST() сделать это), пожалуйста, предоставьте мне новый IP-адрес.

Может кто-нибудь, пожалуйста, дайте мне знать, будет ли моя последняя строка печатать адрес ID или нет? Я имею в виду:

$response = new Net::DHCP::Packet($buf);
logger($response->toString());

РЕДАКТИРОВАТЬ:

Я также попробовал это по предложению опытных парней ниже, но это все еще не меняет IP-адрес (даже я пытался запустить этот код Perl 4 раза без успеха при смене IP-адреса. Даже я пытался запустить ipconfig /renew вручную, но все же IP-адрес одно и то же все время).

my $ipconfig = `ipconfig /renew`;
my $ipcfg_success = $?;
print $ipconfig;
if ($ipcfg_success == 0) {
    do print "n succesfully runned \n";
} else {
    do "\n succesfully NOT sunned \n";
}

2 ответа

Это скорее комментарий, но он стал слишком длинным.

Просто вызовите ваш скрипт ipconfig /release а также ipconfig /renew с несколькими секундами между ними. Это будет запрашивать новый IP-адрес с DHCP-сервера, так же, как ваш сценарий пытается это сделать.

Конечно, вам точно не гарантирован новый IP-адрес, который зависит от конфигурации DHCP-сервера, но вы зависите от этого в любом случае. Если возможный диапазон адресов очень мал, и вы боитесь, что вы можете получить старый IP в случае неудачи, проверьте и обновите снова, если это произошло. Если вы получаете один и тот же IP-адрес каждый раз, это, скорее всего, означает, что сервер распознает вас (по MAC-адресу или имени хоста) и назначает вам статический IP-адрес. В этом случае все, что вы можете сделать, это поговорить с вашим сетевым администратором (план действий, который я бы предложил в любом случае).

Если вам действительно нужна гарантия, то вам придется отключить DHCP и установить свой собственный IP. Это, однако, требует, чтобы у вас был зарезервирован некоторый диапазон IP-адресов. В противном случае ваш сетевой администратор может выследить вас своим арбалетом.

Имейте в виду, что в зависимости от того, для чего предназначен этот ключ и кто устанавливает этот лимит времени, они могут сделать это в любом случае.

Написание клиента DHCP не изменит IP-адрес вашей системы. Вам необходимо использовать клиент системы.

system('ipconfig /release & ipconfig /renew');

Вы не гарантированно получите новый адрес. Это вызывает меньше головной боли, если машины всегда имеют один и тот же IP-адрес, поэтому DHCP-серверы, как правило, всегда дают один и тот же адрес машине.

Другие вопросы по тегам