it-swarm-id.com

Bagaimana cara mendapatkan alamat IP saya sendiri dan menyimpannya ke variabel dalam skrip Shell?

Bagaimana saya bisa mendapatkan alamat IP saya sendiri dan menyimpannya ke variabel dalam skrip Shell?

68
Tom Brito

Tidak mudah jika Anda ingin mempertimbangkan wlan akun dan antarmuka alternatif lainnya. Jika Anda tahu antarmuka mana yang Anda inginkan untuk alamat (mis., Eth0, kartu Ethernet pertama), Anda dapat menggunakan ini:

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

Dengan kata lain, dapatkan saya informasi konfigurasi jaringan, cari eth0, dapatkan baris itu dan yang berikutnya (-A 1), dapatkan hanya baris terakhir, dapatkan bagian kedua dari baris itu saat dipisah dengan :, lalu dapatkan bagian pertama dari itu ketika membelah dengan ruang.

31
l0b0

Saya percaya cara "alat modern" untuk mendapatkan alamat ipv4 Anda adalah mengurai 'ip' daripada 'ifconfig', jadi itu akan menjadi seperti:

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)

atau semacam itu.

71
jsbillings

Mengapa tidak cukup melakukan IP=$(hostname -I)?

39
Andrei

Jika Anda menginginkan alamat suatu antarmuka, cara termudah adalah menginstal lebih banyak kernel lalu:

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

ifdata menjawab hampir setiap pertanyaan yang membuat Anda tergoda untuk mem-parsing ifconfig output untuk.

Jika Anda ingin mengetahui alamat IP Anda seperti yang dilihat orang luar (di luar NAT, dll.), Ada banyak layanan yang akan melakukannya. Satu cukup mudah:

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

Untuk mendapatkan alamat IPv4 dan IPv6, dan tidak menganggap antarmuka utama adalah eth0 (hari ini em1lebih umum ), coba:

ips=$(ip -o addr show up primary scope global |
      while read -r num dev fam addr rest; do echo ${addr%/*}; done)
  • -o menggunakan format output satu baris, yang lebih mudah diproses dengan read, grep, dll.
  • up tidak termasuk perangkat yang tidak aktif
  • scope global tidak termasuk alamat pribadi/lokal seperti 127.0.0.1 dan fe80::/64
  • primary tidak termasuk alamat sementara (dengan asumsi Anda menginginkan alamat yang tidak berubah)
15
Mikel

Saya tidak bermaksud menjadi brengsek, tetapi benar-benar ada benar cara dan ini dia. Anda memangkas output ip route Untuk mendapatkan hanya IP sumber. Bergantung pada IP apa yang Anda coba jangkau, "alamat ip saya sendiri" (kata-kata OP) akan berbeda. Jika Anda ingin menjangkau internet publik, menggunakan server DNS Google 8.8.8.8 cukup standar. Begitu...

Jawaban singkatnya adalah:

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

Inilah penjelasan terperinci

Jika saya ingin ip yang saya gunakan untuk mencapai internet , saya menggunakan ini:

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

Jika saya ingin ip yang saya gunakan untuk mencapai sesuatu pada [~ # ~] vpn [~ # ~] , saya menggunakan ini:

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

Yang berikutnya ini benar-benar hanya untuk tujuan ilustrasi. Tetapi, itu harus bekerja pada sistem Linux. Jadi, Anda dapat menggunakan ini untuk menunjukkan bahwa, ya, semua mesin memiliki beberapa alamat IP setiap saat.

Jika saya ingin ip yang saya gunakan untuk mencapai sendiri , saya akan menggunakan ini:

[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

Lebih lanjut tentang perintah sed

Pertama izinkan saya mengatakan bahwa ketika memilih alat unix, Anda mencoba untuk memilih alat yang membutuhkan pipa paling sedikit. Jadi, sementara beberapa jawaban akan menyalurkan ifconfig ke grep ke sed ke head, itu jarang diperlukan. Ketika Anda melihatnya, itu akan menaikkan bendera merah bahwa Anda menerima saran dari seseorang dengan sedikit pengalaman. Itu tidak membuat "solusi" salah. Tapi, itu mungkin bisa menggunakan beberapa perampingan.

Saya telah memilih sed karena ini lebih singkat daripada alur kerja yang sama di awk. (Saya sudah sejak contoh awk di bawah ini.) Saya tidak berpikir alat lain tapi 2 itu akan sesuai.

Mari kita periksa apa yang sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}' lakukan:

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

Saya dulu menggunakan sed -n '/src/{s/.*src *//p;q}' Tetapi seorang komentator menunjukkan bahwa beberapa sistem memiliki data trailing setelah bidang src.

Menggunakan awk

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}}}'

Lebih banyak tentang jaringan saya

ifconfig saya menunjukkan bahwa saya memiliki tun0 Untuk VPN saya dan eth0 Untuk lan saya.

[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

Tergantung apa yang Anda maksud dengan alamat IP sendiri. Sistem memiliki alamat IP pada beberapa subnet (kadang-kadang beberapa per subnet), beberapa di antaranya IPv4, beberapa IPv6 menggunakan perangkat seperti adaptor ethernet, antarmuka loopback, terowongan VPN, jembatan, antarmuka virtual ...

Maksud saya, alamat IP yang digunakan perangkat lain untuk mencapai komputer Anda, Anda harus mencari tahu subnet yang mana, dan versi IP mana yang sedang kita bicarakan. Juga, ingatlah bahwa karena NAT dilakukan oleh firewall/router, alamat IP suatu antarmuka mungkin tidak sama dengan Host jarak jauh melihat koneksi masuk dari komputer Anda berasal.

Ketika ada perutean sumber mewah atau per protokol/perutean port mungkin sulit untuk menemukan antarmuka mana yang akan digunakan untuk berbicara dengan satu komputer jarak jauh melalui protokol yang diberikan dan bahkan kemudian, tidak ada jaminan bahwa alamat IP dari antarmuka itu mungkin langsung dialamatkan oleh komputer jarak jauh yang ingin membuat koneksi baru ke komputer Anda.

Untuk IPv4 (mungkin juga berfungsi untuk IPv6), trik yang berfungsi di banyak kesatuan termasuk Linux untuk mengetahui alamat IP antarmuka yang digunakan untuk mencapai Host yang diberikan adalah dengan menggunakan koneksi (2) pada soket UDP dan menggunakan nama panggilan. ():

Misalnya, di komputer rumah saya:

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]);'

Akan digunakan untuk mencari tahu alamat IP dari antarmuka melalui mana saya akan mencapai 8.8.8.8 (server DNS Google). Ini akan mengembalikan sesuatu seperti "192.168.1.123" yang merupakan alamat antarmuka untuk rute default ke internet. Namun, google tidak akan melihat permintaan DNS dari mesin saya sebagai berasal dari alamat IP yang bersifat pribadi, karena ada NAT dilakukan oleh router broadband rumah saya.

terhubung () pada soket UDP tidak mengirim paket apa pun (UDP adalah koneksi-kurang), tetapi mempersiapkan soket dengan menanyakan tabel routing.

8

Pada FreeBSD Anda dapat menggunakan

Dig +short `hostname -f`

Ini dapat bekerja untuk lingkungan lain, tergantung pada pengaturan Anda.

2
Tigger

Dengan asumsi bahwa Anda mungkin memiliki berbagai antarmuka dengan berbagai nama tetapi bahwa Anda menginginkan yang non-localhost dan non-ipv6, Anda dapat mencoba:

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

Anda harus menggunakan ip (bukan ifconfig) seperti saat ini, dikelola, dan mungkin yang paling penting untuk keperluan skrip, ini menghasilkan output yang konsisten & dapat diuraikan. Berikut ini adalah beberapa pendekatan serupa:

Jika Anda ingin alamat IPv4 untuk antarmuka Ethernet Anda eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

Sebagai skrip:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

Output yang dihasilkan di atas adalah dalam notasi CIDR. Jika notasi CIDR tidak diinginkan, maka dapat dilucuti:

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

Pilihan lain yang IMHO adalah "paling elegan" mendapatkan alamat IPv4 untuk antarmuka apa pun yang digunakan untuk terhubung ke Host jarak jauh yang ditentukan (8.8.8.8 dalam kasus ini). Atas perkenan @gatoatigrado di jawaban ini :

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

Sebagai skrip:

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

Ini berfungsi dengan baik pada Host dengan satu antarmuka, tetapi lebih menguntungkan juga akan bekerja pada host dengan banyak antarmuka dan/atau spesifikasi rute.

ip akan menjadi pendekatan yang saya sukai, tetapi tentu saja bukan satu-satunya cara untuk menguliti kucing ini. Inilah pendekatan lain yang menggunakan hostname jika Anda lebih suka sesuatu yang lebih mudah/lebih ringkas:

$ hostname --all-ip-addresses | awk '{print $1}'  

Atau, jika Anda menginginkan alamat IPv6:

$ hostname --all-ip-addresses | awk '{print $2}'  
1
Seamus
myip=$(curl -kLs "http://api.ipify.org")

atau

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

Saya menggunakan one-liner ini:

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-)

Menggunakan ifconfig (tersedia secara luas), tidak mengambil alamat localhost, tidak mengikat Anda ke nama antarmuka yang diberikan, tidak mempertimbangkan IPv6 akun dan mencoba untuk mendapatkan IP dari antarmuka jaringan pertama tersedia.

1

Cuplikan ini menghindari pengodean nama perangkat (seperti 'eth0') dan akan menggunakan ip bukan ifconfig:

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

Ini akan mengembalikan IP perangkat aktif pertama yang tercantum dalam output ip addr. Tergantung pada mesin Anda, ini bisa berupa alamat ipv4 atau ipv6.

Untuk menyimpannya ke dalam variabel, gunakan:

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

Dengan asumsi Anda memerlukan IP publik utama Anda seperti yang terlihat dari seluruh dunia, coba salah satu dari mereka:

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

Saya perlu melakukan ini dalam alias untuk memulai server radio pada NIC kabel saya. Saya menggunakan

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

semua solusi menggunakan awk/sed/grep tampak terlalu rumit dan jelek untuk situasi saya ... jadi saya datang dengan solusi yang sangat sederhana ini TAPI waspadalah karena itu membuat beberapa asumsi, yaitu asumsi bahwa antarmuka TERAKHIR adalah yang Anda tertarik. jika Anda setuju dengan itu maka ini cukup bersih:

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

jika tidak, Anda bisa melakukan pernyataan if konyol untuk menguji awalan tertentu atau kriteria apa pun yang Anda miliki.

0
mad.meesh

Ini mungkin bukan solusi yang paling kuat atau benar, tetapi tidak seperti kebanyakan dari solusi lain, perintah ini berfungsi pada Linux dan Mac (BSD).

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

Beberapa perintah bekerja pada centos 6 atau 7, perintah di bawah ini bekerja pada keduanya,

#!/bin/sh

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

echo $serverip
0
lakshmikandan

Perintah Sederhana untuk menyempurnakan Alamat IP dengan antarmuka default.

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

Diuji pada Semua OS Unix

0
M.S.Arun

Jika Anda mencari alamat IP publik kotak , Anda dapat menggunakan yang berikut:

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

Anda dapat menggunakan Dig(1) opsi seperti -4 Atau -6 Untuk secara khusus mencari alamat IPv4 atau IPv6; Google akan memberikan jawaban dalam catatan tipe TXT, yang akan memiliki tanda kutip ketika disajikan oleh Dig; jika Anda ingin kemudian menggunakan variabel dengan utilitas seperti traceroute, Anda harus menggunakan sesuatu seperti tr (1) untuk menghapus tanda kutip kata.

Pilihan lain termasuk whoami.akamai.net Dan myip.opendns.com, Yang menjawab dengan A dan AAAA catatan (bukan TXT seperti dalam contoh di atas dari Google ), jadi, mereka tidak perlu menghapus tanda kutip:

  • 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

Berikut ini contoh skrip yang menggunakan semua opsi di atas untuk mengatur variabel:

#!/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}"

Jika Anda mencari alamat IP pribadi, atau satu set semua alamat IP yang ditetapkan ke kotak, Anda dapat menggunakan beberapa kombinasi ifconfig (di BSD dan GNU/Linux ), ip addr (Di GNU/Linux), hostname (opsi -i Dan -I Di GNU/Linux) dan - netstat untuk melihat apa yang terjadi.

0
cnst