ควรหลีกเลี่ยงการใช้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