首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用perl更改IP地址(类似于ipconfig release/renew)

如何使用perl更改IP地址(类似于ipconfig release/renew)
EN

Stack Overflow用户
提问于 2015-01-08 20:48:15
回答 2查看 1K关注 0票数 0

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

但目前我被要求使用Perl编写脚本。有没有人能教我怎么做?

我的尝试是:

代码语言:javascript
复制
#!/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());

它在终端上的输出是:

代码语言:javascript
复制
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地址吗?我的意思是:

代码语言:javascript
复制
$response = new Net::DHCP::Packet($buf);
logger($response->toString());

编辑:

我也尝试了下面有经验的家伙的建议,但它仍然没有改变IP地址(甚至我试图运行这个perl代码4次,但没有成功的IP更改-甚至我试图手动运行ipconfig /renew,但IP始终是相同的)。

代码语言:javascript
复制
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";
}
EN

回答 2

Stack Overflow用户

发布于 2015-01-08 21:56:13

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

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

当然,这种方式并不能完全保证您有一个新的IP,这取决于DHCP服务器的配置,但您依赖于这两种方式中的任何一种。如果可能的地址范围非常小,并且您担心可能会因运气不佳而获得旧IP,请检查并在发生这种情况时再次续订。如果您每次都获得相同的IP,这很可能意味着服务器识别您(通过MAC或主机名),并将您的静态IP分配给您。在这种情况下,您所能做的就是与您的网络管理员对话(无论如何,我都会建议您这样做)。

如果您确实需要一个保证,那么您必须抛弃DHCP并设置您自己的IP。然而,这需要你有一定范围的IP为你保留。否则,您的网络管理员可能会用他们的十字弓追捕您。

请注意,根据软件狗的用途和谁设置了时间限制,他们可能会以任何方式进行操作。

票数 2
EN

Stack Overflow用户

发布于 2015-01-08 22:14:19

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

代码语言:javascript
复制
system('ipconfig /release & ipconfig /renew');

不过,并不能保证你会得到一个新地址。如果机器始终具有相同的IP地址,则不会造成太多麻烦,因此DHCP服务器倾向于始终为机器提供相同的地址。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27840526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档