Làm thế nào để tìm ra giao diện nào tôi đang sử dụng để kết nối với internet?


47

Tôi có eth0 và wlan0 theo ifconfig và tôi có thể ping google.com. Làm cách nào tôi có thể tìm ra (với một người dùng bình thường, không phải root) giao diện nào đang hoạt động , như trong, giao diện nào đã sử dụng ping (hoặc bất cứ điều gì, ping không bắt buộc)?

LƯU Ý: sử dụng Ubuntu 11.04 hoặc Fedora 14


2
Các giải pháp dưới đây dường như muốn bạn tự suy luận, điều đó có vẻ không đúng. (Và các bảng định tuyến của mọi người trông cực kỳ đơn giản!) Trong khi tôi đang tìm kiếm Windows tương đương, có vẻ như "ip route get <ip-address>" sẽ cho bạn biết giao diện nào sẽ được sử dụng nếu bạn cố gắng kết nối với địa chỉ IP đã cho.
mwardm

Liên quan đến Lỗi máy chủ: Tìm giao diện để định tuyến đến máy chủ lưu trữ cụ thể (đó là những gì tôi đang tìm kiếm khi tôi truy cập vào đây).
tự đại diện

Câu trả lời:


48

Bạn có thể sử dụng routeđể tìm tuyến đường mặc định của mình:

$ 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

Các Ifacecột trong phù hợp với điểm đến defaultcho bạn biết giao diện được sử dụng.


1
@Job trong trường hợp chúng tôi có địa chỉ IP, làm thế nào chúng tôi có thể tìm thấy giao diện mà nó sử dụng.
Bionix1441

1
Đây không phải là câu trả lời được chấp nhận. Nếu iproute đã được sử dụng để xác định quy tắc định tuyến tùy chỉnh routekhông thể được sử dụng. @Torgeir có câu trả lời đúng.
Joseph Garrone

1
Câu trả lời này không đúng. Ví dụ (và được cung cấp cùng một tuyến đường được hiển thị trong câu trả lời), nếu bạn ping 192.168.1.16 (một máy tính trên mạng cục bộ của bạn), mục nhập bắt đầu bằng 192.168.1.0...là tuyến đường sẽ được sử dụng. Tất nhiên trong trường hợp này, nó đề cập đến cùng một Iface, nhưng đó chỉ là vì bạn có một giao diện trên máy của mình.
kdeh Hộ

1
@Job Ngay cả với google.com, nếu bạn có hai tuyến trên mỗi giao diện khác nhau, trận đấu với mặt nạ dài hơn sẽ được chọn (không nhất thiết phải là mặc định). Tất cả những gì có nghĩa là mặc định, là nếu không tìm thấy tuyến đường nào khác, hãy tham khảo ý kiến ​​này :)
kdehurine

1
Tôi nhận được một dòng "mặc định ... eth0" và một dòng "mặc định ... wlan0". Vì vậy, cái nào là mặc định thực sự?
AstroFloyd

25

Phiên bản của tôi về cơ bản dựa trên cái nàycái này :

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

Và điều này, về mặt thực nghiệm , cho macOS:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'

1
Có cách nào để bạn dịch cái này cho OSX không?
John Allard

1
@JohnAllard: cho tôi biết nếu bản cập nhật của tôi bây giờ đưa ra câu trả lời chính xác cho macOS.
Ebrahim Byagowi

bạn không cần nhiều đường ống, chỉ cần sử dụngroute |awk '/^default/{print $NF}'
P ....

Tôi nhận được hai dòng: "eth0" và "wlan0", vì vậy tôi vẫn không biết cái nào đang hoạt động ...
AstroFloyd

9

Trên các hệ thống 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)'

1
Hãy giải thích những gì các lệnh này đang làm. Ngoài ra, có lẽ bạn khá an toàn ở đây, vì bạn biết giá trị của mình là gì, nhưng nói chung, bạn nên trích dẫn các tham chiếu biến shell (trừ khi bạn có lý do chính đáng để không và bạn chắc chắn bạn biết bạn đang làm gì ).
G-Man nói 'Phục hồi Monica'

1
Xong, đến một mức độ nào đó. Chỉ đăng bài này vì tôi không thể tìm thấy bất cứ điều gì đã làm chính xác điều này. Đang sử dụng điều này như một thực tế tùy chỉnh trong một bản kê khai con rối ...
Torgeir

Câu trả lời của bạn sẽ đúng hơn nếu hostlà một đối số đầu vào cho tập lệnh. Vì tuyến đường (và do đó giao diện) có thể khác nhau đối với các ips khác nhau.
kdehurine

6

Chạy ifconfigsẽ cung cấp cho bạn thông tin bạn cần.

Giao diện hoạt động sẽ có inet addrvà sẽ hiển thị bản ghi dữ liệu được truyền, như vậy:

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

Bạn cũng có thể sử dụng ip addrlệnh và mọi giao diện không hoạt động sẽ được chỉ định là có : NO-CARRIER.


Vì OP không muốn root, có lẽ bạn nên cung cấp đường dẫn đầy đủ cho tệp thực thi?
tshepang

Không lệnh nào yêu cầu đặc quyền nâng cao.
jasonwryan

1
Ubuntu và Arch: cả hai đều chạy với các đặc quyền bình thường (mặc dù trên Ubuntu là / sbin)
jasonwryan

1
@Shadur Không phải ngày của tôi cài đặt của Ubuntu 10.10 và theo help.ubuntu.com/community/EnvironmentVariables mặc định $ PATH là/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
jasonwryan

2
Điều này sẽ không nhất thiết phải giúp đỡ trên một hệ thống có nhiều giao diện, như người đăng đã chỉ ra. Một câu trả lời tốt hơn là sử dụng routelệnh mặc dù điều đó không nhất thiết phải được bảo vệ do định tuyến. Tuyến mặc định không phải là tuyến để truy cập Internet mặc dù có thể thường xuyên như vậy.
dùng1801810

6

Lót:

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


Có một trích dẫn lơ lửng ở đó. Không hoạt động như hiện tại
Giảm

@Kreas Tác giả đã cập nhật câu trả lời của mình
Vadim Kotov

5

Nhận giao diện mạng mặc định thường được sử dụng để định tuyến tới internet "còn lại" đối diện với DMZ, mạng riêng, máy chủ VM, v.v. thường được định tuyến rõ ràng.

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0

nó không phải luôn luôn là tuyến đường mặc định đưa bạn đến nơi bạn muốn. Mặc dù OP có lẽ đang sử dụng tuyến đường mặc định để truy cập internet, đây là một sự khái quát hóa và có thể không phải lúc nào cũng đúng. Một lời cảnh báo
MelBurslan

Chắc chắn, nó chỉ là giao diện mạng mặc định. Nếu có nhiều kết nối, người ta không nên thực sự nói về "kết nối với internet", mà là về giao diện mạng được sử dụng để định tuyến đến đích chính xác.
EugeneP

Bạn không cần sử dụng nhiều ống / greps,ip -4 route ls |awk '/^default/{print $5}'
P ....

2

Lệnh ip route lssẽ đưa ra một danh sách các tuyến đang hoạt động và các nguồn của chúng:

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 

1

Sử dụng lệnh:

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

[root @ linux1 tập lệnh mạng] # route | grep default | awk '{print $ 8}' enp0s3 [root @ linux1 network-scripts] #
Larry Catt


0

Nếu máy của bạn có nhiều giao diện (mà tôi giả sử), sẽ không có giao diện nào được sử dụng để kết nối với internet.

Tùy thuộc vào điểm đến mà bạn đang kết nối, hệ thống của bạn sẽ tham khảo bảng ip (lệnh được hiển thị khi bạn thực hiện routelệnh) để tìm hy vọng / bộ định tuyến tiếp theo, khi tìm thấy, nó sẽ sử dụng giao diện được liên kết với nó.

Điều đó nói rằng, vui lòng tham khảo câu trả lời của @ torgeir vì nó thực hiện chính xác điều đó:

  1. Đưa ra một tên miền (được mã hóa cứng như google.com, đó là điểm xấu duy nhất trong câu trả lời)
  2. Giải quyết ip của nó
  3. Liên kết bảng ip cho tuyến đường để sử dụng (và do đó giao diện).
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.