Chỉ liệt kê tên thiết bị của tất cả các giao diện mạng có sẵn


21

Tôi muốn nhận danh sách tất cả các Tên thiết bị mạng có sẵn trên máy chủ Linux của mình. tôi nhận ra rằng

ifconfig

sẽ thực hiện công việc, tuy nhiên ifconfig tạo ra khá nhiều đầu ra:

eth0      Link encap:Ethernet  Hardware Adresse 08:00:27:fc:5c:98  
          inet Adresse:192.168.2.222  Bcast:192.168.2.255  Maske:255.255.255.0
          inet6-Adresse: fe80::a00:27ff:fefc:5c98/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
          RX packets:329 errors:0 dropped:0 overruns:0 frame:0
          TX packets:177 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:41496 (40.5 KiB)  TX bytes:32503 (31.7 KiB)

eth1      Link encap:Ethernet  Hardware Adresse 08:00:27:e9:35:7d  
          [...]

eth2      Link encap:Ethernet  Hardware Adresse 08:00:27:ff:db:fe  
          [...]

lo        Link encap:Lokale Schleife  
          [...]

Những gì tôi muốn đạt được là một danh sách như

eth0
eth1
eth2
lo

hoặc thậm chí tốt hơn chỉ

eth0
eth1
eth2

Tôi giả định rằng điều này có thể được thực hiện bằng sự kết hợp giữa "cat", "sed" và "grep", nhưng tôi đơn giản là không có manh mối nào về cách loại bỏ thông tin không cần thiết.

Câu trả lời:


17

Hãy thử xem:

ifconfig -a | sed 's/[ \t].*//;/^$/d'

Điều này sẽ bỏ qua lo:

ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d'

Cảm ơn dennis, điều này làm việc như một bùa mê ^^. Hoàn hảo. Biểu thức chính quy thực sự là một cái gì đó tôi nên xem xét ^^
ftiaronsem

Tôi nhận ra rằng Linux và BSD thường chứa các *nixtiện ích khác nhau , nhưng thật không may là giải pháp này không hoạt động trên máy Mac :(
blong

ifconfigđược sử dụng ipthay thế , sử dụng thay thế
pstanton

Điều này dường như hoạt động cho OS X:ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
Tạm dừng cho đến khi có thông báo mới.

22

Một cách khác là:

ip -o link show | awk -F': ' '{print $2}'

Hoặc có thể:

ls /sys/class/net

sử dụng ls /sys/class/netlà một giải pháp tốt hơn trong /etc/local.dcác tập lệnh trong openrc- các sedgiải pháp ở trên kết thúc với phần bổ sung :ở cuối mỗi giao diện khi chạy từ /etc/init.d/local(nhưng không phải khi tập lệnh được chạy trực tiếp).
Stuart Cardall

+1 cho -o- không biết điều đó
Patryk

16

Chỉ cần sử dụng / sys / class / net và loại bỏ đường dẫn:

$ basename -a /sys/class/net/*
eth0
eth1
lo
ppp0
tun0

6

Thử đi:

ifconfig | cut -c 1-8 | sort | uniq -u
  • cut -c 1-8 trích xuất 8 ký tự đầu tiên của mỗi dòng
  • sort sắp xếp các dòng
  • uniq -u chỉ in các dòng duy nhất sẽ xóa các dòng trống cho các dòng mô tả chỉ có khoảng trắng trong tám ký tự đầu tiên của chúng

Điều này hoạt động trên hai máy linux tôi đã thử, nhưng trên MacBookPro của tôi (OS X 10.6.4), ifconfigsử dụng các tab thay vì khoảng trắng, vì vậy nó phức tạp hơn một chút:

ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
  • expand chuyển đổi các tab thành không gian
  • awk -F: '{print $1;}' in trường đầu tiên trước dấu hai chấm.

Cảm ơn bạn rất nhiều, đặc biệt là câu trả lời rất chi tiết giải thích các tham số được sử dụng. Nếu tôi sẽ có một vấn đề tương tự trong tương lai, tôi biết bài nào sẽ xem xét ;-). Thật không may là nó không cắt "lo", vì vậy câu trả lời được chấp nhận thuộc về dennis. Nhưng đây thực sự là một câu trả lời rất hữu ích, cảm ơn bạn :-)
ftiaronsem

thêm | grep -v lo:-)
Doug Harris

4
ls /sys/class/net/
eth0  eth1  eth2  lo

hoặc nếu bạn chỉ cần eth *

ls /sys/class/net/eth*
eth0
eth1
eth2

3

Sử dụng /syshệ thống tập tin:

basename -a $(ls /sys/devices/**/net/* -d)

Sử dụng ip và Perl:

ip -o l|perl -lane'$F[1]=~s/://g;print $F[1]'

1

Đây là một cách để trích xuất tên giao diện từ ifconfigđầu ra:

ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p'

Nếu bạn muốn loại trừ một số tên nhất định, một cách là lọc thêm grep:

ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo

Nếu bạn muốn loại trừ nhiều tên hơn, hãy thêm nhiều hơn -e foovào greplệnh.


Giải pháp của bạn hoạt động tốt như của Dennis. Thật không may tôi không thể chấp nhận hai bài viết, vì vậy dennis đơn giản là nhanh hơn. Nhưng cảm ơn tuy nhiên, đặc biệt là cho lời giải thích grep của bạn.
ftiaronsem

1

chỉ in cột đầu tiên:

netstat -a | awk '{print $1}'

bạn có thể kết hợp các quy tắc khác trong awk để thêm hoặc xóa các mục nếu cần.

EDIT: tương tự với ifconfig (như Doug đã chỉ ra)

ifconfig | awk '{print $1}'

Đây là một ví dụ không bao gồm giao diện 'lo'

ifconfig | awk '{if ($1 != lo) print $1}'

Điều đó sẽ không làm việc. awksẽ bỏ qua khoảng trắng hàng đầu và cũng in từ đầu tiên trong mỗi dòng tiếp theo.
Doug Harris

Thật không may, điều đó thực sự không hiệu quả, chịu đựng vấn đề chính xác mà Doug đã chỉ ra. Nhưng cảm ơn vì sự giúp đỡ của bạn, tuy nhiên tôi thực sự đánh giá cao việc bạn giúp đỡ một người mới như tôi.
ftiaronsem

1
/usr/sbin/ip addr show | awk '/^[1-9]/ {print $2}'

cung cấp

lo:
eth0:
eth1:
eth2:

như đầu ra


1

Mặc dù tồn tại một giải pháp được chấp nhận, tôi muốn trình bày giải pháp của mình cho vấn đề này.

Tôi có một loạt các giao diện ảo, và muốn có một danh sách, có thể sử dụng trong các tập lệnh bash khác nhau.

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.137  netmask 255.255.255.192  broadcast 11.22.33.191
        inet6 fe80::a00:27ff:fe8c:6bd3  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)
        RX packets 2969136  bytes 2394432908 (2.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1378821  bytes 358960701 (342.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.189  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.190  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

eth0:3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.180  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 673768  bytes 277972236 (265.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 673768  bytes 277972236 (265.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Tôi không quan tâm đến loopback, vì tôi biết nó ở đó :)

Điều này một lót được thực hiện công việc:

ifconfig | egrep '^eth' | cut -f 1-2 -d ':' | cut -f 1 -d ' '| pcregrep -o1 "(((eth\d)(:\d))|(eth\d))"

Tạo ra một đầu ra như:

eth0
eth0:1
eth0:2
eth0:3

Thưởng thức.


1

Tất cả các giải pháp trên hoạt động tốt. Vẫn là bạn có thể thử cái này

ifconfig | grep HW | cut -c 1-6

Vì, lođó là loopback, không được gán Địa chỉ CTNH, nên nó sẽ không hiển thị.

Đầu ra -

root @ glum: / home / amit # ifconfig | grep CTNH | cắt -c 1-6
enp7s0
vmnet1
vmnet8
wlp6s0

1

Giải pháp đơn giản nhất là trong man ifconfig (8)

man ifconfig (8) giải nén http://www.manpagez.com/man/8/ifconfig/ :

Cờ -l có thể được sử dụng để liệt kê tất cả các giao diện có sẵn trên hệ thống, không có thông tin bổ sung nào khác. Việc sử dụng cờ này là loại trừ lẫn nhau với tất cả các cờ và lệnh khác, ngoại trừ -d (chỉ liệt kê các giao diện bị hỏng) và -u (chỉ liệt kê các giao diện được bật lên).

Vì vậy, để có danh sách, hãy sử dụng:

ifconfig -l

Các tên sẽ được phân tách bằng một khoảng trắng, do đó bạn phải sử dụng sed để thay thế các khoảng trắng này bằng một \ n:

ifconfig -l | sed 's/ / /g'


1

Cải thiện:

netstat -i | grep '^[a-z]' | awk '{print $1}' | grep -v 'lo'

1
Bạn có lẽ nên làm điều đó grep -v '^lo$'; lệnh hiện tại của bạn sẽ loại trừ (ví dụ giả định) logicalridiculousgiao diện.
Scott

0

Không có giải pháp nào ở trên làm việc cho tôi, đây là giải pháp của tôi:

ifconfig -a  | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
  1. Liệt kê tất cả các giao diện có sẵn
  2. Chỉ trích xuất các dòng có chứa tên thiết bị (không có khoảng trắng ở đầu)
  3. Xóa phần dấu không liên quan nằm sau khoảng trắng đầu tiên
  4. Không bao gồm logiao diện

Đầu ra:

eth0
eth0:1
wlan0

0

"Ifcongif -l" nên thực hiện công việc. đầu ra của nó giống như "lo0 gif0 stf0 en0 ..." không có dòng mới.

Tôi tìm thấy nó trên một số trang web nhưng tôi không thể tìm thấy nó nữa. và tôi vẫn đang tìm kiếm ý nghĩa của lá cờ "-l" đó.


0

Đôi khi nettools không được cài đặt theo mặc định. Vì vậy, tôi thích sử dụng các lệnh dựng sẵn có nhiều bảo đảm hơn trong / bin, / usr / bin và / usr / sbin mà không phải lo lắng về các gói được cài đặt.

ip addr: hiển thị / thao tác định tuyến, thiết bị, định tuyến chính sách và đường hầm (địa chỉ)
grep: tìm khoảng trắng sau bất kỳ thứ gì sau unitl:
cut: use (:) làm dấu phân cách và lấy trường 2
tr: xóa bất kỳ khoảng trắng nào

$ ip addr | grep -E ': \ s. *?:' | cắt -d ":" -f 2 | tr -d ""

0

Đã thử nghiệm trên macOS, sau đây đã làm việc. Tôi cần tìm tất cả các giao diện đã TĂNG. Điều này dựa trên câu trả lời từ Dennis Williamson ở trên.

ifconfig -a | grep UP | sed 's/:.*//;/^$/d'


-1

ifconfig | grep flags | awk -F: '{print $1;}'


1
Bạn có thể vui lòng mở rộng kết thúc giải thích điều này không? Câu trả lời một dòng thường không phải là một định dạng tốt cho Superuser.
Doktoro Reichard
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.