Câu trả lời:
Một lớp lót:
nm-tool | grep -i gateway | xargs echo | cut -d' ' -f2
nm-tool | grep -i gateway | awk '{print $2}
netstat -nr | awk '$1 == "0.0.0.0"{print$2}'
arp -n | awk '{print $1}'
Lưu ý: chỉ hoạt động nếu máy của bạn là thiết bị duy nhất trên mạngip route show | grep -i 'default via'| awk '{print $3 }'
đầu ra: 192.168.0.1
cho tôi
LƯU Ý :
Đối với 15.04 và sau đó, không có nm-tool
, vì vậy sử dụng nmcli dev show <IFACE>
. Ví dụ,
$ nmcli dev show wlan7 | grep GATEWAY
IP4.GATEWAY: 192.168.0.1
IP6.GATEWAY:
Chỉnh sửa và thông tin bổ sung
Như bạn có thể thấy khi kiểm tra lệnh, chúng tôi lấy đầu ra nm-tool
(trong đó, ghi chú, lấy thông tin từ NetworkManager), tìm dòng chứa từ gateway
, in hơn thông tin có tiếng vang (cách nhau bởi khoảng trắng), và sau đó chỉ cắt bỏ mục thứ hai trong toàn bộ đầu ra. Lưu ý rằng nếu bạn có hai hoặc nhiều kết nối ở đó, bạn có thể cần xargs echo | cut -d' ' -f2
một phần loại bỏ hàng đầu và thay thế nó bằng awk '{print $2}'
; nói cách khác, toàn bộ dòng sẽ như thế này nm-tool | grep -i gateway | awk '{print $2}'
. Ngoài ra, bạn có thể đã sử dụng nm-tool | grep -oP '(?i)gateway:\s*\K\S+'
theo đề xuất của Avinash Raj trong các bình luận. Như bạn có thể thấy không có gì đặc biệt được thực hiện ở đây, và toàn bộ thử thách ở đây chỉ đơn thuần là một bài tập trong việc sử dụng các công cụ chỉnh sửa đầu ra như cắt, awk và grep.
Một phương pháp khác để có được thông tin cổng thông qua lệnh nmcli dev list
(có, vẫn dựa vào trình quản lý mạng). nmcli
là phiên bản dòng lệnh của trình quản lý mạng. Bạn có thể chạy nmcli dev list | grep -i routers
hoặc bạn có thể chạy nmcli dev list | grep -i 'gw ='
. Một lần nữa, bạn có thể thực hiện việc cắt tất cả các thông tin khác ngoại trừ địa chỉ IP mong muốn, nếu bạn muốn.
Vì trong câu hỏi ban đầu, đặc điểm kỹ thuật duy nhất là chỉ in cổng mặc định, tôi đang dựa vào đầu ra của công cụ nm ở đây. NetworkManager đi kèm với Ubuntu theo mặc định, đây là cách tiêu chuẩn để quản lý các kết nối mạng của Ubuntu. Nếu bạn sử dụng một cái gì đó khác, như wicd hoặc kết nối thông qua wpa_cli, công cụ nm sẽ không cung cấp cho bạn câu trả lời. Trong trường hợp như vậy, bạn có thể thấy câu trả lời của người khác dưới đây hữu ích hơn.
Một tùy chọn trung lập hơn và trung lập cấu hình sẽ được sử dụng netstat -n
, sử dụng bảng định tuyến kernel, tương tự như route -n
. Đó là đầu ra dưới đây, không có gì đáng ngạc nhiên.
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.255.0 U 9 0 0 wlan0
Và đây là cách để cắt bỏ thông tin mong muốn của bạn: netstat -nr | awk '$1 == "0.0.0.0"{print$2}'
Một số khác, trung tính là tốt: arp -n | awk '{print $1}'
eth0
và wlan0
cả hai được kết nối tích cực nhưng chỉ có một cổng được cấu hình wlan0
, nm-tool | grep -i gateway | xargs echo | cut -d' ' -f2
chỉ xuất ra 0.0.0.0
. nm-tool | grep -oP '(?i)gateway:\s*\K\S+'
đầu ra hai dòng: 0.0.0.0
theo sau 192.168.1.1
. (Cách thức ip route ...
và route -n ...
cách sản xuất chính xác 192.168.1.1
, mà tôi sẽ xem xét kết quả mong muốn nhất.)
network-manager
vd ifupdown
hoặc ifconfig
.. trong những trường hợp đó nm-tool
sẽ không tạo ra đầu ra mong muốn..trong khi đó, câu trả lời này chỉ dựa vào mạng được quản lý bởi network-manager
..
Bạn có thể tìm thấy nó theo nhiều cách
ip route show default
Một câu hỏi tốt hơn, những gì hoặc làm thế nào để bạn muốn định hình đầu ra?
ip route show | awk '/default/ {print $3}'
tracepath -m 1 8.8.8.8 | awk '/1:/ {print $2}' | uniq
Từ các bình luận - (cảm ơn bạn Avinash Raj 0
tracepath -m 1 8.8.8.8 | awk '/1:/ {print $2;exit}'
uniq
chỉ tracepath -m 1 8.8.8.8 | awk '/1:/ {print $2;exit}'
là 5in.
Như bạn thường sử dụng route -n
, bạn có thể thử sed
giải pháp này cùng với route -n
:
route -n | sed -nr 's/(0\.0\.0\.0) +([^ ]+) +\1.*/\2/p'
Đây là một bài kiểm tra:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
192.168.0.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
$ route -n | sed -nr 's/(0\.0\.0\.0) +([^ ]+) +\1.*/\2/p'
192.168.1.1
Một cách khác là sử dụng grep
:
$ route -n | tr -s ' ' | grep -Po "(?<=0\.0\.0\.0 )[^ ]+(?= 0\.0\.0\.0)"
192.168.1.1
Như @AvinashRaj đã chỉ ra điều này có thể được thực hiện bằng cách chỉ sử dụng grep
(không cần phải nén các khoảng trắng bằng cách sử dụng tr
):
route -n | grep -Po "0\.0\.0\.0\s*\K\S+(?=\s*0\.0\.0\.0)"
192.168.1.1
tr
, một mình grep sẽ thực hiện công việcroute -n | grep -Po "0\.0\.0\.0 \s*\K\S+(?=\s*0\.0\.0\.0)"
Tôi sử dụng cái này khá thường xuyên:
route -n | awk '{ print $2 }' | grep -Eo '[1-9]{0,3}\.[1-9]{0,3}\.[0-9]{0,3}\.[1-9]{0,3}'
192.168.0.1
gì?
Nếu bạn có quyền truy cập vào trình duyệt web trên hệ thống, bạn có thể truy cập http://whatsmyrouterip.com/ và nó sẽ có thể tìm thấy ip của bạn mà không cần bất kỳ lệnh nào.
Nếu không, chỉ cần mở thiết bị đầu cuối và làm một ip route | grep default
là đủ. Nó có thể cung cấp nhiều hơn một tùy thuộc vào giao diện mạng của bạn tho.
hostname -I
190.200.200.107 172.21.0.1 172.17.0.1 172.19.0.1 172.18.0.1
vì vậy chỉ nhận được vấn đề IP
hostname -I | cut -d' ' -f1
190.200.200.107
nm-tool | grep -oP '(?i)gateway:\s*\K\S+'