web-dev-qa-db-ja.com

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

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

UNIX端末でifconfigを調べるのではなく、IPアドレスだけを取得する簡単な方法はありますか?

91
Mason

次のような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
141
Book Of Zeus

これにより、ループバック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:]+'

eth0 IPv6のみ:

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

一般に、システムが1つのIPアドレスのみを持つことは保証されません。たとえば、イーサネット接続と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

just 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

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

外部IPを取得する

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

32
ccpizza
hostname -I  

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

9
Vignajeth

最新のbuntバージョン(14.04-16.04)で、このコマンドは私のためにトリックをしました。

hostname -I | awk '{print $1}'
8
Da CodeKid

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

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

コマンドifconfigは非推奨です。Linuxではipコマンドを使用する必要があります。

また、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
Nux

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
zdk

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

ipconfig getifaddr en0
4
Tukan3

Bashエイリアスとして機能するシンプルなものが欲しかった。 hostname -Iが私に最適であることがわかりました(ホスト名v3.15)。 hostname -iはなんらかの理由でループバックIPを返しますが、hostname -Iはwlan0の正しいIPを提供し、grepまたはawkを介して出力をパイプする必要はありません。欠点は、hostname -Iall IPを出力することです(複数ある場合)。

3
Andy Forceno

次のコマンドも使用できます。

ip route | grep src

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

2
Search Info

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
user10101010

それはMacでトリックをします:

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

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

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

2
Abdellah Alaoui

ここに私のバージョンがあります。優先度順に並べられたインターフェースのリストを渡すことができます:

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
MatthieuP

次のコマンドを使用します。

/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '

次の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でテスト済み)は両方とも動作します。

1
Huan

私は常に、これが最も予期しないときに必要になり、間違いなく、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
stites
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

すべてのIPを表示します

0
MaXiM
#!/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
user11621528

NATされたホストで外部IPアドレスを検索する場合、ifconfig.meなどのHTTPベースのメソッドを使用することをお勧めします。たとえば:

$ 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
htaccess

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

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

他のテキストなしで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.]+'
0
personal_cloud