我是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地址。
有人可以告诉我,如果我的最后一行会打印ID地址吗?我的意思是:
$response = new Net::DHCP::Packet($buf);
logger($response->toString());
编辑:
我也尝试了以下经验丰富的人的建议,但它仍然没有改变IP地址(即使我试图运行这个perl代码4次没有成功的IP更改 - 甚至我试图手动运行ipconfig /续订但仍然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";
}
答案 0 :(得分:2)
这更多的评论,但它变得太长了。
让你的脚本在几秒钟之间调用ipconfig /release
和ipconfig /renew
。这将从DHCP服务器请求新的IP,就像您的脚本显然试图这样做。
当然,你并没有完全保证新的IP,这取决于DHCP服务器的配置,但你依赖于这两种方式。如果可能的地址范围非常小并且您担心可能因运气不好而得到旧的IP,请检查并在发生时再次续订。如果每次都获得相同的IP,则很可能意味着服务器识别您(通过MAC或主机名)并为您分配静态IP。在这种情况下,您所能做的就是与您的网络管理员交谈(无论如何我会建议的行动方案)。
如果您确实需要保证,那么您必须放弃DHCP并设置自己的IP。但是,这需要您为自己保留一定范围的IP。否则,您的网络管理员可能会用弩弓追捕您。
请注意,根据加密狗的用途以及设置时间限制的人,他们可能会这样做。
答案 1 :(得分:2)
编写DHCP客户端不会改变系统的IP地址。您需要使用系统的客户端。
system('ipconfig /release & ipconfig /renew');
但您无法保证获得新地址。如果计算机始终具有相同的IP地址,则会减少头痛,因此DHCP服务器往往始终为计算机提供相同的地址。