短い答えは次のとおりです。

短い答えは次のとおりです。

私の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に渡されますが、これはほとんど必要ありません。これを見ると、経験の少ない人のアドバイスを受けているという警告信号が送信されます。grepsedheadこれは、「解決策」が間違っているという意味ではありません。しかし、少し合理化が必要な場合があります。

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両方が表示されます。tun0eth0

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)

関連情報