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
?
ip -o address
çok daha kolay olduğunu unutmayın ip address
.
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
?
ip -o address
çok daha kolay olduğunu unutmayın ip address
.
Yanıtlar:
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
hostname -i
benimkinde şöyle döner:::1 127.0.1.1 192.168.1.100
hostname
taşınabilir değildir.
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 eth0
IPv6:
ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'
grep -oP
Busybox v1.24.1 başarısız: geçersiz seçenek - P
-P
Perl 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
, -P
bayrağın deneysel olduğunu rapor ediyor .
ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
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'ta, hostname -I
mevcut 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'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'ye ihtiyacınız varsa, metin modu hizmetini sorgulayabilirsiniz, örneğin curl https://ipecho.net/plain
dü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
hostname -I
Bu komut size Ubuntu'da istediğiniz gibi tam ip adresini verecektir.
En son Ubuntu sürümlerinde ( 14.04 - 16.04 ), bu komut benim için hile yaptı.
hostname -I | awk '{print $1}'
print $1
doğru sonucu verebileceğini veya vermeyeceğini söyler .
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
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
. Hem v4 hem de v6 için: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
Komut ifconfig
kullanımdan kaldırıldı ve ip
Linux'ta komut kullanmalısınız .
Ayrıca ip a
size 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:]+'
İstediğimiz IP'yi (v4) elde etmek için sadece 2 komut (ifconfig + awk) kullanabiliriz:
Linux'ta, eth0
arabirimden 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, en0
arabirimden 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
eth0
Baş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.]+'
Bash takma adı olarak çalışan basit bir şey istedim. Benim hostname -I
için en iyi sonucu buldum (hostname v3.15). hostname -i
herhangi bir nedenle geri döngü IP'sini döndürür, ancak hostname -I
bana 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 .
Bu bir Mac'te işe yarar:
ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')
Bu ping 192.168.1.2
benim 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.
In man hostname
otomatik 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
Ayrıca aşağıdaki komutu da kullanabilirsiniz:
ip route | grep src
NOT: Bu yalnızca internet bağlantınız varsa çalışır.
Birkaç cevaplar yeni kullanarak görünür ip
komutu (için yedek ifconfig
) işte biri olduğunu kullanımları ip addr
, grep
ve awk
basitçe ilişkili IPv4 adresini yazdırmak için wlan0
bir 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 wlan0
olması 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 inet
içermeyen hatları üzerinden filtreleri "inet" (IPv4 ve IPv6 konfigürasyonu) ve grep -v inet6
geri 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-linux
kullanı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
Aşağıdaki komutu kullanın:
/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
İş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.
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
echoip
Komut dosyası gibi bir çıktı verir:
$ echoip
public: 26.106.59.169
en0: 10.1.10.2
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.
ifconfig en0
ya ifconfig eth1
sen :) istediğiniz arabirimi biliyorsanız vb
Ben awk
komut dosyalarında falan kullanmamayı tercih ediyorum .. ip
JSON'da çıktı alma seçeneği var.
Dışarıda bırakırsanız, $interface
tüm ip adreslerini alırsınız:
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]"
#!/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'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'
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
curl ifconfig.co
Bu, yalnızca sisteminizin ip adresini döndürür.