0

我是 Perl 的初学者,我必须编写一个脚本,它可以每 1 小时更改一次 IP 地址。我想更改它,因为我从一个网站的加密狗收到一些数据,并且该网站有一些时间限制来接收这些数据,所以目前我们需要拔下连接设备并使用另一个来更改 IP 地址。(我的意思是我必须为另一个 IP 请求 DHCP。)

但目前我被要求使用 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 地址。

有人可以告诉我我的最后一行是否会打印身份证地址吗?我是说 :

$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";
}
4

2 回答 2

2

这更像是一个评论,但它变得太长了。

只需调用您的脚本ipconfig /releaseipconfig /renew中间间隔几秒钟。这将从 DHCP 服务器请求一个新 IP,就像您的脚本显然试图做的那样。

当然,您不能完全保证以这种方式获得新 IP,这取决于 DHCP 服务器的配置,但无论哪种方式,您都依赖于这种方式。如果可能的地址范围很小,并且您担心您可能会运气不好得到旧IP,请检查并再次更新。如果您每次都获得相同的 IP,则很可能意味着服务器识别出您(通过 MAC 或主机名)并将您的静态 IP 分配给您。在这种情况下,您所能做的就是与您的网络管理员交谈(无论如何我都会建议采取行动)。

如果您真的需要保证,那么您必须放弃 DHCP 并设置自己的 IP。但是,这需要您为自己保留一定范围的 IP。否则你的网络管理员可能会用他们的弩追捕你。

请注意,根据加密狗的用途以及设置时间限制的人,他们可能会做任何事情。

于 2015-01-08T13:56:12.873 回答
2

编写 DHCP 客户端不会更改系统的 IP 地址。您需要使用系统的客户端。

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

但是,您不能保证获得新地址。如果机器总是具有相同的 IP 地址,它会减少令人头疼的问题,因此 DHCP 服务器往往总是为机器提供相同的地址。

于 2015-01-08T14:14:18.683 回答