การแสดงที่อยู่ IP บนอินเตอร์เฟส eth0


24

ฉันจะแสดงที่อยู่ IP ที่แสดงใน eth0 โดยใช้สคริปต์ได้อย่างไร

คำตอบ:


28

บันทึกสิ่งนี้ในไฟล์แล้วเรียกใช้ bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

มีความแม่นยำมากขึ้นเพื่อรับเฉพาะหมายเลขที่แสดงที่อยู่ IP:

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1

อัปเดต : หากวิธีนี้ใช้ไม่ได้ผลให้ลองตอบคำถามอื่น


2
แน่นอนว่ามันใช้งานไม่ได้ใน Ubuntu รุ่นล่าสุด ล่าสุดผลตอบแทน ifconfig "inet <IP>" แทน "inet addr <IP>"
Thang

คุณสามารถใช้grep "inet"
Andrei Radulescu

26

เพื่อให้ตัวเลือกอื่นคุณสามารถใช้ip addrคำสั่งด้วยวิธีนี้เพื่อรับที่อยู่ IP:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 แสดงข้อมูลเกี่ยวกับ eth0
  • grep "inet\b"แสดงเฉพาะบรรทัดที่มีที่อยู่ IPv4 (หากคุณต้องการที่อยู่ IPv6 ให้เปลี่ยนเป็น"inet6\b")
  • awk '{print $2}' พิมพ์บนฟิลด์ที่สองซึ่งมี ipaddress / mask ตัวอย่าง 172.20.20.15/25
  • cut -d/ -f1 ใช้เวลาเพียงส่วนที่อยู่ IP

ในสคริปต์:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

วิธีนี้ใช้งานได้จริง!
ท้อง

ip -4 ... และ ip -6 ... ! ขอขอบคุณ!
TamusJRoyce

17

นำมาจาก/programming//a/14910952/1695680

hostname -i

อย่างไรก็ตามอาจส่งคืนที่อยู่ IP ท้องถิ่น (127.0.0.1) ดังนั้นคุณอาจต้องใช้และกรอง:

hostname -I

จาก manpages ของชื่อโฮสต์:

-i, --ip-address

แสดงที่อยู่เครือข่าย (es) ของชื่อโฮสต์ โปรดทราบว่าจะใช้งานได้ก็ต่อเมื่อชื่อโฮสต์สามารถแก้ไขได้ หลีกเลี่ยงการใช้ตัวเลือกนี้ ใช้ชื่อโฮสต์ --all-ip-addresses แทน

-I, --all-ip-addresses

แสดงที่อยู่เครือข่ายทั้งหมดของโฮสต์ ตัวเลือกนี้จะระบุที่อยู่ที่กำหนดค่าไว้ทั้งหมดบนเครือข่ายอินเตอร์เฟซทั้งหมด อินเทอร์เฟซแบบวนรอบและที่อยู่การเชื่อมโยงท้องถิ่น IPv6 ถูกละเว้น ตรงกันข้ามกับตัวเลือก -i ตัวเลือกนี้ไม่ได้ขึ้นอยู่กับการจำแนกชื่อ อย่าตั้งสมมติฐานใด ๆ เกี่ยวกับลำดับของเอาต์พุต


สำหรับบันทึกฉันชอบที่ip addr show label 'enp*'ดีกว่า แต่ฉันแยกวิเคราะห์ที่น่ารำคาญสิ่งที่ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2สามารถทำงานได้ ... วิธีสวย
ThorSummoner

5

การตอบสนองของ @ markus-lindberg เป็นที่ชื่นชอบ หากคุณเพิ่ม-o -4ในแฟล็กของ ip คุณจะได้เอาต์พุตที่แยกวิเคราะห์ได้ง่ายขึ้น (และสอดคล้องกัน):

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'

-oย่อมาจาก--onelineซึ่งมีไว้เพื่อช่วยในสถานการณ์เช่นนี้ -4จะถูกเพิ่มขีด จำกัด ไปยังที่อยู่ IPv4 ซึ่งเป็นสิ่งที่ทุกคนอื่น ๆ ที่บ่งบอกถึงการตอบสนอง


รักipธง ใช้ตัวช่วยสร้างcutขั้นสูงแทนawk:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ

@ DuffJ มันอาจเป็นเรื่องของรสนิยมส่วนตัว ฉันค้นพบcutวิธีหลังจากที่ฉันเรียนรู้เกี่ยวกับawkและฉันชอบที่จะลดจำนวนคำสั่งในท่อของฉัน ข้อเสนอแนะที่ดีในทุกกรณี
Amos Shapira

ฉันเห็นด้วยอย่างสมบูรณ์เอมัส ขอบคุณสำหรับการแก้ปัญหาของคุณ!
DuffJ

3

นี่คือผู้รุกรานบางคน .....

awk

ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'

ฟังก์ชั่นแยกในคำสั่งดังกล่าวข้างต้น awk แยกคอลัมน์ที่สองขึ้นอยู่กับตัวคั่น:และร้านค้าค่า splitted aเข้าไปในอาเรย์ ดังนั้นa[2]ถือค่าของส่วนที่สอง

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

ใน sed พื้นฐาน\(...\)เรียกว่ากลุ่มการจับซึ่งใช้ในการจับตัวละคร เราสามารถอ้างอิงตัวละครที่ถูกจับเหล่านั้นผ่านการอ้างอิงกลับ \([^[:space:]]\+\)จับตัวละครใด ๆ แต่ไม่เว้นวรรคหนึ่งครั้งขึ้นไป

grep

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\Kละทิ้งอักขระที่ตรงกันก่อนหน้านี้จากการพิมพ์ที่สุดท้ายและจับคู่อักขระที่\S+ไม่เว้นวรรคหนึ่งตัวหรือมากกว่า

Perl

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

อักขระที่ไม่มีช่องว่างหนึ่งตัวหรือมากกว่าซึ่งอยู่ถัดจากinet addr:สตริงจะถูกดักจับและในที่สุดเราก็พิมพ์อักขระที่ถูกจับเท่านั้น


@edwardtorvalds เพิ่มคำอธิบายบางอย่าง ฉันคิดว่านี่จะเป็นประโยชน์สำหรับผู้อ่านในอนาคต อย่าลังเลที่จะถามคำถามใด ๆ จากคำสั่งข้างต้น ... :)
Avinash Raj

2

นี่เป็นคำสั่งที่ดีใช้ grep เป็นคำสั่งรองเท่านั้น:

ip addr แสดง eth0 | grep -oP 'inet \ K \ S [0-9.] +'

ฉันไม่เห็นว่าทำไมคุณควรใช้คำสั่งมากกว่าที่จำเป็น


2

คุณควรใช้ip(แทนifconfig) เนื่องจากเป็นปัจจุบันได้รับการดูแลรักษาและที่สำคัญที่สุดสำหรับวัตถุประสงค์ในการเขียนสคริปต์มันสร้างเอาต์พุตที่สอดคล้องและแยกวิเคราะห์ได้ ต่อไปนี้เป็นวิธีการที่คล้ายกันบางประการ:

หากคุณต้องการที่อยู่ IPv4 สำหรับอินเตอร์เฟส Ethernet ของคุณeth0:

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

เป็นสคริปต์:

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

เอาต์พุตที่สร้างขึ้นด้านบนอยู่ในรูปแบบCIDR หากไม่ต้องการสัญกรณ์ CIDR สามารถถอดออกได้:

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

ตัวเลือกอื่นที่ IMHO นั้น "หรูหราที่สุด" จะได้รับที่อยู่ IPv4 สำหรับอินเทอร์เฟซใดก็ตามที่ใช้เพื่อเชื่อมต่อกับโฮสต์ระยะไกลที่ระบุ (8.8.8.8 ในกรณีนี้) ความอนุเคราะห์ของ @gatoatigrado ในคำตอบนี้ :

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

เป็นสคริปต์:

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

สิ่งนี้ทำงานได้ดีบนโฮสต์ที่มีอินเตอร์เฟสเดียว แต่ก็มีประโยชน์มากกว่าที่จะทำงานกับโฮสต์ที่มีอินเตอร์เฟสหลายตัวและ / หรือข้อกำหนดเส้นทาง

แม้ว่าipจะเป็นวิธีที่ฉันชอบ แต่ก็ไม่ได้เป็นวิธีเดียวที่จะทำให้แมวตัวนี้ นี่เป็นอีกวิธีหนึ่งที่ใช้hostnameหากคุณต้องการบางสิ่งที่ง่ายขึ้น / กระชับยิ่งขึ้น:

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

หรือถ้าคุณต้องการที่อยู่ IPv6:

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

เป็นสคริปต์:

$ 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

1

ฉันแนะนำให้ใช้ไลบรารี่ของไพ ธ อนเช่นnetifacesที่ออกแบบมาเพื่อการนี้โดยเฉพาะ

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

เพื่อรับอินเตอร์เฟสเครือข่ายเริ่มต้นที่ใช้งานอยู่

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]


1

อีกหนึ่งตัวเลือกที่มีประโยชน์หากคุณไม่มี awk (เช่นในอุปกรณ์ฝังตัวบางตัว):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"


1

นี่คือสำหรับIPv4 :

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

นี่คือสำหรับIPv4 & โดยเฉพาะdev (eth0):

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

สำหรับIPv6 :

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"


0

สามารถใช้กับผู้ใช้ปกติได้เช่นกัน

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6

เขาขอ eth0 สคริปต์ของคุณเวอร์ชันนี้อาจช่วยได้ (แสดงลูปแบ็คโทด้วย)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt

นี่เป็นคำตอบเดียวกับaskubuntu.com/a/560466/367990เพียงใช้cutสองครั้งแทนการรวมกันawkและcutแยกวิเคราะห์ผลลัพธ์ ครั้งต่อไปคุณควรตรวจสอบคำตอบอื่น ๆ ทั้งหมดก่อนดีกว่าและตรวจสอบให้แน่ใจว่าคุณไม่ได้โพสต์โซลูชันที่ซ้ำกัน ในกรณีนี้ที่นี่ฉันคิดว่ามันสามารถพิสูจน์ได้ว่ามันซ้ำซ้อนหรือคล้ายกันดังนั้นโปรดใช้มันเป็นคำใบ้ทั่วไป ขอบคุณ
ผู้บัญชาการไบต์

0

นี่เป็นวิธีที่สั้นที่สุดที่ฉันสามารถหาได้:

ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'

แทนที่$1ด้วยอินเตอร์เฟสเครือข่ายของคุณ

ip -f inet บอก ip ให้ส่งคืนค่าสำหรับตระกูล inet (ipv4) เท่านั้น

grep -Po บอก grep ให้ interperate ค่าถัดไปเป็น perl-regex และพิมพ์เฉพาะค่าที่ตรงกัน

Regex \K[\d.]+บอกว่า "ทิ้งทุกอย่างจนถึงจุดนี้ (\ K) และจับคู่ค่าตัวเลขให้มากที่สุดตามด้วยจุดในแถวที่เป็นไปได้" นี่จะเป็นการจับคู่ที่อยู่ IP เท่านั้นและจะไม่สนใจทุกสิ่งหลังจากนั้นรวมถึงซับเน็ตมาสก์ shortform \ XX


0

ในวันนี้ด้วยการเชื่อมต่อทวีคูณ (เช่นถ้าคุณใช้นักเทียบท่า) และการตั้งชื่อโดย ETH ไม่ได้เป็นบรรทัดฐานอีกต่อไป

ฉันใช้คำสั่งนี้เพื่อแยก IP / Mask:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

ดังนั้นไม่ว่าฉันจะมีอินเทอร์เฟซกี่ตัวและชื่ออะไรก็ตาม GREP จะคว้าตัวเลือกแรกเท่านั้นที่มีตัวเลือก MULTICAST

ฉันใช้คำสั่งนี้เพื่อดึงเฉพาะ IP ที่ไม่มีรูปแบบ:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

ฉันใช้คำสั่งเหล่านี้กับ BDS & NIX ที่แตกต่างกันมันไม่เคยล้มเหลว)


หากคุณจะแยกวิเคราะห์ผลลัพธ์ของipใช้-oตัวเลือก
muru

0

ในสคริปต์ของฉันฉันใช้บางอย่างเช่น:

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

มันไม่เกิดกระบวนการใด ๆ


0

อีกวิธีหนึ่ง (สมมติว่าคุณไม่ต้องการที่CIDRอยู่และต้องการIPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • ใช้ipคำสั่งที่ไม่ใช่deprecated
  • ใช้คำสั่งเดียวสำหรับการกรอง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.