วิธีการจับภาพที่อยู่ IP แรกจากคำสั่ง ifconfig?


9

วิธีการจับที่อยู่ IP แรกที่มาจากifconfigคำสั่ง?

ifconfig -a
enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.14.22.12  netmask 255.255.0.0  broadcast 100.14.255.255
        inet6 fe80::250:56ff:fe9c:158a  prefixlen 64  scopeid 0x20<link>
        ether 00:10:56:9c:65:8a  txqueuelen 1000  (Ethernet)
        RX packets 26846250  bytes 12068811576 (11.2 GiB)
        RX errors 0  dropped 58671  overruns 0  frame 0
        TX packets 3368855  bytes 1139160934 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ผลลัพธ์ที่คาดหวัง:

IP=100.14.22.12

3
คำถามได้รับการตอบแล้วไม่ว่าจะใช้ awk หรือ grep / cut เป็นต้น แต่ก็ยังเป็นความคิดที่ไม่ดีที่จะใช้และ grep จาก ifconfig ip นั้นเหมาะสมกว่าและได้รับการสนับสนุนที่ดีกว่าใน Linux รุ่นใหม่
เปโดร

1
ฟังดูเหมือนปัญหา XY คุณต้องการข้อมูลอะไรจริงๆ ที่อยู่ IP ของเครือข่ายหลักของเครื่องคืออะไร? ที่อยู่ IP ที่เชื่อมต่อกับเครือข่ายใด ๆ ของเครื่อง ที่อยู่ IP ของอะแดปเตอร์เครือข่ายแรก? ที่อยู่ IP ใด ๆ ไม่สำคัญว่าจะเป็นอะไร อาจมีวิธีที่ถูกต้องแม่นยำและพกพามากขึ้นในการรับข้อมูลที่คุณต้องการ
alex.forencich

คำตอบ:


20

ควรหลีกเลี่ยงการใช้ifconfigเพื่อรับที่อยู่ IP ในสคริปต์ที่เลิกใช้แล้วในการแจกแจงบางอย่าง (เช่น CentOS และอื่น ๆ อย่าติดตั้งโดยค่าเริ่มต้นอีกต่อไป)

ในระบบอื่น ๆ ผลลัพธ์ของ ifconfig จะแตกต่างกันไปตามรุ่นของการแจกจ่าย (เช่นเอาต์พุต / การเว้นวรรค / ฟิลด์ของifconfigความแตกต่างจาก Debian 8 ถึง Debian 9 เป็นต้น)

ในการรับที่อยู่ IP ด้วยipวิธีเดียวกันกับที่คุณขอ:

ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '

หรือดีกว่า:

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249

หรือตามที่คุณถาม "IP ="

#!/bin/bash
echo -n "IP="
ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '

ปรับความคิดอย่างไร้ยางอายจาก @Roman

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } ' 
IP=192.168.1.249

เอาท์พุทปกติ:

 $ ip -o -4  address show 
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: eth0    inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\       valid_lft forever preferred_lft forever

จากman ip:

-o, -
ออกบรรทัดแต่ละเร็กคอร์ดในบรรทัดเดียวแทนที่การป้อนบรรทัดด้วยอักขระ '\' สิ่งนี้จะสะดวกเมื่อคุณต้องการนับระเบียนด้วย wc (1) หรือเพื่อ grep (1) เอาต์พุต

ดูตัวอย่างหนึ่งว่าเพราะเหตุใดจึงifconfigไม่แนะนำ: BBB: `bbb-conf --check` แสดงที่อยู่ IP ว่า` inet '- ifconfig

สำหรับการทำความเข้าใจสาเหตุที่ใกล้ifconfigจะถึงโปรดดูความแตกต่างระหว่างคำสั่ง 'ifconfig' และ 'ip'

ifconfigมาจากเครื่องมือเน็ตซึ่งไม่สามารถติดตามเครือข่าย Linux ได้อย่างสมบูรณ์เป็นเวลานาน นอกจากนี้ยังใช้ ioctl สำหรับการกำหนดค่าเครือข่ายซึ่งเป็นวิธีที่น่าเกลียดและมีประสิทธิภาพน้อยกว่าในการโต้ตอบกับเคอร์เนล

ประมาณปี 2005 มีการนำเสนอกลไกใหม่สำหรับการควบคุมเครือข่ายสแต็ค - ซ็อกเก็ต netlink

ในการกำหนดค่าอินเทอร์เฟซเครือข่ายiproute2ใช้กลไกซ็อกเก็ต netlink ฟูลดูเพล็กซ์ในขณะที่ifconfigอาศัยการเรียกใช้ระบบ ioctl


ฉันไม่ต้องการชุด eth0 เป็นค่าเริ่มต้นเพราะชื่อนี้การเปลี่ยนแปลงในเครื่องเราสามารถให้ความยืดหยุ่นไวยากรณ์
Yael

@ Yael Changed ได้นำ eth0 ออกมา อย่างไรก็ตามโรมันได้ดีกว่าฉันพิมพ์ "IP =" awkภายใน พลังสมองมากเกินไปสำหรับฉันยังคงตื่นขึ้นมา หลีกเลี่ยงifconfigมันไม่มีอนาคตและตำแหน่งของการเปลี่ยนแปลงที่อยู่ IP มีเวอร์ชัน / การนำไปใช้อย่างน้อยสองรุ่น (?) สำหรับ Linux ที่ฉันรู้
Rui F Ribeiro

สำหรับข้อมูลในiproute2 รุ่นใหม่กว่า (เช่น: ไม่ได้อยู่ใน CentOS7 หรือ Debian8) ip สามารถรับ-briefพารามิเตอร์และผลลัพธ์ของมันจะแยกวิเคราะห์ได้ง่ายขึ้น (2015-08-31: git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB

@AB เช่นกัน -o เมื่อฉันใช้ความช่วยเหลือขอบคุณจะตรวจสอบหรือไม่
Rui F Ribeiro

1
อาฉันไม่รู้ด้วยซ้ำ-oว่าสคริปต์ตัว
AB


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.