私のIPアドレスをどのように取得し、それをシェルスクリプトの変数に保存しますか?
答え1
私はipv4アドレスを取得する「現代的なツール」方法はip
代わりにそれを解析することだと思いますので、ifconfig
次のようになります。
ip4=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
ip6=$(/sbin/ip -o -6 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
またはそのようなもの。
答え2
ただ簡単にしてみてはいかがでしょうかIP=$(hostname -I)
?
答え3
WLANやその他の代替インターフェイスを検討したい場合は、それほど簡単ではありません。アドレスが必要なインターフェイス(たとえば、最初のイーサネットカードeth0)がわかっている場合は、次のコマンドを使用できます。
ip="$(ifconfig | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)"
つまり、ネットワーク構成情報を取得し、findをeth0
取得してこの行と次の行(-A 1
)を取得し、ただ最後の行の場合は、に分割するときに行の2番目の部分を取得し、スペースに分割するときに行の:
最初の部分を取得します。
答え4
バカになろうとするわけではありませんが、一つがあります正しいそれはすべてです。ip route
ソースIPのみを取得するには、出力をトリミングする必要があります。 「私のIPアドレス」(OPの単語)は、アクセスしようとしているIPによって異なります。パブリックインターネットアクセスに興味がある場合は、Googleの8.8.8.8 DNSサーバーを使用することが非常に標準です。だから...
短い答えは次のとおりです。
ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
詳細な説明です
私が到達するために使用するIPが欲しい場合インターネット、私はこれを使用します:
pi@et3:~ $ ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
10.55.0.200
私のIPを使って自分のウェブサイトのコンテンツにアクセスしたい場合VPN、私はこれを使用します:
pi@et3:~ $ ip route get 172.31.0.100 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
172.29.0.9
次の投稿は実際に説明のためのものです。ただし、すべてのLinuxシステムで動作する必要があります。したがって、これを使用して、すべてのコンピュータが常に複数のIPアドレスを持っていることを証明できます。
私が到達するために使用するIPが欲しい場合私、私はこれを使用します:
pi@et3:~ $ my_ip=$(getent hosts $(cat /etc/hostname) | awk '{print $1; exit}')
pi@et3:~ $ ip route get $my_ip | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
127.0.0.1
コマンドのsed
詳細
私が最初に言いたいのは、Unixツールを選択するときに最小限のパイプを必要とするツールを選択することです。したがって、一部の回答はifconfig
に渡されますが、これはほとんど必要ありません。これを見ると、経験の少ない人のアドバイスを受けているという警告信号が送信されます。grep
sed
head
これは、「解決策」が間違っているという意味ではありません。しかし、少し合理化が必要な場合があります。
sed
(以下にawkの例があります。)これら2つのツールに加えて、他のツールは適切ではawk
ないと思います。
sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
それが何をしているのか見てみましょう:
sed # the sed executable located via $PATH
-n # no output unless explicitly requested
' # begin the command space
/src/ # regex match the string 'src'
{ # begin a block of commands **
s/ # begin a substitution (match)
.*src * # match anything leading up to and including src and any number of spaces
\([^ ]*\) # define a group containing any number of non spaces
.* # match any trailing characters (which will begin with a space because of the previous rule).
/ # begin the substitution replacement
\1 # reference the content in the first defined group
/ # end the substitution
p # print (explicitly, remember) the result
; # designate the end of the command
q # quit
} # end the block of commands
' # end the command space
** all of which will be performed "on match"
- otherwise only the first command to following the match would be performed "on match"
- any other commands would be performed whether there was a match or not
メモ:
私はそれを使用しましたが、コメントの著者は、いくつかのシステムがフィールドの後に末尾のデータを持っていることsed -n '/src/{s/.*src *//p;q}'
を指摘しました。src
awkを使う
ip route get 8.8.8.8 | \
awk '{gsub(".*src",""); print $1; exit}'
# or
ip route get 8.8.8.8 | \
awk '{for(i=1; i<NF; i++){if($i=="src"){i++; print $i; exit}}}'
マイネットワークに関する追加情報
私のVPNとLANのifconfig
両方が表示されます。tun0
eth0
pi@et3:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.55.0.200 netmask 255.255.252.0 broadcast 10.55.3.255
inet6 fe80::71e6:5d7c:5b4b:fb25 prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:b2:96:84 txqueuelen 1000 (Ethernet)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 172.29.0.9 netmask 255.255.255.255 destination 172.29.0.10
inet6 fe80::3a8e:8195:b86c:c68c prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:e7:c3:d1 txqueuelen 1000 (Ethernet)