0

私は Perl の初心者で、1 時間ごとに IP アドレスを変更できるスクリプトを作成する必要があります。Webサイトからドングルからデータを受信し、そのWebサイトにはそのデータを受信するための時間制限があるため、変更したいので、現在、接続デバイスのプラグを抜き、別のデバイスを使用して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";
}
4

2 に答える 2

2

これはもっとコメントですが、長くなりすぎました。

スクリプトを呼び出すだけipconfig /releaseipconfig /renew、その間に数秒かかります。これにより、スクリプトが実行しようとしているように、DHCP サーバーから新しい IP が要求されます。

もちろん、新しい IP がそのように正確に保証されるわけではありません。これは、DHCP サーバーの構成に依存しますが、いずれかの方法に依存しています。アドレスの可能な範囲が非常に狭く、運が悪かったために古い IP を取得するのではないかと心配している場合は、確認して再度更新してください。毎回同じ IP を取得する場合は、サーバーが (MAC またはホスト名で) ユーザーを認識し、静的 IP をユーザーに割り当てている可能性があります。その場合、できることはネットワーク管理者に相談することだけです (とにかく私が提案する一連の行動)。

本当に保証が必要な場合は、DHCP を捨てて独自の IP を設定する必要があります。ただし、そのためには、特定の範囲の IP を自分用に予約する必要があります。そうしないと、ネットワーク管理者がクロスボウであなたを追い詰める可能性があります。

そのドングルの目的とその時間制限を設定した人によっては、とにかく実行する可能性があることに注意してください.

于 2015-01-08T13:56:12.873 に答える