ฉันจะรับเกตเวย์เริ่มต้นใน LINUX ให้ปลายทางได้อย่างไร


11

ฉันกำลังพยายามหาเกตเวย์เริ่มต้นโดยใช้ปลายทาง 0.0.0.0

ฉันใช้คำสั่งนี้: netstat -rn | grep 0.0.0.0

และจะส่งคืนรายการนี้:

Destination - Gateway      - Genmask         - Flags - MSS - Window - irtt - Iface
10.9.9.17   - 0.0.0.0      - 255.255.255.255 - UH    - 0     0        0    - tun0
133.88.0.0  - 0.0.0.0      - 255.255.0.0     - U     - 0     0        0    - eth0
0.0.0.0     - 133.88.31.70 - 0.0.0.0         - UG    - 0     0        0    - eth0

เป้าหมายของฉันที่นี่คือการ ping เกตเวย์เริ่มต้นโดยใช้ปลายทาง 0.0.0.0; ดังนั้นนั่นคือ "133.88.31.70"; แต่อันนี้กลับรายการเนื่องจากการใช้ 'grep'

คำถามคือฉันจะรับเกตเวย์เริ่มต้นเท่านั้นได้อย่างไร ฉันจะต้องใช้มันสำหรับสคริปต์ทุบตีของฉันเพื่อระบุว่าการเชื่อมต่อเน็ตอัพหรือไม่

คำตอบ:


21
DEFAULT_ROUTE=$(ip route show default | awk '/default/ {print $3}')
ping -c 1 $DEFAULT_ROUTE

วิธีนี้จะช่วยแก้ปัญหาของคุณได้


@Suezy Ha! ดู? awk!
Jeremy Powell

ปิดใบเสนอราคาเดียว / ปิดวงเล็บไม่ตรงกันในตอนท้ายฉันคิดว่า - ใช้งานได้ดีอย่างอื่นแม้ว่า!
Mark K Cowan

3
ฉันเห็นคำตอบออนไลน์เล็กน้อยด้วยคำสั่งนี้ แต่ไม่ใช่คำตอบที่อธิบายว่าทำไมใช้ "แสดงค่าเริ่มต้น" ในความเป็นจริง "ip แสดงเส้นทาง" โดยไม่มีพารามิเตอร์ใด ๆ ทำสิ่งเดียวกันสำหรับฉัน ดังนั้นคำถามของฉันคือทำไมมี "เริ่มต้น" ในคำสั่งหรือไม่ มันหมายความว่าอะไร?
user658991

@ user658991 ฉันลงหลุมกระต่ายแล้วและคุณพูดถูก มันไม่ได้ทำอะไรในรุ่นที่พบบ่อยที่สุดของที่ipนั่น ในความเป็นจริงip route showเป็นนามแฝงสำหรับip route listคุณและคุณสามารถตรวจสอบman ipเพื่อดูว่า subcommand นี้มีรูปแบบip route { list | flush } SELECTOR... defaultและไม่ได้เป็นหนึ่งเดียวของตัวเลือกที่ถูกต้องที่ระบุไว้คือ ฉันรู้สึกว่าip route show table default ควรทำในสิ่งที่เราต้องการ แต่น่าเสียดายที่มันไม่ได้ ให้คนอื่นตรงกับจุดเริ่มต้นของบรรทัดด้วย (คุณได้รับคำเตือนแล้ว):ip route show | awk '/^default/{print $3}'
L0j1k

5
 ip route show default 0.0.0.0/0

คำสั่งนี้เร็วกว่ามากแล้วip route | grepเริ่มต้นบนระบบที่มีหลายเส้นทาง (10000+)

ค้นหาตัวอย่างจากเราเตอร์ที่มี BGP แบบเต็มและเส้นทางเริ่มต้นด้วยตนเองเป็นข้อมูลสำรอง

router:~# time ip route show default 0.0.0.0/0
default via XXX.XXX.192.254 dev eth0.123 

real    0m0.707s
router:~# time ip route | grep default
default via XXX.XXX.192.254 dev eth0.123 

real    0m8.596s
  • เพราะip route show default showเส้นทางทั้งหมดสำหรับฉันไม่เพียง แต่เส้นทางเริ่มต้นเท่านั้น
  • เพราะip route getไม่ยอมรับค่าเริ่มต้นหรือ0.0.0.0/0เป็นพารามิเตอร์

+1 สำหรับการสาธิตการกรองดั้งเดิมโดยตรงผ่านiproute2 ! มีจำนวนมากดังนั้นกรณีที่ชุดยูทิลิตี้ที่น่าตื่นตาตื่นใจนี้เป็นความถูกต้องและเชื่อถือได้และ performant กว่า (ความคิดสร้างสรรค์ที่ยอมรับ) มรดกลินุกซ์ textfu
RubyTuesdayDONO

1
นี่เป็นคำตอบที่ยอดเยี่ยม! แต่ฉันยังคงสับสนเล็กน้อยโดยเอกสารของ iproute2 "ค่าเริ่มต้น" ในคำสั่งหมายถึงอะไร หากฉันอ่านเอกสารอย่างถูกต้องคำสั่งนี้ควรเหมือนกับ "ip route แสดงเป็นค่าเริ่มต้น 0/0" ใช่ไหม? รูปแบบ "0/0" คืออะไร
user658991

3

ip route show defaultควรทำเคล็ดลับสำหรับเกตเวย์เริ่มต้นหรือคุณสามารถใช้ip route get <someip>เพื่อดูเส้นทางสำหรับที่อยู่ IP ที่เฉพาะเจาะจง


ฉันลองใช้เส้นทาง ip และแสดงรายการสำหรับเกตเวย์ทั้งหมด .. และใช่ค่าเริ่มต้นจะปรากฏที่ด้านล่าง ขอบคุณสำหรับสิ่งนั้น =) แต่เป้าหมายของฉันที่นี่คือการรับที่อยู่ IP ที่ใช้สำหรับเกตเวย์เริ่มต้นนั้น ใช้สคริปต์ทุบตีฉันจะ ping ที่หนึ่งเพื่อตรวจสอบว่ามันขึ้นหรือไม่
Suezy

ฉันได้รับสี่รายการสำหรับ "แสดงค่าเริ่มต้น" "ip route แสดงค่าเริ่มต้น | awk '/ default / {print $ 3}'" ควรให้คุณได้รับ IP address เพียงอย่างเดียว
David Pashley

2

หากคุณต้องการทำสิ่งนี้โดยใช้netstat(ดังนั้นมันจะทำงานกับบางสิ่งที่ไม่ใช่ Linux ) โซลูชันทั่วไปคือ:

netstat -rn | grep '^\(default\|0\.0\.0\.0\)' | awk '{print $2}'

สิ่งนี้แสดงตารางเส้นทางที่ใช้ IP แทนการแก้ไขชื่อโฮสต์ ( netstat -rn),
ค้นหาเกตเวย์เริ่มต้น (บรรทัดที่ขึ้นต้นด้วย0.0.0.0หรือdefault),
และพิมพ์โฮสต์เกตเวย์ (ฟิลด์ที่สองของผลลัพธ์)

การแพร่กระจายของ\ตัวละครในการแสดงออกปกติมีความสำคัญ:

  • \(และ\)ระบุกลุ่ม
  • \| คือตัวละครสำรอง (สิ่งที่อยู่ทางซ้ายหรือสิ่งที่อยู่ในการแข่งขันที่ถูกต้อง)
  • จุดในที่อยู่ IP จะถูกแทนด้วย\.- หมายถึงตัวอักษร.ที่ตรงข้ามกับนิพจน์ปกติ.(จับคู่อักขระเดี่ยวใด ๆ )

1
grep -eหรือegrepจะทำเคล็ดลับโดยไม่ต้องใช้วงเล็บและท่อที่จะหลบหนีegrep '^(default|0\.0\.0\.0)'
Mark K Cowan

1

นี่คือวิธีที่ฉันทำ:

#!/bin/sh
GATEWAY_DEFAULT=$(ip route list | sed -n -e "s/^default.*[[:space:]]\([[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\).*/\1/p")
echo ${GATEWAY_DEFAULT}

1
 ip route show default | grep default | awk {'print $3'}

ทำที่นี่


ทำไมgrep defaultเมื่อคุณระบุdefaultเส้นทางในipคำสั่งของคุณ
lindhe

0

วิธีที่ง่ายมาก ... ถามตารางการกำหนดเส้นทางว่าจะได้รับ IP นอกเครือข่ายของมันอย่างไร

Google DNS == 8.8.8.8

เส้นทาง ip ได้รับ 8.8.8.8


0
ip route show 0/0

หรือ

ip route show 0.0.0.0/0

หรือ

ip route show 0.0.0.0/0.0.0.0

หรือ

ip -f inet route show default

หรือ

ip -4 route show default
  • รุ่นที่ฉันทดสอบได้รับการปฏิบัติ 'ip แสดงเส้นทาง' และ 'รายการเส้นทาง ip' เป็นรายการเทียบเท่า (ไม่ใช่กรณีที่มี 'ip เส้นทางได้รับ')
  • มีคำอธิบายที่https://bugzilla.kernel.org/show_bug.cgi?id=197899

ถ้าฉันเข้าใจถูกต้องการค้นหาเกตเวย์เริ่มต้นสำหรับเส้นทางที่แน่นอนนั่นคือเส้นทาง all-zeros เป็น 0.0.0.0/0.0.0.0 (หรือ 0/0) สำหรับ IPv4 หรือ 0000: 0000: 0000: 0000: 0000: 0000 : 0000: 0000 (หรือ: :) สำหรับ IPv6

อย่างไรก็ตาม (!) โดยไม่ระบุ AF ที่คุณต้องการใช้ (-4 หรือ -6 หรือ -f inet หรือ -f inet6) หรือระบุเส้นทาง all-zeros เป็นคำนำหน้า IPv4 หรือ IPv6 (0/0 หมายถึง IPv4) ไม่สามารถทราบได้ว่า 'ค่าเริ่มต้น' คืออะไร ...

โดยส่วนตัวแล้วฉันไม่รู้สึกว่าหน้าคนมีความชัดเจนมากเกี่ยวกับเรื่องนี้ แต่นั่นเป็นเพียงสองเซ็นต์ของฉัน

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