クロスプラットフォームコマンドを使用してローカル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
1000
IPアドレスを取得しています。私が試した他のすべてのシステムでは、出力は常に次のようになります。
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;}
}
}