Yalnızca IP adresini almak için hangi terminal komutu başka hiçbir şey alamaz?


118

Yazdığım bir betikte parametre olarak sadece IP adresini (inet) kullanmaya çalışıyorum.

Bir unix terminalinde, bakmak yerine sadece IP adresini almanın kolay bir yolu var mı ifconfig?


Evet, ya da sanırım makine hakkında herhangi bir benzersiz tanımlayıcı.
Mason

1
hostname -i üzerinde geçersiz bir seçenek mi alıyorsunuz?
Ken

4
ana bilgisayar adı ifconfig kadar güvenilir değil
joel

2
joel haklı, özellikle de MAC OS ve ardından Ubuntu hakkında konuştuğunuz yerde
zackaryka

2
Aşağıdaki cevaplara göz atarken, ile çalışmanın çıktısının çıktısından ip -o addressçok daha kolay olduğunu unutmayın ip address.
jlh

Yanıtlar:


177

Yalnızca IP'yi döndüren bir komut dosyası yazabilirsiniz, örneğin:

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

Mac için:

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

Veya linux sistemi için

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

hostname -i # Debian

4
hostname -ibenimkinde şöyle döner:::1 127.0.1.1 192.168.1.100
Book Of Zeus

1
Debian'da sadece bir ip aldım. Yani kullanmak hostnametaşınabilir değildir.
Timofey Stolbov

1
-İ ve -I'nin her ikisi de yasa dışı seçenekler olduğunu söylüyor
Mason

3
Özetle: ilk yöntem, her zaman aynı olmayan adaptöre bağlıdır. İkincisi, benim için iki IP adresi gösteriyor ve son ikisi Mac'te çalışmıyor.
Matt

4
ifconfig burada kullanımdan kaldırılmış ve güvenilmezdir, örneğin, grep debian 9'da (uzatma) başarısız olur çünkü artık "inet adres: 172.17.0.4" çıktısını vermez, sadece "inet 172.17.0.4" çıktı verir. Bunun yerine stackoverflow.com/a/26694162/72717'de açıklandığı gibi "ip" kullanın .
jamshid

61

Bu size 127.0.0.1 geri döngü dahil olmak üzere tüm IPv4 arayüzlerini verecektir:

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

Bu yalnızca şunu gösterecektir eth0:

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

Ve bu şekilde IPv6 adreslerini alabilirsiniz:

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

Yalnızca eth0IPv6:

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

grep -oPBusybox v1.24.1 başarısız: geçersiz seçenek - P
Pro Yedekleme

1
grep, üretim için hemen hemen her liman düzenleyicisine kurulmaz. Dolayısıyla, bunların hepsi iyi komutlar olsa da kapsayıcılarda kullanışlı olmayacaklar :-(
AndyGee

1
Benim özel durumum için en iyi cevap. -PPerl düzenli ifadeleri için geçiş yapmanız gerekir, aksi takdirde arkaya bakma (?<=inet\s)belirtecini kullanamayız . Koşarak da benzer bir sonuç elde edebilirsiniz grep -oe 'inet [0-9\.]\+'veya grep -oe 'inet6 [0-9a-f:]\+'bu şekilde ilk kelimeden kurtulamıyorum. SuSE man grep, -Pbayrağın deneysel olduğunu rapor ediyor .
Jorge Bellon

Bu en iyi cevap. ifconfig, pek çok OS'de birkaç yıldır kullanımdan kaldırılmıştır.
pozcircuitboy

2
İkinci komutun daha kısa bir versiyonu:ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
tukusejssirs

41

Genel olarak, bir sistemin yalnızca bir IP adresine sahip olacağı asla garanti edilmez; örneğin, hem ethernet hem de wlan bağlantılarınız olabilir ve aktif bir VPN bağlantınız varsa, o zaman başka bir IP adresiniz olur.

Linux

Linux'ta, hostname -Imevcut IP adreslerini listeleyecektir. Her zaman yalnızca bir IP adresini döndürmeye güvenmek, büyük olasılıkla bazı senaryolarda beklendiği gibi çalışmayacaktır (yani bir VPN bağlantısı çalışmaktadır), bu nedenle sonucu bir diziye dönüştürmek ve ardından öğeler üzerinde döngü oluşturmak daha güvenilir bir yöntem olacaktır:

ips=($(hostname -I))

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

OSX

OSX'te arayüzü biliyorsanız , şunları kullanabilirsiniz:

~$ ipconfig getifaddr en0
192.168.1.123

sadece IP adresini döndürecektir .

Veya bir sonek ile başlayarak olası arabirim adları üzerinde döngü yapabilirsiniz, yani en:

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

echo $myip

Ayrıca, hem kablo hem de wifi bağlantılarının kurulması, bir makinenin birden fazla ethernet arayüzüne sahip olması veya VPN tünellerinin mevcut olması durumunda IP adresinin alınması belirsiz hale gelir.

Harici IP'yi alma

Harici IP'ye ihtiyacınız varsa, metin modu hizmetini sorgulayabilirsiniz, örneğin curl https://ipecho.net/plaindüz metin harici bir IP döndürür .

Harici IP'yi almanın daha da hızlı bir yolu, bilinen bir DNS sunucusunu sorgulamaktır:

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

LAN ip adresi nasıl alınır?
diEcho

17
hostname -I  

Bu komut size Ubuntu'da istediğiniz gibi tam ip adresini verecektir.


Zaten mevcut (ve yüksek olarak) verilen cevapların sayısı ile karşılaştırıldığında, ben düşünüyorum don değil bu cevabı ... herhangi bir değer katacak
Mischa

4
ayrıca Centos ana bilgisayar
adında

1
bu aslında bana yardımcı oldu - belirtilen büyük harf 'i' anahtardı
ChronoFish

2
Aynı şekilde, bu, işi mükemmel bir şekilde yapar ve çıktıyı temizlemek için fazladan araç olmadan ve arka arkaya on beş ikili dosyayı çağırmaya gerek yoktur. Teşekkürler !
Ulrar

11

En son Ubuntu sürümlerinde ( 14.04 - 16.04 ), bu komut benim için hile yaptı.

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

1
Kılavuz sayfasından: "[...] Bu seçenek, tüm ağ arayüzlerindeki tüm yapılandırılmış adresleri numaralandırır. [...] Çıkışın sırası hakkında herhangi bir varsayımda bulunmayın". Son cümle, size print $1doğru sonucu verebileceğini veya vermeyeceğini söyler .
0 0

7

Sınırlı bir ortamınız varsa, bu komutu kullanabilirsiniz:

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

3
Veya hatta:ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1
Jose Alban

Evet haklısın. Ancak dikkatli olun, eğer eth0 birden fazla IP adresine sahipse, bu hepsini gösterir.
caglar

bash-4.4 # ip -4 adres göster dev eth0 | grep inet | tr -s "" | kes -d "" -f3 | head -n 1 172.17.0.3/16 / 16 ile pek iyi değil
AndyGee

Döngü daha birini ekleme: ip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1. Hem v4 hem de v6 için:ip addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
Sumit Murari

Arayüz adı bilinmiyorsa (veya platformlar arasında farklılık gösteriyorsa) ancak özel ip adresini ip -4 addr show eth0 | grep inetip -4 addr show | grep 192
arıyorsanız

6

Mac OS X'te yalnızca IP adresini almak için aşağıdaki komutu yazabilirsiniz:

ipconfig getifaddr en0

4

Komut ifconfigkullanımdan kaldırıldı ve ipLinux'ta komut kullanmalısınız .

Ayrıca ip asize IP ile aynı satırda kapsam sağlar, böylece kullanımı daha kolaydır.

Bu komut size global (harici) IP'nizi gösterecektir:

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

Tüm IPv4 (ayrıca 127.0.0.1):

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

Tüm IPv6 (ayrıca :: 1):

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

4

İstediğimiz IP'yi (v4) elde etmek için sadece 2 komut (ifconfig + awk) kullanabiliriz:

Linux'ta, eth0arabirimden IP adresi alacağınızı varsayarak aşağıdaki komutu çalıştırın:

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

OSX'te, en0arabirimden IP adresinin alındığını varsayarak , aşağıdaki komutu çalıştırın:

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

Genel / harici IP'mizi bilmek için, bu işlevi şuraya ekleyin: ~/.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"
}

O zaman koş, whatismyip


4

eth0Başka metin olmadan yalnızca IP adresini yazdırmak için :

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

Birincil arayüzünüzü belirlemek için (çünkü "eth0" olmayabilir), şunu kullanın:

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

Yukarıdaki iki satır şu şekilde tek bir komutta birleştirilebilir:

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

3

Bash takma adı olarak çalışan basit bir şey istedim. Benim hostname -Iiçin en iyi sonucu buldum (hostname v3.15). hostname -iherhangi bir nedenle geri döngü IP'sini döndürür, ancak hostname -Ibana wlan0 için doğru IP'yi verir ve çıkışı grep veya awk aracılığıyla yönlendirmek zorunda kalmadan. Bir dezavantaj, birden fazla IP'ye sahipseniz tüm IP'leri hostname -Içıkaracak olmasıdır .


2

Bu bir Mac'te işe yarar:

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

Bu ping 192.168.1.2benim makinemde çözüldü .

Uzman ipucu : $(...)bir alt kabukta parantez içinde ne varsa çalıştır ve bunu değer olarak döndürmek anlamına gelir.


2

In man hostnameotomatik sadece uzay konak ip adresleri atanan tüm ayrılmış listesi IP geri döngü hariç ve gösteren daha kolay bir yolu vardır:

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

Ayrıca aşağıdaki komutu da kullanabilirsiniz:

ip route | grep src

NOT: Bu yalnızca internet bağlantınız varsa çalışır.


2

Birkaç cevaplar yeni kullanarak görünür ipkomutu (için yedek ifconfig) işte biri olduğunu kullanımları ip addr, grepve awkbasitçe ilişkili IPv4 adresini yazdırmak için wlan0bir arayüz:

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

En kompakt veya süslü çözüm olmasa da, anlaşılması (aşağıdaki açıklamaya bakın) ve aşağıdaki gibi MAC adresinin son 3 sekizlisini elde etmek gibi başka amaçlar için değiştirilmesi (muhtemelen) kolaydır:

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

Açıklama: ip addr show wlan0 Aşağıdaki gibi wlan0olması gereken, adlandırılmış ağ arayüzüyle ilişkili bilgileri verir:

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

Sonraki grep inetiçermeyen hatları üzerinden filtreleri "inet" (IPv4 ve IPv6 konfigürasyonu) ve grep -v inet6geri kalan hatları üzerinden filtre yapmak bu gibi tek bir hat ile sonuçlanmalıdır "inet6" içeren,:

    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0

Son olarak, ilki awk"172.18.18.1/24" alanını çıkarır ve ikincisi ağ maskesi kısaltmasını kaldırır ve geriye yalnızca IPv4 adresini bırakır.

Ayrıca, komut dosyası yazıyorsanız, bu bilgiyi elde etmek için çoğu zaman daha zengin ve / veya daha sağlam araçların bulunduğunu ve bunun yerine kullanmak isteyebileceğinizden bahsetmeye değer olduğunu düşünüyorum. Örneğin, Node.js ipaddr-linuxkullanıyorsanız, Ruby kullanıyorsanız linux-ip-parser, vb. Vardır .

Ayrıca bkz. Https://unix.stackexchange.com/questions/119269/how-to-get-ip-address-using-shell-script


1

Aşağıdaki komutu kullanın:

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

1

İşte önceliğe göre sıralı bir arayüz listesi geçirebileceğiniz sürümüm:

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

Yani VPN, Wifi ve ethernet ile bağlıysam, VPN adresim (tap0 arayüzünde) iade edilecektir. Komut dosyası hem linux hem de osx üzerinde çalışır ve IFLIST'ı geçersiz kılmak istiyorsanız argümanlar alabilir.

IPV6 kullanmak istiyorsanız, 'inet'i' inet6 'ile değiştirmeniz gerekeceğini unutmayın.


1

Her zaman buna en beklenmedik zamanlarda ihtiyaç duyuyorum ve hiç şüphesiz SO'da bunun gibi konuları aramaya başladım. Bu yüzden netstat aracılığıyla IPv4 adreslerini almak için basit bir komut dosyası yazdım echoip- burada bulabilirsiniz . Ağ adresleri için bash şuna benzer, ayrıca genel adresinizi ipecho.net'ten alır:

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

echoipKomut dosyası gibi bir çıktı verir:

$ echoip
public: 26.106.59.169
en0:    10.1.10.2

1

bu tek satırlık komut dosyasını kullanın: 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'da test edilmiştir) her ikisi de çalışır.


Her ikisinde de işe yaraması güzel. Artı ile diyebilirsin ifconfig en0ya ifconfig eth1sen :) istediğiniz arabirimi biliyorsanız vb
jaygooby

1

Ben awkkomut dosyalarında falan kullanmamayı tercih ediyorum .. ipJSON'da çıktı alma seçeneği var.

Dışarıda bırakırsanız, $interfacetüm ip adreslerini alırsınız:

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

Ip komutu gibi json yapısal formatta komutun sonucunu seviyorum. IP adresini yukarıdakine benzer bir şekilde almanın başka bir yolu bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [0]"
Jack Liu Shurui

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

tüm ips'lerinizi gösterir


0

Redhat 64bit'te bu benim için sorunu çözdü.

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

veya bu: curl ifconfig.me
Statham

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'lı bir ana bilgisayarda harici IP adresinizi ararken pek çok yanıt, ifconfig.meörneğin:

$ curl ifconfig.me/ip

Yıllar geçtikçe bu sitelerin çoğunun gelip gittiğini gördüm, bu DNS tabanlı yöntemi daha sağlam buluyorum:

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

Şu kullanışlı takma adım var ~/.bashrc:

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

0

Bu iki yol benim için çalıştı:

Eth0 arayüzünüzün IP adresini almak için. Aşağıdaki örnekte eth0'ı arayüz adınızla değiştirin. ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "

Ana bilgisayar adını kullanma: Bu size inet'i yani etho'nuzun IPAdresini verecektir. -I kullanarak, bu değerin mevcut olduğu tüm arayüzlerin inet değerini vereceğim.

hostname -i


-1
curl ifconfig.co 

Bu, yalnızca sisteminizin ip adresini döndürür.


1
Bu, çalışan bir internet bağlantısı gerektirir ve herkesin görebileceği IP adresinizi geri getirecektir; bu, istediğiniz gibi olabilir veya olmayabilir.
jlh

-2

Ben kullanın ediyorum Hostname -Lbir komut bir değişken olarak kullanımına sadece IP almak için.


Belki söylemek istedikleri hostname -iya hostname -I?
jlh

user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$ 1. Sermaye Hyanlış 2. Öyle değil-L
Sabrina
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.