「iproute」クロスプラットフォームからローカルIPアドレスを取得する

「iproute」クロスプラットフォームからローカルIPアドレスを取得する

クロスプラットフォームコマンドを使用してローカルIPアドレスを抽出しようとしています。今日まで、私は次のコマンドを使用してきました。

ip route get 1 | awk '{print $NF;exit}'

ただし、出力が次のようip route get 1になるため、Fedora 27では機能しません。

0.0.0.1 via 192.168.1.1 dev en1  src 192.168.0.229 uid 1000
    cache

1000IPアドレスを取得しています。私が試した他のすべてのシステムでは、出力は常に次のようになります。

0.0.0.1 via 192.168.1.1 dev en1  src 192.168.0.229

また、同じ結果でこのコマンドを試しました。

ip route get 255.255.255.255 | sed -n '/src/ s/.*src //p'

答え1

すぐ後ろのアドレスを印刷するにはsrc(すべての関連部分が同じ行にあるとします。):

ip route get 1 | sed 's/^.*src \([^ ]*\).*$/\1/;q'

答え2

この試み

ip route get 1 | awk '{print $7}'

答え3

おそらくこれはあなたが探しているものではないかもしれません。基本的には、私が望むものを得るためにifconfig新しいコマンドフォーマットを使用する代わりに使用しているからです。ipそれにもかかわらず、IPなどを得るために約1年前に作成したスクリプトを残します。自由に修正してください。 Perlで書かれており、Debian 8(Jessie)では問題なく実行されます。

#!/usr/bin/perl -w

use strict;                                # strict style
use warnings;                              # activate warnings
use diagnostics;                           # diagnostic failover
use 5.010;
no warnings 'experimental';

if (!@ARGV) {
    print "\nPlease enter the interface name. ie: etho, wlan0, bond0...\n\n";
    exit();

}
# This piece is for avoid misspelling or other things
if ($ARGV[0] =~ s/[\$#;@~!&*()\[\];.,:?^ `\\\/]+//g) {
    print "\nWhat are you trying?\n\n";
    exit();
}


my $sentence = "ifconfig " . $ARGV[0]; 

my @ethernet = `$sentence `; 
my $length = scalar @ethernet;

for (my $i = 0; $i < $length; $i++) {

    given ($i) {

        #MAC address
        if ($i == 0) {
            if ($ethernet[$i] =~ /([0-9A-Fa-f][0-9A-Fa-f]([:-])[0-9A-Fa-f][0-9A-Fa-f](\2[0-9A-Fa-f][0-9A-Fa-f]){4})/ ) {
                my $mac_address = $1;
                print "The MAC address of $ARGV[0] is $mac_address\n";
            } break;}

        #IP address
        if ($i == 1) {
            if($ethernet[$i] =~ /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/ ){
                my $ip_address = $1;
                print "The IP address of $ARGV[0] is $ip_address\n";
                    } break;}

        #MTU
        if ($i == 3) {
            if ($ethernet[$i] =~ /MTU:([^\sB]*)/ ) {
                my $mtu = $1;
                print "The MTU of $ARGV[0] is $mtu\n";
                }; break;}

        #Recieved package
        if ($i == 4) {
            if ($ethernet[$i] =~ /RX packets:([^\sB]*)/ ) {
                my $rx_pckg = $1;
                print "The amount of Recieved Package in $ARGV[0] is $rx_pckg\n";
                }; break;}      

        #Transmited package
        if ($i == 5) {
            if ($ethernet[$i] =~ /TX packets:([^\sB]*)/ ) {
                my $tx_pckg = $1;
                print "The amount of Transmited Package in $ARGV[0] is $tx_pckg\n";
                }; break;}      

        #Number of collisions
        if ($i == 6) {
            if ($ethernet[$i] =~ /collisions:([^\sB]*)/ ) {
                my $collisions = $1;
                print "The number of collisions in $ARGV[0] is $collisions\n";
                }; break;}

        #Total RX and TX in MB and GiB
        if ($i == 7) {
            if ($ethernet[$i] =~ /RX bytes:([^\sB]*)/ ) {
                my $rx_total_byte = $1;
                my $rx_total_mega = $rx_total_byte / 1048576;
                my $rx_total_giga = $rx_total_mega / 1024;
                print "The total amount of RecievedPackets in $ARGV[0] is $rx_total_mega Mb / $rx_total_giga GiB\n";
                }

            if ($ethernet[$i] =~ /TX bytes:([^\sB]*)/ ) {
                my $tx_total_byte = $1;
                my $tx_total_mega = $tx_total_byte / 1048576;
                my $tx_total_giga = $tx_total_mega / 1024;
                print "The total amount of RecievedPackets in $ARGV[0] is $tx_total_mega Mb / $tx_total_giga GiB\n";
                }; break;}
    }


}

関連情報