Perintah terminal mana yang hanya mendapatkan alamat IP dan tidak ada yang lain?


118

Saya mencoba menggunakan hanya alamat IP (inet) sebagai parameter dalam skrip yang saya tulis.

Apakah ada cara mudah di terminal unix untuk mendapatkan alamat IP saja, daripada melihat-lihat ifconfig?


Ya, atau pengenal unik lainnya tentang mesin yang saya kira.
Mason

1
Anda mendapatkan opsi yang tidak valid pada nama host -i?
Ken

4
nama host tidak dapat diandalkan seperti ifconfig
joel

2
joel benar, khususnya Anda yang berbicara tentang MAC OS dan kemudian Ubuntu
zackaryka

2
Saat menelusuri jawaban di bawah ini, perlu diingat bahwa output dari ip -o addressjauh lebih mudah untuk dikerjakan daripada output ip address.
jlh

Jawaban:


177

Anda dapat menulis skrip yang hanya mengembalikan IP seperti:

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

Untuk Mac:

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

Atau untuk sistem linux

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

hostname -i # Debian

4
hostname -idi tambang itu mengembalikan:::1 127.0.1.1 192.168.1.100
Book Of Zeus

1
Di Debian saya hanya mendapat satu ip. Jadi menggunakan hostnametidak portabel.
Timofey Stolbov

1
Dikatakan bahwa -i dan -I keduanya adalah opsi ilegal
Mason

3
Singkatnya: metode pertama bergantung pada adaptor, yang tidak selalu sama. Yang kedua, bagi saya, menunjukkan dua alamat IP, dan dua yang terakhir tidak berfungsi di Mac.
Matt

4
ifconfig tidak digunakan lagi dan tidak dapat diandalkan di sini, misalnya grep gagal pada debian 9 (stretch) karena tidak lagi mengeluarkan "inet addr: 172.17.0.4", hanya menampilkan "inet 172.17.0.4". Gunakan "ip" sebagai gantinya seperti yang dijelaskan di stackoverflow.com/a/26694162/72717 .
jamshid

61

Ini akan memberi Anda semua antarmuka IPv4, termasuk loopback 127.0.0.1:

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

Ini hanya akan menampilkan eth0:

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

Dan dengan cara ini Anda bisa mendapatkan alamat IPv6:

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

Hanya eth0IPv6:

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

The grep -oPgagal pada busybox v1.24.1: opsi tidak valid - P
Pro Backup

1
grep tidak diinstal pada hampir semua docker conatiner untuk prod. Jadi, meskipun ini semua adalah perintah yang bagus, mereka tidak akan berguna pada container :-(
AndyGee

1
Jawaban terbaik untuk kasus khusus saya. Anda perlu -Pmengganti ekspresi reguler Perl atau jika tidak kita tidak dapat menggunakan (?<=inet\s)token lookbehind . Anda bisa mendapatkan hasil yang serupa dengan menjalankan grep -oe 'inet [0-9\.]\+'atau grep -oe 'inet6 [0-9a-f:]\+'tetapi dengan cara ini saya tidak bisa menghilangkan kata pertama. Dalam man greplaporan SuSE , -Pflag bersifat eksperimental.
Jorge Bellon

Ini jawaban terbaik. ifconfig sudah tidak digunakan lagi beberapa tahun sekarang di kebanyakan OS.
pozcircuitboy

2
Versi yang lebih pendek dari perintah kedua:ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
tukusejssirs

41

Secara umum, tidak pernah ada jaminan bahwa suatu sistem hanya akan memiliki satu alamat IP, misalnya, Anda dapat memiliki koneksi ethernet dan wlan, dan jika Anda memiliki koneksi VPN aktif maka Anda akan memiliki alamat IP lain.

Linux

Di Linux, hostname -Iakan mencantumkan alamat IP saat ini. Mengandalkan itu selalu mengembalikan hanya satu alamat IP kemungkinan besar tidak akan berfungsi seperti yang diharapkan dalam beberapa skenario (yaitu tautan VPN sudah aktif), jadi cara yang lebih andal adalah mengonversi hasilnya ke larik dan kemudian mengulang elemen:

ips=($(hostname -I))

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

OSX

Di OSX, jika Anda mengetahui antarmukanya , Anda dapat menggunakan:

~$ ipconfig getifaddr en0
192.168.1.123

yang hanya akan mengembalikan alamat IP.

Atau Anda bisa mengulang nama antarmuka yang mungkin, dimulai dengan sufiks, yaitu en:

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

echo $myip

Selain itu, mendapatkan alamat IP menjadi non-deterministik jika kabel dan koneksi wifi dibuat, ketika mesin memiliki lebih dari satu antarmuka ethernet, atau ketika ada terowongan VPN.

Mendapatkan IP eksternal

Jika Anda memerlukan IP eksternal, Anda dapat meminta layanan mode teks, misalnya curl https://ipecho.net/plainakan mengembalikan IP eksternal teks biasa .

Dan cara yang lebih cepat untuk mendapatkan IP eksternal adalah dengan menanyakan server DNS yang dikenal:

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

bagaimana cara mendapatkan alamat ip LAN?
diEcho

17
hostname -I  

Perintah ini akan memberi Anda alamat ip persis seperti yang Anda inginkan di Ubuntu.


dibandingkan dengan jumlah jawaban yang sudah ada (dan suara terbanyak), saya rasa jawaban ini tidak akan menambah nilai ...
Mischa

4
juga pada nama host Centos -I (huruf besar i)
zzapper

1
ini benar-benar membantu saya - huruf besar 'i' adalah kuncinya
ChronoFish

2
Sama, ini melakukan pekerjaan dengan sempurna tanpa alat tambahan dan tidak perlu memanggil lima belas biner berturut-turut untuk membersihkan keluaran. Terima kasih!
Ulrar

11

Pada versi Ubuntu terbaru ( 14.04 - 16.04 ), perintah ini berhasil bagi saya.

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

1
Dari halaman manual: "[...] Opsi ini menghitung semua alamat yang dikonfigurasi pada semua antarmuka jaringan. [...] Jangan membuat asumsi apa pun tentang urutan keluaran". Kalimat terakhir memberi tahu Anda bahwa print $1mungkin atau mungkin tidak memberi Anda hasil yang benar.
0 0

7

Jika Anda memiliki lingkungan terbatas, Anda dapat menggunakan perintah ini:

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

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

Ya kamu benar. Tapi hati-hati, jika eth0 memiliki lebih dari satu alamat IP, ini menunjukkan semuanya.
caglar

bash-4.4 # ip -4 addr show dev eth0 | grep inet | tr -s "" | cut -d "" -f3 | head -n 1 172.17.0.3/16 Jadi tidak baik dengan / 16
AndyGee

Menambahkan satu lagi ke loop: ip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1. Untuk v4 dan v6:ip addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
Sumit Murari

Jika nama antarmuka tidak dikenal (atau berbeda antar platform) tetapi Anda mencari alamat ip pribadi, alih-alih ip -4 addr show eth0 | grep inetlakukan:ip -4 addr show | grep 192
cyberbird

6

Untuk hanya mendapatkan alamat IP di Mac OS X Anda dapat mengetik perintah berikut:

ipconfig getifaddr en0

4

Perintah ifconfigini deprected dan Anda harus menggunakan ipperintah pada Linux.

Juga ip aakan memberi Anda ruang lingkup pada baris yang sama dengan IP sehingga lebih mudah digunakan.

Perintah ini akan menunjukkan IP global (eksternal) Anda:

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

Semua IPv4 (juga 127.0.0.1):

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

Semua IPv6 (juga :: 1):

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

4

Kita cukup menggunakan hanya 2 perintah (ifconfig + awk) untuk mendapatkan IP (v4) yang kita inginkan seperti:

Di Linux, dengan asumsi untuk mendapatkan alamat IP dari eth0antarmuka, jalankan perintah berikut:

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

Di OSX, mengasumsikan untuk mendapatkan alamat IP dari en0antarmuka, jalankan perintah berikut:

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

Untuk mengetahui IP publik / eksternal kami, tambahkan fungsi ini di ~/.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"
}

Lalu lari, whatismyip


4

Untuk mencetak hanya alamat IP eth0, tanpa teks lain:

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

Untuk menentukan antarmuka utama Anda (karena mungkin bukan "eth0"), gunakan:

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

Dua baris di atas dapat digabungkan menjadi satu perintah seperti ini:

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

3

Saya menginginkan sesuatu yang sederhana yang berfungsi sebagai alias Bash. Saya menemukan yang hostname -Iterbaik untuk saya (nama host v3.15). hostname -imengembalikan IP loopback, untuk beberapa alasan, tetapi hostname -Imemberi saya IP yang benar untuk wlan0, dan tanpa harus menyalurkan output melalui grep atau awk. Kekurangannya adalah hostname -Iakan menampilkan semua IP, jika Anda memiliki lebih dari satu.


2

Itu akan melakukan trik di Mac:

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

Itu diputuskan ke ping 192.168.1.2dalam mesin saya.

Tip pro : $(...)berarti menjalankan apa pun yang ada di dalam tanda kurung di subkulit dan mengembalikannya sebagai nilainya.


2

Di man hostnamesana bahkan lebih mudah cara yang secara otomatis tidak termasuk loopback IP dan hanya menampilkan daftar terpisah ruang semua ditugaskan untuk alamat host 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

Anda juga dapat menggunakan perintah berikut:

ip route | grep src

CATATAN: Ini hanya akan berfungsi jika Anda memiliki konektivitas ke internet.


2

Beberapa jawaban tampaknya menggunakan lebih baru ipperintah (pengganti ifconfig) jadi di sini adalah salah satu yang menggunakan ip addr, grepdan awkuntuk hanya mencetak alamat IPv4 yang terkait dengan wlan0antarmuka:

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

Meskipun bukan solusi yang paling ringkas atau mewah, ini (bisa dibilang) mudah dipahami (lihat penjelasan di bawah) dan dimodifikasi untuk tujuan lain, seperti mendapatkan 3 oktet terakhir dari alamat MAC seperti ini:

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

Penjelasan: ip addr show wlan0 mengeluarkan informasi yang terkait dengan antarmuka jaringan bernama wlan0, yang seharusnya serupa dengan ini:

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

Berikutnya grep inetfilter keluar garis yang tidak mengandung "inet" (IPv4 dan IPv6 konfigurasi) dan grep -v inet6filter keluar garis tersisa yang melakukan mengandung "inet6", yang harus menghasilkan satu baris seperti ini:

    inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0

Terakhir, awkekstrak pertama bidang "172.18.18.1/24" dan yang kedua menghapus singkatan network mask, yang hanya menyisakan alamat IPv4.

Juga, saya pikir perlu disebutkan bahwa jika Anda membuat skrip maka seringkali ada banyak alat yang lebih kaya dan / atau lebih kuat untuk mendapatkan informasi ini, yang mungkin ingin Anda gunakan sebagai gantinya. Misal kalo pake Node.js ada ipaddr-linux, kalo pake Ruby ada linux-ip-parser, dll.

Lihat juga /unix/119269/how-to-get-ip-address-using-shell-script


1

Gunakan perintah berikut:

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

1

Ini adalah versi saya, di mana Anda dapat memberikan daftar antarmuka, diurutkan berdasarkan prioritas:

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

Jadi jika saya terhubung dengan VPN, Wifi dan ethernet, alamat VPN saya (pada antarmuka tap0) akan dikembalikan. Skrip berfungsi di linux dan osx, dan dapat menggunakan argumen jika Anda ingin mengganti IFLIST

Perhatikan bahwa jika Anda ingin menggunakan IPV6, Anda harus mengganti 'inet' dengan 'inet6'.


1

Saya selalu membutuhkan ini pada waktu yang paling tidak terduga dan, tanpa gagal, akhirnya mencari utas seperti ini di SO. Jadi saya menulis skrip sederhana untuk mendapatkan alamat IPv4 melalui netstat, disebut echoip- Anda dapat menemukannya di sini . Bash untuk alamat jaringan terlihat seperti ini, ia juga mendapatkan alamat publik Anda dari 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

The echoipScript menghasilkan output seperti ini:

$ echoip
public: 26.106.59.169
en0:    10.1.10.2

1

gunakan skrip satu baris ini: 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 (diuji di ubuntu) keduanya berfungsi.


Bagus karena itu berfungsi pada keduanya. Plus Anda dapat menyebutnya dengan ifconfig en0atau ifconfig eth1dll jika Anda tahu antarmuka yang Anda inginkan :)
jaygooby

1

Saya lebih suka tidak menggunakan awkdan semacamnya dalam skrip .. ipmemiliki opsi untuk keluaran dalam JSON.

Jika Anda keluar $interfacemaka Anda mendapatkan semua alamat ip:

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

Saya suka cara hasil perintah dalam format struktural json seperti perintah ip. berikut adalah cara lain untuk mendapatkan alamat IP yang serupa seperti di atas 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}'

menunjukkan semua ip Anda


0

Di Redhat 64bit, ini memecahkan masalah bagi saya.

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

atau ini: 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

Saat mencari alamat IP eksternal Anda pada host NATed, beberapa jawaban menyarankan menggunakan metode berbasis HTTP seperti ifconfig.memisalnya:

$ curl ifconfig.me/ip

Selama bertahun-tahun saya telah melihat banyak dari situs ini datang dan pergi, saya menemukan metode berbasis DNS ini lebih kuat:

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

Saya memiliki alias praktis ini di ~/.bashrc:

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

0

Kedua cara ini berhasil untuk saya:

Untuk mendapatkan alamat IP dari antarmuka Anda eth0. Ganti eth0 pada contoh di bawah ini dengan nama antarmuka Anda. ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "

Menggunakan nama host: Ini akan memberi Anda inet yaitu IPAddress dari etho Anda. menggunakan -Aku akan memberi Anda nilai inet dari semua antarmuka di mana pun nilai ini ada.

hostname -i


-1
curl ifconfig.co 

Ini hanya mengembalikan alamat ip sistem Anda.


1
Ini membutuhkan koneksi internet yang berfungsi dan akan mengembalikan alamat IP Anda yang terlihat secara publik, yang mungkin atau mungkin bukan yang Anda inginkan.
jlh

-2

Saya akan Gunakan Hostname -Luntuk mendapatkan hanya IP untuk digunakan sebagai variabel dalam skrip.


Mungkin Anda mencoba mengatakan hostname -iatau hostname -I?
jlh

user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$ 1. Kapital Hsalah 2. Tidak seperti itu-L
Sabrina
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.