it-swarm-tr.com

Kendi IP adresimi nasıl alabilirim ve bir Shell betiğindeki bir değişkene nasıl kaydedebilirim?

Kendi IP adresimi nasıl alabilirim ve bir Shell betiğindeki bir değişkene nasıl kaydedebilirim?

68
Tom Brito

WLAN ve diğer alternatif arayüzleri hesaba katmak o kadar kolay değil. Hangi arabirimin adresini istediğinizi biliyorsanız (ör. Eth0, ilk Ethernet kartı), bunu kullanabilirsiniz:

ip="$(ifconfig | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)"

Başka bir deyişle, bana ağ yapılandırma bilgilerini alın, eth0 İçin arayın, bu satırı ve sonrakini alın (-A 1), yalnızca son satırı edinin, : ile ayrılırken bu satırın ikinci kısmı, boşlukla ayrılırken ilk satırını alın.

31
l0b0

Ben ipv4 adresi almak için "modern araçlar" yolu 'ifconfig' yerine 'ip' ayrıştırmak olduğuna inanıyorum, bu yüzden şöyle bir şey olurdu:

ip4=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
ip6=$(/sbin/ip -o -6 addr list eth0 | awk '{print $4}' | cut -d/ -f1)

ya da böyle bir şey.

71
jsbillings

Neden IP=$(hostname -I) yapmıyorsunuz?

39
Andrei

Bir arayüzün adresini istiyorsanız, en kolay yol daha fazla dosya yüklemektir:

[email protected]:~$ ifdata -pa br0
172.16.1.244

ifdata, ifconfig çıktısını ayrıştırmak isteyeceğiniz her soruyu hemen hemen yanıtlıyor.

IP adresinizi dışarıdan gördüğü gibi (herhangi bir NAT vb. Ötesinde) öğrenmek istiyorsanız, bunu yapacak birçok hizmet vardır. Biri oldukça kolaydır:

[email protected]:~$ curl ifconfig.me
173.167.51.137
27
derobert

IPv4 ve IPv6 adreslerini almak ve ana arayüzün eth0 Olduğunu varsaymamak için (bugünlerde em1daha yaygındır ) deneyin:

ips=$(ip -o addr show up primary scope global |
      while read -r num dev fam addr rest; do echo ${addr%/*}; done)
  • -o, read, grep vb. İle işlenmesi daha kolay olan tek satırlık çıktı biçimini kullanır.
  • up aktif olmayan cihazları hariç tutar
  • scope global, 127.0.0.1 Ve fe80::/64 Gibi özel/yerel adresleri hariç tutar
  • primary hariç tutuyor geçici adresler (değişmeyen bir adres istediğinizi varsayarsak)
15
Mikel

Ben bir pislik olmak istemiyorum, ama gerçekten bir doğr yolu var ve işte bu. Yalnızca kaynak IP'yi almak için ip route Çıktısını kesersiniz. Hangi IP'ye ulaşmaya çalıştığınıza bağlı olarak, "kendi ip adresim" (OP'nin kelimeleri) farklı olacaktır. Herkese açık internete erişmeyi düşünüyorsanız Google'ın 8.8.8.8 DNS sunucusunu kullanmak oldukça standarttır. Yani...

Kısa cevap:

ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'

İşte ayrıntılı açıklama

internet ulaşmak için kullandığım ip istiyorsanız, bunu kullanın:

[email protected]:~ $ ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
10.55.0.200

Benim VPN bir şey ulaşmak için kullandığım ip istiyorsanız, bunu kullanın:

[email protected]:~ $ ip route get 172.31.0.100 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
172.29.0.9

Bu bir sonraki gerçekten sadece açıklama amaçlıdır. Ancak, herhangi bir Linux sistemi üzerinde çalışmalıdır. Yani, bunu, evet, tüm makinelerin her zaman birden fazla IP adresine sahip olduğunu göstermek için kullanabilirsiniz.

Ben ulaşmak için kullandığım ip istedim kendim, ben bunu kullanacağım:

[email protected]:~ $ my_ip=$(getent hosts $(cat /etc/hostname) | awk '{print $1; exit}')
[email protected]:~ $ ip route get $my_ip | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
127.0.0.1

Bu sed komutu hakkında daha fazla bilgi

Öncelikle, unix araçlarını seçerken, en az boru gerektiren araçları seçmeye çalıştığınızı söyleyeyim. Bu nedenle, bazı yanıtlar ifconfig ile grep ile sed ile head arasında bağlantı kurarken, bu nadiren gerekli olur. Gördüğünüzde, deneyimi az olan birinden tavsiye aldığınız bir kırmızı bayrak kaldırmalıdır. Bu "çözümü" yanlış yapmaz. Ama muhtemelen biraz düzene girebilir.

sed 'ı seçtim çünkü awk ile aynı iş akışından daha kesik. (Aşağıdaki garip bir örnek var.) Başka bir araç düşünmüyorum ama bu 2 uygun olacaktır.

sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}' 'in ne yaptığını inceleyelim:

sed            # the sed executable located via $PATH
-n             # no output unless explicitly requested
'              # begin the command space
/src/          # regex match the string 'src'
{              # begin a block of commands **
s/             # begin a substitution (match)
  .*src *      # match anything leading up to and including src and any number of spaces
  \([^ ]*\)    # define a group containing any number of non spaces
  .*           # match any trailing characters (which will begin with a space because of the previous rule).
/              # begin the substitution replacement
  \1           # reference the content in the first defined group
/              # end the substitution
p              # print (explicitly, remember) the result
;              # designate the end of the command
q              # quit
}              # end the block of commands
'              # end the command space

** all of which will be performed "on match"
  - otherwise only the first command to following the match would be performed "on match"
    - any other commands would be performed whether there was a match or not

Eskiden sed -n '/src/{s/.*src *//p;q}' Kullanıyordum, ancak bir yorumcu bazı sistemlerin src alanından sonra izleme verisine sahip olduğuna dikkat çekti.

Awk kullanma

ip route get 8.8.8.8 | \
    awk '{gsub(".*src",""); print $1; exit}'

# or

ip route get 8.8.8.8 | \
    awk '{for(i=1; i<NF; i++){if($i=="src"){i++; print $i; exit}}}'

Ağım hakkında daha fazla bilgi

ifconfig, VPN'im için tun0 Ve lan'ım için eth0 Olduğunu gösteriyor.

[email protected]:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.55.0.200  netmask 255.255.252.0  broadcast 10.55.3.255
        inet6 fe80::71e6:5d7c:5b4b:fb25  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:b2:96:84  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<Host>
        loop  txqueuelen 1  (Local Loopback)

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 172.29.0.9  netmask 255.255.255.255  destination 172.29.0.10
        inet6 fe80::3a8e:8195:b86c:c68c  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)

wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether b8:27:eb:e7:c3:d1  txqueuelen 1000  (Ethernet)
9
Bruno Bronosky
ipa=$(ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g')

ipa=$(hostname -i|cut -f2 -d ' ')
8
fastrizwaan

Kendi IP adresinize göre ne demek istediğinize bağlı. Sistemlerin bazıları IPv4, bazıları IPv6, ethernet adaptörleri, geridönüş arabirimleri, VPN tünelleri, köprüler, sanal arabirimler gibi aygıtları kullanan çeşitli alt ağlarda (bazen alt ağ başına birkaç tane) IP adresleri vardır ...

Yani, başka bir cihazın bilgisayarınıza erişebileceği IP adresini, hangi alt ağın olduğunu ve hangi IP sürümünden bahsettiğimizi bulmanız gerekiyor. Ayrıca, NAT nedeniyle, bir arabirimin IP adresinin uzak bir Ana Bilgisayarın bilgisayarınızdan gelen bir bağlantı gördüğüyle aynı olmadığını unutmayın.

Süslü kaynak yönlendirmesi veya protokol/bağlantı noktası yönlendirmesi olduğunda, belirli bir protokol üzerinden bir uzak bilgisayarla konuşmak için hangi arabirimin kullanılacağını bulmak zor olabilir ve o zaman bile, bu arabirimin IP adresinin olabileceğine dair bir garanti yoktur. bilgisayarınıza yeni bir bağlantı kurmak isteyen uzak bilgisayar tarafından doğrudan adreslenebilir.

IPv4 için (muhtemelen IPv6 için de çalışır), belirli bir Ana Bilgisayara ulaşmak için kullanılan arabirimin IP adresini bulmak için Linux da dahil olmak üzere birçok birleşimde çalışan bir hile, bir UDP soketinde bir connect (2) kullanmak ve getsockname kullanmaktır ():

Örneğin, ev bilgisayarımda:

Perl -MSocket -le 'socket(S, PF_INET, SOCK_DGRAM, getprotobyname("udp"));
connect(S, sockaddr_in(1, inet_aton("8.8.8.8")));
print inet_ntoa((sockaddr_in(getsockname(S)))[1]);'

8.8.8.8'e (google'ın DNS sunucusu) ulaşacağım arayüzün IP adresini bulmak için kullanılır. "192.168.1.123" gibi, Internet'e giden varsayılan yolun arabiriminin adresi olan bir şey döndürür. Ancak, google benim makineden gelen bir DNS isteğini özel bir IP adresinden geldiğini görmez, çünkü NAT ev geniş bant yönlendiricim tarafından gerçekleştirilir.

uDP soketindeki connect () herhangi bir paket göndermez (UDP bağlantısızdır), ancak yönlendirme tablosunu sorgulayarak soketi hazırlar.

8

FreeBSD'de şunları kullanabilirsiniz:

Dig +short `hostname -f`

Bu, kurulumunuza bağlı olarak diğer ortamlar için işe yarayabilir.

2
Tigger

İlk yerel olmayan olmayan ve ipv6 olmayan çeşitli adlara ancak çeşitli arabirimlere sahip olabileceğinizi varsayarsak, deneyebilirsiniz:

ip=`ip addr show |grep "inet " |grep -v 127.0.0. |head -1|cut -d" " -f6|cut -d/ -f1`
2
Nicolas

ip (ifconfig yerine) şu an geçerli, sürdürülen ve belki de en önemlisi komut dosyası oluşturma amaçları için kullanmalısınız, tutarlı ve ayrıştırılabilir bir çıktı üretir. Aşağıda birkaç benzer yaklaşım bulunmaktadı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  

Senaryo 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 gösterimi. CIDR gösterimi istenmiyorsa, çıkarılabilir:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

IMHO'nun "en şık" olduğu diğer bir seçenek, belirtilen uzak Ana Bilgisayara bağlanmak için kullanılan arabirimin IPv4 adresini alır (bu durumda 8.8.8.8). @Gatoatigrado'nun izniyle bu cevap :

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

Senaryo olarak:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

Bu, tek bir arabirime sahip bir Ana Bilgisayarda mükemmel çalışır, ancak daha avantajlı olarak, birden çok arabirimi ve/veya yol belirtimi olan ana bilgisayarlarda da çalışır.

ip benim tercih ettiğim yaklaşım olurdu, ama kesinlikle bu kedinin derisini almanın tek yolu bu değil. Daha kolay/kısa ve öz bir şey tercih ediyorsanız hostname 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}'  
1
Seamus
myip=$(curl -kLs "http://api.ipify.org")

veya

myip=$(wget -q "http://api.ipify.org" -O -)
1
Zibri

Bu tek astarı kullanıyorum:

IP=$(/sbin/ifconfig | grep -e "inet:" -e "addr:" | grep -v "inet6" | grep -v "127.0.0.1" | head -n 1 | awk '{print $2}' | cut -c6-)

ifconfig (yaygın olarak kullanılabilir) kullanır, localhost adresini almaz, belirli bir arabirim adına bağlanmaz, IPv6'yı dikkate almaz ve ilk ağ arabiriminin IP'sini almaya çalışır mevcut.

1

Bu snippet, cihaz adının ('eth0' gibi) kodlanmasını önler ve ip yerine ifconfig kullanır:

/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'

ip addr Çıkışında listelenen ilk etkin cihazın IP'sini döndürür. Makinenize bağlı olarak, bu bir ipv4 veya ipv6 adresi olabilir.

Değişkeni saklamak için şunu kullanın:

ip=$(/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')
0
Philipp Claßen

Birincil genel IP'nize ihtiyacınız olduğunu varsayarsak dünyanın geri kalanından görüldüğü gibi, bunlardan birini deneyin:

wget http://ipecho.net/plain -O - -q
curl http://icanhazip.com
curl http://ifconfig.me/ip
0
Putnik

Kablolu NIC'imde bir radyo sunucusu başlatmak için bunu bir takma adla yapmam gerekiyordu. kullandım

ip addr | egrep -i "inet.+eth1" | awk -F[\ /] '{print $6}' | tr -d [:space:]
0
user208145

awk/sed/grep kullanan tüm çözümler durumum için aşırı karmaşık ve çirkin görünüyor ... bu yüzden bu gerçekten basit bir çözümle geldim AMA cus bazı varsayımlar yapar, yani LAST arayüzünün siz olduğunuz varsayımı Ilgilenen. Eğer bu konuda iyiyseniz o zaman bu oldukça temiz:

ifconfig | awk '/net / { x = $2 } END { print x }'

aksi takdirde belirli bir öneki veya sahip olabileceğiniz ölçütleri test etmek için bazı aptal if ifadesi yapabilirsiniz.

0
mad.meesh

Bu en sağlam veya doğru çözüm olmayabilir, ancak diğer çözümlerin çoğundan farklı olarak, komut hem Linux hem de Mac (BSD) üzerinde çalışır.

Host `hostname` | awk '{print $NF}'
0
wisbucky

Bazı komutlar centos 6 veya 7 üzerinde çalışıyor, aşağıdaki komut her ikisinde de çalışıyor,

#!/bin/sh

serverip=`/sbin/ifconfig eth0 | grep "inet" | awk '{print $2}' | awk 'NR==1' | cut -d':' -f2`

echo $serverip
0
lakshmikandan

Basit IP Adresini varsayılan arayüz ile ince ayar komutu.

ip route | grep src | awk '{print $NF; exit}'

Tüm Unix İşletim Sistemlerinde Test Edilmiştir

0
M.S.Arun

Bir kutunun genel IP adresi arıyorsanız, aşağıdakileri kullanabilirsiniz:

  • Dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \"

Bir IPv4 veya IPv6 adresini özellikle aramak için Dig(1)-4 Veya -6 Gibi seçenekleri kullanabilirsiniz; Google, TXT türünde bir kayıt sunacaktır; bu, Dig tarafından sunulduğunda tırnak işaretleri içerecektir; Değişkeni daha sonra traceroute gibi yardımcı programlarla kullanmak istiyorsanız, adı geçen tırnak işaretlerini kaldırmak için tr (1) gibi bir şey kullanmanız gerekir.

Diğer seçenekler arasında, whoami.akamai.net Ve myip.opendns.com, A ve AAAA kayıtları (Google'ın yukarıdaki örneğinde olduğu gibi TXT yerine) ), bu nedenle, tırnak işaretlerinin kaldırılmasını gerektirmez:

  • Dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short

  • Dig -4 @resolver1.opendns.com -t any myip.opendns.com +short

  • Dig -6 @resolver1.opendns.com -t any myip.opendns.com +short

Değişkenleri ayarlamak için yukarıdaki tüm seçenekleri kullanan örnek bir komut dosyası aşağıdadır:

#!/bin/sh
IPANY="$(Dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
GOOGv4="$(Dig -4 @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
GOOGv6="$(Dig -6 @ns1.google.com -t txt o-o.myaddr.l.google.com +short | tr -d \")"
AKAMv4="$(Dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short)"
CSCOv4="$(Dig -4 @resolver1.opendns.com -t a myip.opendns.com +short)"
CSCOv6="$(Dig -6 @resolver1.opendns.com -t aaaa myip.opendns.com +short)"
printf '$GOOG:\t%s\t%s\t%s\n' "${IPANY}" "${GOOGv4}" "${GOOGv6}"
printf '$AKAM:\t%s\n$CSCO:\t%s\t%s\n' "${AKAMv4}" "${CSCOv4}" "${CSCOv6}"

Özel bir IP adresi veya kutuya atanmış tüm IP adresleri kümesi arıyorsanız, ifconfig (BSD ve GNU'da)/Linux), ip addr (GNU/Linux'ta), hostname (seçenekler -i Ve -I Linux) ve netstat neler olduğunu görmek için.

0
cnst