回答:
次のような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
hostname -i
私の場合は次のように返されます:::1 127.0.1.1 192.168.1.100
hostname
は移植可能ではありません。
これにより、ループバック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:]+'
grep -oP
busybox v1.24.1での失敗:無効なオプション-P
-P
Perl正規表現のスイッチが必要(?<=inet\s)
です。そうしないと、後読みトークンを使用できません。あなたは実行することにより、同様の結果を得ることができるgrep -oe 'inet [0-9\.]\+'
かgrep -oe 'inet6 [0-9a-f:]\+'
が、この方法は、私が最初の単語を取り除くことはできません。SuSE man grep
では、-P
フラグは実験的であると報告しています。
ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
一般に、システムにIPアドレスが1つしかないことが保証されることはありません。たとえば、イーサネット接続とwlan接続の両方が可能であり、アクティブなVPN接続がある場合は、さらに別のIPアドレスが割り当てられます。
Linuxでは、hostname -I
現在のIPアドレスがリストされます。常に1つのIPアドレスのみを返すことに依存すると、一部のシナリオ(つまり、VPNリンクがアップしている)では期待どおりに機能しない可能性が高いため、より信頼性の高い方法は、結果を配列に変換し、要素をループします。
ips=($(hostname -I))
for ip in "${ips[@]}"
do
echo $ip
done
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が必要な場合は、テキストモードサービスをクエリできます。たとえばcurl https://ipecho.net/plain
、プレーンテキストの外部 IPを返します。
また、外部IPを取得するさらに高速な方法は、既知のDNSサーバーにクエリを実行することです。
dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
最新のUbuntuバージョン(14.04-16.04)では、このコマンドでうまくいきました。
hostname -I | awk '{print $1}'
print $1
、正しい結果が得られる場合と得られない場合があることを示しています。
環境が限られている場合は、次のコマンドを使用できます。
ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1
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
ip -4 addr show eth0 | grep inet
は、次ようにする:ip -4 addr show | grep 192
コマンド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:]+'
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
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.]+'
Bashエイリアスとして機能するシンプルなものが欲しかった。私はそれhostname -I
が自分に最も適していることを発見しました(ホスト名v3.15)。hostname -i
何らかの理由でループバックIPを返しますが、hostname -I
grepまたはawkを介してパイプ出力を行わなくても、wlan0の正しいIP が返されます。欠点は、複数のIPがある場合、すべての IP hostname -I
が出力されることです。
で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
いくつかの答えが、新しい使用されるように見えるip
コマンド(の代替ifconfig
)ので、ここでは一つであるが、その用途ip addr
、grep
および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も参照してください
次のコマンドを使用します。
/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
これが私のバージョンで、インターフェースのリストを優先度順に並べることができます:
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」に置き換える必要があることに注意してください。
私はいつもこれを必要とする最も予期しない時間に巻き上げ、必ず、このようなスレッドを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
awk
スクリプトなどでは使用しない方がいいですip
。JSONで出力するオプションがあります。
省略し$interface
た場合、すべてのIPアドレスが取得されます。
ip -json addr show $interface | \
jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'
bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [0]"
Redhat 64ビットでは、これで問題が解決しました。
ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'
#!/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
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'