Yanıtlar:
bunu bir dosyaya kaydedin ve sonra çalıştırın bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
IP adresini gösteren sadece sayı almak için daha doğru olmak:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
Güncelleme : Bu sizin için işe yaramazsa, diğer cevabı deneyin.
grep "inet"
Başka bir seçenek sağlama uğruna ip addr
, IP adresini almak için komutu bu şekilde kullanabilirsiniz:
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
ip addr show eth0
hakkında bilgi gösterir eth0
grep "inet\b"
sadece IPv4 adresi olan satırı gösterir (IPv6 adresini istiyorsanız, değiştirin "inet6\b"
)awk '{print $2}'
ipadresi / maskeye sahip ikinci alana basar, örneğin 172.20.20.15/25
cut -d/ -f1
sadece IP adres kısmını alır.Bir komut dosyasında:
#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
Alındığı /programming//a/14910952/1695680
hostname -i
Ancak bu yerel bir ip adresi (127.0.0.1) verebilir, bu nedenle kullanmanız ve filtrelemeniz gerekebilir:
hostname -I
Ana bilgisayar adının man sayfalarından:
-i, --ip-address
Ana bilgisayar adının ağ adreslerini görüntüleyin. Bunun yalnızca ana bilgisayar adı çözülebiliyorsa işe yaradığını unutmayın. Bu seçeneği kullanmaktan kaçının; bunun yerine hostname --all-ip-address kullanın.
-I, --all-ip-addresses
Ana bilgisayarın tüm ağ adreslerini görüntüleyin. Bu seçenek, tüm ağ arayüzlerinde yapılandırılmış tüm adresleri numaralandırır. Geridöngü arabirimi ve IPv6 yerel bağlantı adresleri atlandı. -İ seçeneğinin aksine, bu seçenek ad çözümlemesine bağlı değildir. Çıktının sırası hakkında herhangi bir varsayımda bulunmayın.
ip addr show label 'enp*'
daha iyi, ama can sıkıcı ayrıştırma gibi bir şeydir ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
ne kadar güzel teneke işleri ...
@ markus-lindberg 'nin yanıtı benim favorim. -o -4
İp'in bayraklarına eklerseniz , çok daha kolay çözümlenebilir (ve tutarlı) çıktılar elde edersiniz:
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
açılımı --oneline
durumların tam olarak bu tür yardım amaçlı olan,. -4
Diğer tüm yanıtları ima budur IPv4 adrese sınırı eklenir.
ip
Bayrakları seviyorum . cut
Gelişmiş awk
sihirbazlık kullanmak yerine :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
Öğrendikten sonra "keşfetti" yolunu seçtim awk
ve boru hatlarımdaki komut sayısını en aza indirmeyi seviyorum. Her durumda güzel öneri.
İşte bazı oneliners .....
awk
ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'
Yukarıdaki awk komutundaki split işlevi, ayırıcıyı temel alarak ikinci sütunu böler :
ve bölünmüş değeri ilişkisel bir dizide saklar a
. Böylece a[2]
ikinci bölümün değerini tutar.
sed
ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'
Temel sed'de, \(...\)
karakterleri yakalamak için kullanılan yakalama grubu denir. Yakalanan karakterleri geri referanslama yoluyla yönlendirebiliriz. \([^[:space:]]\+\)
herhangi bir karakteri yakalar ancak bir veya daha fazla kez boşluk bırakmaz.
grep
ifconfig eth0 | grep -oP 'inet addr:\K\S+'
\K
önceden eşleşen karakterleri finalde yazdırmaktan atar ve \S+
bir veya daha fazla boşluksuz karakterle eşleşir.
Perl
ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'
inet addr:
Dizenin yanında bulunan bir veya daha fazla boşluk olmayan karakter yakalanır ve son olarak sadece bu karakterleri basarız.
Sen kullanmalıdır ip
(yerine ifconfig
bir tutarlı ve ayrıştırılamaz çıktı üretir, komut dosyası amaçlı en önemlisi belki de muhafaza 's akım, gibi) ve. Aşağıdaki birkaç benzer yaklaşım vardır:
Ethernet arayüzünüz için IPv4 adresini istiyorsanız eth0
:
$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24
Bir komut dosyası olarak:
$ INTFC=eth0
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}')
$ echo $MYIPV4
192.168.1.166/24
Yukarıda üretilen çıktı CIDR notasyonundadır. CIDR notasyonu istenmiyorsa, sıyrılabilir:
$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1
192.168.1.166
IMHO'nun "en şık" olduğu bir diğer seçenek, belirtilen uzak ana bilgisayara bağlanmak için hangi arayüzün kullanıldığına ilişkin IPv4 adresini alır (bu durumda 8.8.8.8). Bu cevapta @ gatoatigrado izniyle :
$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166
Bir komut dosyası olarak:
$ RHOST=8.8.8.8
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166
Bu, tek bir arayüze sahip bir ana bilgisayarda mükemmel şekilde çalışır, ancak daha avantajlı bir şekilde birden fazla arayüze ve / veya rota özelliklerine sahip ana bilgisayarlar üzerinde de çalışır.
ip
Tercih edilen yaklaşımım olsa da, kesinlikle bu kediyi cildin tek yolu bu değil. İşte hostname
daha kolay / daha özlü bir şey tercih ederseniz kullanan başka bir yaklaşım :
$ hostname --all-ip-addresses | awk '{print $1}'
Veya IPv6 adresini istiyorsanız:
$ hostname --all-ip-addresses | awk '{print $2}'
Bir komut dosyası olarak:
$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}')
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166
$ echo $MYV6IP
2601:7c1:103:b27:352e:e151:c7d8:3379
Bu amaç için özel olarak tasarlanmış netifaces gibi bir python kütüphanesi kullanmanızı öneririm .
sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"
Kullanımda olan varsayılan ağ arayüzünü elde etmek için.
default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
Bu sadece ip addr
ikame için bir ikame olan ifconfig
ve awk
ikame ile birleştirilen kullanım (gsub).
Eğer awk yoksa (bazı gömülü aygıtlarda olduğu gibi) kullanışlı olabilecek bir seçenek daha:
ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
bu normal bir kullanıcıyla da kullanılabilir.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
yerine bir kombinasyonu iki kez awk
ve cut
çıkışını ayrıştırmak. Bir dahaki sefere ilk önce diğer tüm cevapları kontrol etmeli ve yinelenen bir çözüm göndermemelisin. Burada bu durumda, bunun bir kopya mı yoksa benzer mi olduğu tartışılabilir olduğunu düşünüyorum, bu yüzden lütfen bunu genel bir ipucu olarak alın. Teşekkürler.
Bu bulabildiğim en kısa yol:
ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'
$1
Ağ arayüzünüzle değiştirin .
ip -f inet
ip'e yalnızca inet (ipv4) ailesi için değerler döndürmesini bildirir.
grep -Po
grep'e bir sonraki değeri perl-regex olarak araya koymasını ve sadece eşleşen değerleri yazdırmasını söyler.
Regex \K[\d.]+
, "her şeyi bu noktaya kadar atmak (\ K) ve mümkün olduğunca üst üste bir nokta izleyen sayısal değerleri eşleştir" der. Bu nedenle, yalnızca IP adresiyle eşleşecek ve bundan sonra, shortform \ XX alt ağ maskesi de dahil olmak üzere her şeyi görmezden gelecektir.
çoklu günlerde ara yüzlerle (örneğin bir liman işçisi kullanıyorsanız) ve ETH tarafından adlandırma arayüzünü artık normal değil
IP / Maske ayıklamak için bu komutu kullanın:
IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)
Bu yüzden ne kadar arabirime sahip olacağım ve adı ne olursa olsun, GREP sadece ilk MULTICAST seçeneğine sahip olacak.
Bu komutu sadece maskeyi IP olmadan ayıklamak için kullanıyorum:
IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)
Bu komutu farklı BDS ve NIX'te kullanıyorum, asla başarısız olmuyor;)
ip
, -o
seçeneği kullanın.
Senaryomda şöyle bir şey kullanıyorum:
re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
echo ${BASH_REMATCH[1]}
else
echo "Cannot determin IP" 1>&2
fi
Herhangi bir işlem ortaya çıkmaz.