Obtém o endereço IP local da plataforma cruzada "ip route"

2

Estou tentando extrair o endereço IP local usando um comando de plataforma cruzada. Até hoje, eu estava usando este comando:

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

Mas no Fedora 27 não está funcionando porque a saída de ip route get 1 é:

0.0.0.1 via 192.168.1.1 dev en1  src 192.168.0.229 uid 1000
    cache

Estou recebendo 1000 como o endereço IP. Em todos os outros sistemas que tentei, a saída sempre foi:

0.0.0.1 via 192.168.1.1 dev en1  src 192.168.0.229

Eu também tentei usar este comando com o mesmo resultado:

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

Eu não sou um especialista usando awk ou sed espero que você possa me ajudar.

Obrigado!

    
por nikoskip 31.01.2018 / 15:08

3 respostas

3

Para imprimir o endereço logo após src (supondo que todas as partes relevantes permaneçam na mesma linha ...):

ip route get 1 | sed 's/^.*src \([^ ]*\).*$//;q'
    
por 31.01.2018 / 15:14
0

Talvez não seja o que você está procurando, basicamente porque eu trabalho com ifconfig e não com a nova forma de comando ip para conseguir o que eu quero. Mesmo assim, deixo-vos um pedaço do script que escrevi há quase um ano para obter, entre outras coisas, o IP. Sinta-se à vontade para modificá-lo como desejar. Está escrito em Perl e funciona, sem problemas, no 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]([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;}
    }


}
    
por 31.01.2018 / 15:21
0

Tente isso

ip route get 1 | awk '{print $7}'
    
por 31.01.2018 / 15:14