ฉันจะแสดงที่อยู่ IP ที่แสดงใน eth0 โดยใช้สคริปต์ได้อย่างไร
ฉันจะแสดงที่อยู่ IP ที่แสดงใน eth0 โดยใช้สคริปต์ได้อย่างไร
คำตอบ:
บันทึกสิ่งนี้ในไฟล์แล้วเรียกใช้ 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
อัปเดต : หากวิธีนี้ใช้ไม่ได้ผลให้ลองตอบคำถามอื่น
grep "inet"
เพื่อให้ตัวเลือกอื่นคุณสามารถใช้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)
นำมาจาก/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
สามารถทำงานได้ ... วิธีสวย
การตอบสนองของ @ 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
cut
วิธีหลังจากที่ฉันเรียนรู้เกี่ยวกับawk
และฉันชอบที่จะลดจำนวนคำสั่งในท่อของฉัน ข้อเสนอแนะที่ดีในทุกกรณี
นี่คือผู้รุกรานบางคน .....
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:
สตริงจะถูกดักจับและในที่สุดเราก็พิมพ์อักขระที่ถูกจับเท่านั้น
นี่เป็นคำสั่งที่ดีใช้ grep เป็นคำสั่งรองเท่านั้น:
ip addr แสดง eth0 | grep -oP 'inet \ K \ S [0-9.] +'
ฉันไม่เห็นว่าทำไมคุณควรใช้คำสั่งมากกว่าที่จำเป็น
คุณควรใช้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
ฉันแนะนำให้ใช้ไลบรารี่ของไพ ธ อนเช่น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]
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
ใช้เฉพาะip addr
ซึ่งเป็นการทดแทนifconfig
และawk
รวมกับการทดแทน (gsub)
อีกหนึ่งตัวเลือกที่มีประโยชน์หากคุณไม่มี 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}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
นี่คือสำหรับ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 ).+(?=\/)"
สามารถใช้กับผู้ใช้ปกติได้เช่นกัน
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
สองครั้งแทนการรวมกันawk
และcut
แยกวิเคราะห์ผลลัพธ์ ครั้งต่อไปคุณควรตรวจสอบคำตอบอื่น ๆ ทั้งหมดก่อนดีกว่าและตรวจสอบให้แน่ใจว่าคุณไม่ได้โพสต์โซลูชันที่ซ้ำกัน ในกรณีนี้ที่นี่ฉันคิดว่ามันสามารถพิสูจน์ได้ว่ามันซ้ำซ้อนหรือคล้ายกันดังนั้นโปรดใช้มันเป็นคำใบ้ทั่วไป ขอบคุณ
นี่เป็นวิธีที่สั้นที่สุดที่ฉันสามารถหาได้:
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
ในวันนี้ด้วยการเชื่อมต่อทวีคูณ (เช่นถ้าคุณใช้นักเทียบท่า) และการตั้งชื่อโดย 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
ตัวเลือก
ในสคริปต์ของฉันฉันใช้บางอย่างเช่น:
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
มันไม่เกิดกระบวนการใด ๆ
อีกวิธีหนึ่ง (สมมติว่าคุณไม่ต้องการที่CIDR
อยู่และต้องการIPv4
):
$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
ip
คำสั่งที่ไม่ใช่deprecated