Bagaimana cara mengetahui antarmuka mana yang saya gunakan untuk menghubungkan ke internet?

48

Saya memiliki eth0 dan wlan0 sesuai dengan ifconfig dan saya bisa ping google.com. Bagaimana saya bisa mengetahui (dengan pengguna normal, bukan root) antarmuka apa yang aktif , seperti apa, antarmuka apa yang ping (atau apa pun, ping tidak wajib) gunakan?

CATATAN: menggunakan Ubuntu 11.04 atau Fedora 14

LanceBaynes
sumber
2
Solusi di bawah ini sepertinya ingin Anda membuat kesimpulan sendiri, yang sepertinya tidak benar. (Dan tabel perutean semua orang terlihat sangat mudah!) Sementara saya mencari yang setara dengan Windows, tampaknya "ip route get <ip-address>" akan memberi tahu Anda antarmuka mana yang akan digunakan jika Anda ingin mencoba menyambung ke diberi alamat ip.
mwardm
Terkait pada Kesalahan Server: Temukan antarmuka untuk rute ke host tertentu (yang saya cari ketika saya selesai di sini).
Wildcard

Jawaban:

48

Anda dapat menggunakan routeuntuk menemukan rute default Anda:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     1      0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

The Ifacekolom dalam baris dengan tujuan defaultmemberitahu Anda yang antarmuka digunakan.

Pekerjaan
sumber
1
@ Job jika kita memiliki alamat IP bagaimana kita dapat menemukan antarmuka yang digunakannya.
Bionix1441
1
Ini seharusnya bukan jawaban yang diterima. Jika iproute telah digunakan untuk menetapkan aturan perutean kustom routetidak dapat digunakan. @Torgeir punya jawaban yang bagus.
Joseph Garrone
1
Jawaban ini tidak benar. Misalnya (dan diberi rute yang sama yang ditampilkan dalam jawaban), jika Anda melakukan ping 192.168.1.16 (pc di jaringan lokal Anda), entri yang dimulai dengan 192.168.1.0...adalah rute yang akan digunakan. Tentu saja dalam kasus ini mengacu pada Iface yang sama, tetapi itu hanya karena Anda memiliki satu antarmuka pada mesin Anda.
kdehairy
1
@ Pekerjaan Bahkan dengan google.com, jika Anda memiliki dua rute masing-masing pada antarmuka yang berbeda, pertandingan dengan topeng yang lebih panjang akan dipilih (belum tentu default). Apa artinya default, adalah bahwa jika tidak ada rute lain yang ditemukan, mari kita berkonsultasi yang satu ini :)
kdehairy
1
Saya mendapatkan baris "default ... eth0" dan baris "default ... wlan0". Jadi yang mana yang merupakan default sebenarnya?
AstroFloyd
26

Versi saya yang pada dasarnya berdasarkan ini dan ini :

route | grep '^default' | grep -o '[^ ]*$'

Dan ini, secara eksperimental , untuk macOS:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'
Ebrahim Byagowi
sumber
1
apakah ada cara bagi Anda untuk menerjemahkan ini untuk OSX?
John Allard
1
@ JohnAllard: beri tahu saya jika pembaruan saya sekarang memberikan jawaban yang benar untuk macOS.
Ebrahim Byagowi
Anda tidak memerlukan banyak pipa, cukup gunakanroute |awk '/^default/{print $NF}'
P ....
Saya mendapatkan dua baris: "eth0" dan "wlan0", jadi saya masih tidak tahu yang mana yang aktif ...
AstroFloyd
9

Pada sistem GNU / Linux:

#!/bin/sh

# host we want to "reach"
host=google.com

# get the ip of that host (works with dns and /etc/hosts. In case we get  
# multiple IP addresses, we just want one of them
host_ip=$(getent ahosts "$host" | awk '{print $1; exit}')

# only list the interface used to reach a specific host/IP. We only want the part
# between dev and src (use grep for that)
ip route get "$host_ip" | grep -Po '(?<=(dev )).*(?= src| proto)'
Torgeir
sumber
1
Tolong jelaskan apa yang dilakukan perintah-perintah ini. Juga, Anda mungkin cukup aman di sini, karena Anda tahu apa nilai-nilai Anda, tetapi, umumnya, Anda harus mengutip referensi variabel shell (kecuali Anda memiliki alasan yang baik untuk tidak melakukannya, dan Anda yakin Anda tahu apa yang Anda lakukan ).
G-Man Mengatakan 'Reinstate Monica'
1
Selesai, sampai batas tertentu. Hanya memposting ini karena saya tidak dapat menemukan apa pun yang melakukan ini. Saya menggunakan ini sebagai fakta khusus dalam manifes boneka ...
Torgeir
Jawaban Anda lebih tepat jika hostargumen input ke skrip. Karena rute (dan karenanya antarmuka) mungkin berbeda untuk ips yang berbeda.
kdehairy
6

Menjalankan ifconfigakan memberi Anda informasi yang Anda butuhkan.

Antarmuka aktif akan memiliki inet addrdan akan menampilkan catatan data yang dikirimkan, seperti:

RX bytes:1930741 (1.8 Mb)  TX bytes:204768 (199.9 Kb)

Anda juga dapat menggunakan ip addrperintah dan setiap interface tidak aktif akan ditunjuk sebagai memiliki: NO-CARRIER.

jasonwryan
sumber
Karena OP tidak ingin menjadi root, mungkin Anda harus memberikan path lengkap ke executable?
tshepang
Tidak ada perintah yang membutuhkan hak yang lebih tinggi.
jasonwryan
1
Ubuntu dan Arch: keduanya berjalan dengan privilege normal (meskipun pada Ubuntu itu / sbin)
jasonwryan
1
@ Shadur Bukan pada instal Ubuntu 10.10 saya dan menurut help.ubuntu.com/community/EnvironmentVariables default $ PATH adalah/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
jasonwryan
2
Ini tidak akan selalu membantu pada sistem dengan banyak antarmuka, seperti yang ditunjukkan oleh poster. Jawaban yang lebih baik adalah menggunakan routeperintah meskipun itu tidak selalu mudah karena routing. Rute default tidak harus menjadi yang menuju ke Internet meskipun mungkin sering.
user1801810
6

Satu liner:

ip route get 8.8.8.8 | sed -n 's/.*dev \([^\ ]*\) table.*/\1/p'

h0tw1r3
sumber
Ada kutipan yang menggantung di sana.
Sama
@Krease Author memperbarui jawabannya
Vadim Kotov
5

Dapatkan antarmuka jaringan default yang biasanya digunakan untuk merutekan ke internet "yang tersisa" berlawanan dengan DMZ, jaringan pribadi, host VM, dll. Yang biasanya dirutekan secara eksplisit.

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0
EugeneP
sumber
tidak selalu rute default yang membawa Anda ke tempat yang Anda inginkan. Meskipun OP paling mungkin menggunakan rute default untuk sampai ke internet, ini adalah generalisasi dan mungkin tidak selalu benar. Sepatah kata hati
MelBurslan
Tentu, itu hanya antarmuka jaringan standar. Jika ada banyak koneksi, orang tidak seharusnya berbicara tentang "menghubungkan ke internet", tetapi lebih pada antarmuka jaringan yang digunakan untuk routing ke tujuan yang tepat.
EugeneP
Anda tidak perlu menggunakan beberapa pipa / greps,ip -4 route ls |awk '/^default/{print $5}'
P ....
2

Perintah ip route lsakan memberikan daftar rute aktif dan sumbernya:

caleburn: ~/ >ip route ls
192.168.10.0/24 dev eth0  proto kernel  scope link  src 192.168.10.7 
default via 192.168.10.254 dev eth0 
Shadur
sumber
1

Gunakan perintah:

[root@linux1 network-scripts]# route|grep default | awk '{print $8}'
enp0s3
Larry Catt
sumber
[root-linux1 network-scripts] # ​​route | grep default | awk '{print $ 8}' enp0s3 [root @ linux1 network-scripts] #
Larry Catt
0

Jika mesin Anda memiliki beberapa antarmuka (yang saya asumsikan), tidak ada satu antarmuka pun yang akan digunakan untuk menghubungkan ke internet.

Bergantung pada tujuan yang Anda hubungkan, sistem Anda akan berkonsultasi dengan tabel ip (yang ditunjukkan saat Anda melakukan routeperintah) untuk menemukan harapan / router berikutnya, ketika ia menemukannya, ia akan menggunakan antarmuka yang terkait dengannya.

Yang mengatakan, silakan merujuk ke jawaban @ torgeir karena tidak persis seperti itu:

  1. Diberi domain (hardcoded sebagai google.com, yang merupakan satu-satunya titik buruk dalam jawabannya)
  2. Mengatasi itu ip
  3. Konsultasikan tabel ip untuk rute yang akan digunakan (dan karenanya antarmuka).
kdehairy
sumber