Bagaimana cara mendapatkan gateway default di LINUX yang diberikan tujuannya?


11

Saya mencoba untuk mendapatkan gateway default, menggunakan tujuan 0.0.0.0

saya menggunakan perintah ini: netstat -rn | grep 0.0.0.0

dan mengembalikan daftar ini:

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

Tujuan saya di sini adalah melakukan ping ke gateway default menggunakan tujuan 0.0.0.0; dengan demikian, itu adalah "133.88.31.70"; tetapi yang ini mengembalikan daftar karena menggunakan 'grep'.

Pertanyaannya adalah: Bagaimana cara saya mendapatkan gateway default saja? Saya akan membutuhkannya untuk skrip bash saya untuk mengidentifikasi apakah koneksi internet sudah aktif atau tidak.

Jawaban:


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

Ini harus menyelesaikan masalah Anda.


@Suezy Ha! Lihat? awk!
Jeremy Powell

tutup single-quote / close bracket tidak cocok pada akhirnya saya pikir - bekerja dengan baik sebaliknya!
Mark K Cowan

3
Saya telah melihat beberapa jawaban online dengan perintah ini, tetapi tidak satupun dari mereka menjelaskan mengapa "show default" digunakan. Sebenarnya "ip route show" tanpa parameter apa pun melakukan hal yang persis sama untuk saya. Jadi pertanyaan saya adalah mengapa ada "default" dalam perintah? Apa artinya?
user658991

@ user658991 Saya sudah ke lubang kelinci ini dan Anda benar. Itu tidak melakukan apa - apa pada versi paling umum di ipluar sana. Sebenarnya ip route showadalah alias untuk ip route listdan Anda dapat memeriksa man ipuntuk melihat bahwa sub-perintah ini memiliki sintaksis ip route { list | flush } SELECTOR... Dan tidak satu pun dari pemilih yang valid yang terdaftar adalah default. Saya merasa seperti ip route show table default harus melakukan apa yang kita inginkan, tetapi sayangnya, tidak. Bagi orang lain, cocokkan juga dengan awal kalimat (Anda telah diperingatkan):ip route show | awk '/^default/{print $3}'
L0j1k

5
 ip route show default 0.0.0.0/0

Perintah ini jauh lebih cepat daripada ip route | grepdefault pada sistem dengan banyak (10.000+) rute

Lihat misalnya dari router saya dengan BGP lengkap dan rute default manual sebagai cadangan

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
  • karena ip route show default showsemua rute untuk saya bukan hanya rute standar
  • karena ip route gettidak menerima default atau 0.0.0.0/0 sebagai parameter

+1 untuk mendemonstrasikan penyaringan asli langsung melalui iproute2 ! ada begitu banyak kasus di mana paket utilitas yang luar biasa ini lebih akurat, dapat diandalkan, dan berkinerja daripada (diakui kreatif) Linux textfu lama
RubyTuesdayDONO

1
Ini jawaban yang bagus! tetapi saya masih sedikit bingung dengan dokumentasi iproute2. Apa yang ditandakan oleh "default" pada perintah? Jika saya membaca dokumen dengan benar, perintah ini harus sama dengan "ip route show to default 0/0", apakah saya benar? apa format "0/0"?
user658991

3

ip route show defaultharus melakukan trik untuk gateway default, atau Anda dapat menggunakan ip route get <someip>untuk melihat apa rute untuk alamat IP tertentu.


Saya mencoba ip route dan menampilkan daftar untuk semua gateway .. dan ya, default juga ditampilkan di bagian bawah. Terima kasih untuk itu. =) Tapi tujuan saya di sini adalah untuk mendapatkan alamat IP yang digunakan untuk gateway default itu. Menggunakan skrip bash, saya akan ping yang itu untuk memeriksa apakah sudah habis atau belum.
Suezy

Saya mendapatkan empat entri untuk "show default". "ip route show default | awk '/ default / {print $ 3}'" akan membuat Anda mendapatkan alamat IP sendiri.
David Pashley

2

Jika Anda ingin melakukan ini menggunakan netstat(jadi itu akan bekerja pada sesuatu yang BUKAN Linux ) solusi umum adalah:

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

Ini menunjukkan tabel routing, menggunakan IP daripada menyelesaikan nama host ( netstat -rn),
mencari gateway default (baris dimulai dengan 0.0.0.0atau default),
dan mencetak host gateway (bidang kedua hasil).

Proliferasi \karakter dalam ekspresi reguler adalah signifikan:

  • \(dan \)tentukan grup
  • \| adalah karakter pergantian (hal di kiri atau yang di kanan cocok)
  • titik-titik dalam alamat IP diwakili oleh \.- artinya karakter literal .sebagai lawan dari Ekspresi Reguler .(cocok dengan setiap karakter tunggal)

1
grep -eatau egrepakan melakukan triknya tanpa perlu tanda kurung dan pipa untuk bisa lolosegrep '^(default|0\.0\.0\.0)'
Mark K Cowan

1

Beginilah cara saya melakukannya:

#!/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'}

Apakah di sini


Mengapa grep defaultketika Anda sudah menentukan defaultrute dalam ipperintah Anda ?
lindhe

0

Cara yang SANGAT mudah ... tanyakan tabel routing bagaimana cara mendapatkan IP di luar jaringannya

Google DNS == 8.8.8.8

ip route dapatkan 8.8.8.8


0
ip route show 0/0

atau

ip route show 0.0.0.0/0

atau

ip route show 0.0.0.0/0.0.0.0

atau

ip -f inet route show default

atau

ip -4 route show default

Jika saya memahaminya dengan benar, pencarian gateway default untuk rute yang tepat itu - rute semua-nol - adalah 0.0.0.0/0.0.0.0 (atau 0/0) untuk IPv4 atau 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0000 : 0000: 0000 (atau: :) untuk IPv6.

Namun (!), Tanpa menentukan AF yang ingin Anda gunakan (-4 atau -6 atau -f inet atau -f inet6), atau menentukan rute semua-nol sebagai awalan IPv4 atau IPv6 (0/0 menyiratkan IPv4) , tidak dapat mengetahui apa 'default' itu ...

Secara pribadi, saya tidak merasa halaman manual sangat jelas tentang ini, tapi itu hanya dua sen saya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.