IPアドレスのみを取得し、他には何も取得しない端末コマンドはどれですか?


118

私が書いたスクリプトのパラメーターとして、IPアドレス(inet)だけを使用しようとしています。

unixターミナルで、調べるのではなくIPアドレスだけを取得する簡単な方法はありifconfigますか?


ええ、または私が推測するマシンに関する他の一意の識別子です。
メイソン

1
ホスト名-iで無効なオプションを取得しますか?
Ken

4
ホスト名はifconfigほど信頼できません
joel

2
joelは
正解

2
以下の回答を参照するときip -o addressは、の出力の方がの出力よりもはるかに扱いやすいことに注意してip addressください。
-jlh

回答:


177

次のようなIPのみを返すスクリプトを作成できます。

/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'

Mac用:

ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\  -f2

またはLinuxシステムの場合

hostname -i | awk '{print $3}' # Ubuntu 

hostname -i # Debian

4
hostname -i私の場合は次のように返されます:::1 127.0.1.1 192.168.1.100
ゼウス記の書

1
Debianでは、IPは1つだけです。したがって、使用hostnameは移植可能ではありません。
Timofey Stolbov、2011

1
-iと-Iはどちらも無効なオプションであると述べています
Mason

3
要約すると、最初の方法はアダプターに依存しますが、常に同じとは限りません。2つ目は、私には2つのIPアドレスが表示され、最後の2つはMacでは機能しません。
Matt

4
ifconfigは非推奨でここでは信頼できません。たとえば、grepは「inet addr:172.17.0.4」を出力しないため、debian 9(ストレッチ)で失敗し、「inet 172.17.0.4」のみを出力します。stackoverflow.com/a/26694162/72717で説明されているように、代わりに「ip」を使用します。
jamshid

61

これにより、ループバック127.0.0.1を含むすべてのIPv4インターフェースが提供されます。

ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

これは表示するだけですeth0

ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'

このようにして、IPv6アドレスを取得できます。

ip -6 addr | grep -oP '(?<=inet6\s)[\da-f:]+'

eth0IPv6 のみ:

ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'

grep -oPbusybox v1.24.1での失敗:無効なオプション-P
Pro Backup

1
grepは、prodのほぼすべてのdocker conatinerにインストールされているわけではありません。したがって、これらはすべて適切なコマンドですが、コンテナでは役に立ちません:-(
AndyGee

1
私の特定のケースに対する最良の答え。-PPerl正規表現のスイッチが必要(?<=inet\s)です。そうしないと、後読みトークンを使用できません。あなたは実行することにより、同様の結果を得ることができるgrep -oe 'inet [0-9\.]\+'grep -oe 'inet6 [0-9a-f:]\+'が、この方法は、私が最初の単語を取り除くことはできません。SuSE man grepでは、-Pフラグは実験的であると報告しています。
ホルヘベロン

これが最良の答えです。ifconfigは、ほとんどのOSで数年後に非推奨になりました。
pozcircuitboy

2
2番目のコマンドの短いバージョン:ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
tukusejssirs

40

一般に、システムにIPアドレスが1つしかないことが保証されることはありません。たとえば、イーサネット接続とwlan接続の両方が可能であり、アクティブなVPN接続がある場合は、さらに別のIPアドレスが割り当てられます。

Linux

Linuxでは、hostname -I現在のIPアドレスがリストされます。常に1つのIPアドレスのみを返すことに依存すると、一部のシナリオ(つまり、VPNリンクがアップしている)では期待どおりに機能しない可能性が高いため、より信頼性の高い方法は、結果を配列に変換し、要素をループします。

ips=($(hostname -I))

for ip in "${ips[@]}"
do
    echo $ip
done

OSX

OSXでは、インターフェースがわかっている場合は、以下を使用できます。

~$ ipconfig getifaddr en0
192.168.1.123

それはちょうど戻りますIPアドレスます。

それとも、可能性の可能なインタフェース名を超えるループ、接尾辞で始まる、すなわちen

for NUMBER in $(seq 0 5); do
    ip=`ipconfig getifaddr en$NUMBER`
    if [ -n "$ip" ]; then
        myip="$ip"
        break
    fi
done

echo $myip

また、ケーブル接続とwifi接続の両方が確立されている場合、マシンに複数のイーサネットインターフェースがある場合、またはVPNトンネルが存在する場合、IPアドレスの取得は不確定になります。

外部IPを取得する

外部IPが必要な場合は、テキストモードサービスをクエリできます。たとえばcurl https://ipecho.net/plain、プレーンテキストの外部 IPを返します。

また、外部IPを取得するさらに高速な方法は、既知のDNSサーバーにクエリを実行することです。

dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short

LAN IPアドレスを取得する方法
diEcho 2017

17
hostname -I  

このコマンドは、Ubuntuで必要な正確なIPアドレスを提供します。


すでに存在する(投票数の多い)回答の数と比較すると、この回答が価値をもたらすとは思わない...
Mischa

4
また、
Centos

1
これは実際に私を助けました-指摘された大文字の 'i'がキー
でした

2
同じように、これは余分なツールなしで出力をクリーンアップするために15個のバイナリを連続して呼び出す必要がなく、完全に機能します。よろしくお願いします!
Ulrar 2018

11

最新のUbuntuバージョン(14.04-16.04)では、このコマンドでうまくいきました。

hostname -I | awk '{print $1}'

1
マニュアルページから:「[...]このオプションは、すべてのネットワークインターフェースで構成されたすべてのアドレスを列挙します。[...]出力の順序について何も仮定しないでください。」最後の文はprint $1、正しい結果が得られる場合と得られない場合があることを示しています。
0 0

7

環境が限られている場合は、次のコマンドを使用できます。

ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1

3
あるいは:ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1
ホセ・アルバン

はい、そうです。ただし、eth0に複数のIPアドレスがある場合は、すべてが表示されるので注意してください。
カグラ

bash-4.4#ip -4 addr show dev eth0 | grep inet | tr -s "" | カット-d "" -f3 | head -n 1 172.17.0.3/16 / 16はあまり良くない
AndyGee

ループにもう1つ追加しますip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1。v4およびv6の場合:ip addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
Sumari Murari

インターフェイス名が不明である(またはプラットフォーム間で異なる)が、プライベート IPアドレスを検索する場合は、代わりにip -4 addr show eth0 | grep inetは、次ようにする:ip -4 addr show | grep 192
cyberbird

6

Mac OS Xで IPアドレスのみを取得するには、次のコマンドを入力します。

ipconfig getifaddr en0

4

コマンドifconfigが破棄されているためip、Linuxではcommandを使用する必要があります。

またip a、スコープがIPと同じ行にあるため、使いやすくなります。

このコマンドは、グローバル(外部)IPを表示します。

ip a | grep "scope global" | grep -Po '(?<=inet )[\d.]+'

すべてのIPv4(また127.0.0.1):

ip a | grep "scope" | grep -Po '(?<=inet )[\d.]+'

すべてのIPv6(また:: 1):

ip a | grep "scope" | grep -Po '(?<=inet6 )[\da-z:]+'

4

2つのコマンド(ifconfig + awk)のみを使用して、必要なIP(v4)のみを取得できます。

Linuxでは、eth0インターフェイスからIPアドレスを取得すると想定して、次のコマンドを実行します。

/sbin/ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

OSXでは、en0インターフェースからIPアドレスを取得すると想定して、次のコマンドを実行します。

/sbin/ifconfig en0 | awk '/inet /{print $2}'

パブリック/外部IPを知るには、この関数を ~/.bashrc

whatismyip () {
    curl -s "http://api.duckduckgo.com/?q=ip&format=json" | jq '.Answer' | grep --color=auto -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
}

次に実行します whatismyip


4

eth0他のテキストなしで、のIPアドレスのみを印刷するには:

ifconfig eth0 | grep -Po '(?<=inet )[\d.]+'

(「eth0」ではない可能性があるため)プライマリインターフェイスを特定するには、次のコマンドを使用します。

route | grep ^default | sed "s/.* //"

上記の2行は、次のように1つのコマンドに結合できます。

ifconfig `route | grep ^default | sed "s/.* //"` \
  | grep -Po '(?<=inet )[\d.]+'

3

Bashエイリアスとして機能するシンプルなものが欲しかった。私はそれhostname -Iが自分に最も適していることを発見しました(ホスト名v3.15)。hostname -i何らかの理由でループバックIPを返しますが、hostname -Igrepまたはawkを介してパイプ出力を行わなくても、wlan0の正しいIP が返されます。欠点は、複数のIPがある場合、すべての IP hostname -Iが出力されることです。


2

それはMacでうまくいくでしょう:

ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')

それping 192.168.1.2は私のマシンで解決しました。

プロのヒント$(...)サブシェルの括弧内にあるものをすべて実行し、それを値として返します。


2

man hostname自動的にループバックIPを除くとスペースだけを示す、より簡単な方法があるホストのIPアドレスに割り当てられたすべてのリストを分離:

root@srv:~# hostname --all-ip-addresses
11.12.13.14 192.168.15.19 

root@srv:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
   inet6 ::1/128 scope host 
   valid_lft forever preferred_lft forever
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
  link/void 
  inet 11.12.13.14/32 scope global venet0:0
  inet 192.168.15.19/32 scope global venet0:1

2

次のコマンドを使用することもできます。

ip route | grep src

注:これは、インターネットに接続している場合にのみ機能します。


2

いくつかの答えが、新しい使用されるように見えるipコマンド(の代替ifconfig)ので、ここでは一つであるが、その用途ip addrgrepおよびawk単に関連付けられたIPv4アドレス印刷するwlan0インタフェースを:

ip addr show wlan0|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,"/"); print a[1]}'

最もコンパクトで豪華なソリューションではありませんが、(おそらく)理解しやすく(以下の説明を参照)、次のようなMACアドレスの最後の3オクテットを取得するなど、他の目的のために変更することができます。

ip addr show wlan0|grep link/ether|awk '{print $2}'|awk '{split($0,mac,":"); print mac[4] mac[5] mac[6]}'

説明: ip addr show wlan0という名前のネットワークインターフェイスに関連する情報を出力しますwlan0。これは次のようになります。

4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether dc:a6:32:04:06:ab brd ff:ff:ff:ff:ff:ff
    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::d340:5e4b:78e0:90f/64 scope link 
       valid_lft forever preferred_lft forever

次にgrep inet、「inet」を含まない行(IPv4およびIPv6構成)をgrep -v inet6フィルターで除外し、「inet6」を含む残りの行をフィルターで除外ます。これにより、次のような単一の行が生成されます。

    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0

最後に、1つ目awkは「172.18.18.1/24」フィールドを抽出し、2つ目はネットワークマスクの省略形を削除して、IPv4アドレスのみを残します。

また、スクリプトを作成している場合は、この情報を取得するための多くのより強力なツールや堅牢​​なツールが多くあり、代わりに使用することをお勧めします。たとえば、Node.jsを使用している場合はipaddr-linux、Rubyを使用している場合はlinux-ip-parser、などです。

/unix/119269/how-to-get-ip-address-using-shell-scriptも参照してください



1

これが私のバージョンで、インターフェースのリストを優先度順に並べることができます:

getIpFromInterface()
{
    interface=$1
    ifconfig ${interface}  > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print $2 }' | awk '{ print $1 }' | grep .
}

getCurrentIpAddress(){
    IFLIST=(${@:-${IFLIST[@]}})
    for currentInterface in ${IFLIST[@]}
    do
        IP=$(getIpFromInterface  $currentInterface)
        [[ -z "$IP" ]] && continue
    echo ${IP/*:}
    return
    done
}

IFLIST=(tap0 en1 en0)
getCurrentIpAddress $@

したがって、VPN、Wifi、イーサネットに接続している場合、VPNインターフェイス(tap0上の)が返されます。スクリプトはlinuxとosxの両方で動作し、IFLISTをオーバーライドする場合は引数を取ることができます

IPV6を使用する場合は、「inet」を「inet6」に置き換える必要があることに注意してください。


1

私はいつもこれを必要とする最も予期しない時間に巻き上げ、必ず、このようなスレッドをSOで検索することを巻き上げます。私はと呼ばれるnetstatコマンド経由でIPv4アドレスを取得するための簡単なスクリプトを書いたので、echoip- あなたはここでそれを見つけることができます。ネットワークアドレスのbashは次のようになります。また、ipecho.netからパブリックアドレスを取得します。

IPV4='\d+(\.\d+){3}'
INTERFACES=`netstat -i | grep -E "$IPV4" | cut -d ' ' -f 1`
INTERFACE_IPS=`netstat -i | grep -oE "$IPV4"`

for i in "${!INTERFACES[@]}"; do
  printf "%s:\t%s\n" "${INTERFACES[$i]}" "${INTERFACE_IPS[$i]}"
done

echoipスクリプトは、このような出力が得られます。

$ echoip
public: 26.106.59.169
en0:    10.1.10.2

1

次の1行のスクリプトを使用します ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}' 。macとlinux(ubuntuでテスト済み)はどちらも機能します。


両方で機能するのは素晴らしいことです。プラスあなたがそれを呼び出すことができますifconfig en0ifconfig eth1あなたが欲しいのインターフェイスを知っていれば:)など
jaygooby

1

awkスクリプトなどでは使用しない方がいいですip。JSONで出力するオプションがあります。

省略し$interfaceた場合、すべてのIPアドレスが取得されます。

ip -json addr show $interface | \
  jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'

ipコマンドのようなjson構造形式のコマンドの結果の方法が好きです。ここでは上記と同様のIPアドレスを取得する別の方法です bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [0]"
ジャック劉Shurui

0
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

すべてのIPを表示します


0

Redhat 64ビットでは、これで問題が解決しました。

ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'

またはthis:curl ifconfig.me
Statham '30

0
#!/bin/sh
# Tested on Ubuntu 18.04 and Alpine Linux 
# List IPS of following network interfaces:
# virtual host interfaces
# PCI interfaces
# USB interfaces
# ACPI interfaces
# ETH interfaces
for NETWORK_INTERFACE in $(ls /sys/class/net -al | grep -iE "(/eth[0-9]+$|vif|pci|acpi|usb)" | sed -E "s@.* ([^ ]*) ->.*@\1@"); do 
    IPV4_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet addr[: ]+|inet[: ]+)' | sed -E "s@\s*(inet addr[: ]+|inet[: ]+)([^ ]*) .*@\2@")
    IPV6_ADDRESSES=$(ifconfig $NETWORK_INTERFACE | grep -iE '(inet6 addr[: ]+|inet6[: ]+)' | sed -E "s@\s*(inet6 addr[: ]+|inet6[: ]+)([^ ]*) .*@\2@")
    if [ -n "$IPV4_ADDRESSES" ] || [ -n "$IPV6_ADDRESSES" ]; then
        echo "NETWORK INTERFACE=$NETWORK_INTERFACE"
        for IPV4_ADDRESS in $IPV4_ADDRESSES; do 
            echo "IPV4=$IPV4_ADDRESS"
        done
        for IPV6_ADDRESS in $IPV6_ADDRESSES; do 
            echo "IPV6=$IPV6_ADDRESS"
        done
    fi
done

0

NATされたホストで外部IPアドレスを検索するとき、かなりの数の回答が次のようなHTTPベースのメソッドの使用を提案していますifconfig.me

$ curl ifconfig.me/ip

長年にわたって、これらのサイトの多くが行き来するのを見てきましたが、このDNSベースの方法の方がより堅牢であると思います。

$ dig +short myip.opendns.com @resolver1.opendns.com

私には私の便利なエイリアスがあります~/.bashrc

alias wip='dig +short myip.opendns.com @resolver1.opendns.com'

0

これらの2つの方法は私のために働きました:

インターフェースeth0のIPアドレスを取得します。以下の例のeth0をインターフェース名に置き換えます。 ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "

ホスト名を使用する: これにより、inet、つまりethoのIPAddressが得られます。-Iを使用すると、この値が存在するすべてのインターフェースのinet値が提供されます。

hostname -i


-1
curl ifconfig.co 

これは、システムのIPアドレスのみを返します。


1
これにはインターネット接続が機能している必要があり、公開されているIPアドレスが返されます。
-jlh

-2

私が使用するHostname -Lスクリプト内の変数として使用するだけでIPを取得します。


たぶん、あなたは言うつもりでしたhostname -ihostname -I
-jlh

user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$ 1.資本Hが間違っている2.そうではない-L
サブリナ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.