Cách sử dụng ifconfig để chỉ hiển thị giao diện hoạt động


22

Theo mặc định ifconfigsẽ hiển thị cho tôi tất cả các giao diện có sẵn, nhưng nếu tôi chỉ muốn hiển thị các giao diện activethì sao? Giống như, en0chỉ ở bên dưới.

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 14:10:9f:e0:eb:c9 
    inet6 fe80::1610:9fff:fee0:ebc9%en0 prefixlen 64 scopeid 0x4 
    inet X.X.X.X netmask 0xffffff00 broadcast 101.6.69.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    **status: active**
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 32:00:14:e7:4f:80 
    media: autoselect <full-duplex>
    **status: inactive**

Thông báo ifconfig en0sẽ không thỏa mãn, en0không phải lúc nào cũng là hoạt động;)

Tôi đang chạy Mac OS X.


2
Hệ điều hành của bạn sẽ là một cái gì đó quan trọng cần đề cập vì ifconfigviệc triển khai khác nhau. Ngoài ra, tại sao việc sử dụng ifconfiglà một yêu cầu? Mục tiêu cuối cùng của bạn là gì?
jordanm

Xin chào @jordanm, mục tiêu của tôi là có được địa chỉ IP của giao diện hiện đang hoạt động, thường là giao diện Ethernet không dây hoặc có dây.
qweruiop

Làm thế nào để bạn xác định giao diện hoạt động?
AnonymousLurker

Câu trả lời:


24

Để có được một mô tả đầy đủ về tất cả các dịch vụ đang hoạt động, hãy thử:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

Regex đơn giản này chỉ nên lọc ra các giao diện hoạt động và tất cả thông tin của chúng. Tôi yêu cầu bạn đặt bí danh cho điều này trong tệp ~ / .profile hoặc ~ / .bash_profile của bạn (có thể là ifactive?)

Để chỉ lấy tên giao diện (hữu ích cho tập lệnh), hãy sử dụng:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'

Bạn phải cài đặt pcregrep để làm việc này. Đó là trên macports trong gói pcre. Ngoài ra, điều này sẽ hoạt động với GNU grep bằng cách sử dụng grep -Pzothay vì pcregrep -M -onhưng với phần còn lại giống nhau, nhưng tôi chưa thử nghiệm điều này.


2

Nếu bạn chỉ muốn in mục nhập vào nếu có status: active, thì bạn có thể sử dụng một cái gì đó giống như chương trình awk này làm bộ lọc cho đầu ra ifconfig :

#!/usr/bin/awk -f
BEGIN            { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/     { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/            { buffer = buffer "\n" $0 }
END              { if(print_it) print buffer }

Khi mỗi mục nhập của điểm số bắt đầu (một dòng trống hoặc không bắt đầu bằng Tab), hãy bắt đầu lưu mục nhập trong bộ đệm. Nối vào bộ đệm này bất kỳ dòng tiếp theo nào bắt đầu bằng Tab. Theo dõi chuỗi ma thuật status: active; nếu một dòng như thế đã được nhìn thấy, hãy in ra bộ đệm (mục nhập trước đó trước đó) khi một mục nhập mới bắt đầu (hoặc đầu vào kết thúc).

Lưu văn bản chương trình trên trong một tệp và sử dụng nó như thế này:

ifconfig -a | awk -f /path/to/file

Hoặc, nếu bạn chmod +xlà tệp, thì bạn có thể đơn giản hóa nó một chút:

ifconfig -a | /path/to/file

2

Nếu bạn không bất lợi với một số tập lệnh bash, bạn có thể làm điều này:

for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done

Điều đó sẽ liệt kê ra các giao diện mạng đang hoạt động. Đã thử nghiệm trên Mac OS X 10.13.

Điều tuyệt vời là bạn không cần phải cài đặt bất cứ thứ gì. Chỉ cần chạy ở trên trong một Terminal.


Đây sẽ là câu trả lời tốt nhất, tuy nhiên ifconfig -lusẽ không hoạt động trên debian. Nhưng dù sao OP cũng đang sử dụng MacOS, vì vậy giải pháp này sẽ hoạt động trên các hệ thống có BSD ifconfig. Tôi đã đăng một câu trả lời khác bên dưới mà không cần sử dụngifconfig -lu
Rakib Fiha

1

Đọc bình luận và câu hỏi của bạn, có vẻ như bạn thực sự muốn nhận các giao diện có địa chỉ IP được gán cho chúng.

Bạn có thể làm điều này một cách nhanh chóng với ifconfiggrep.

Chạy lệnh:

ifconfig | grep 'Link\|inet'

Nên sản xuất một cái gì đó tương tự như:

eth0 Liên kết mã hóa: Ethernet HWaddr 00: 11: 22: 33: 44: 55
mã hóa liên kết eth1: Ethernet HWaddr 00: 11: 22: 33: 44: 66  
          inet addr: 192.168.0.8 Bcast: 192.168.0.255 Mặt nạ: 255.255.255.0
lo Liên kết mã hóa: Loopback cục bộ  
          inet addr: 127.0.0.1 Mặt nạ: 255.0.0.0

Điều này sẽ hiển thị mỗi dòng có tên giao diện và IP nếu chúng có.

Một số phép thuật REGEX cụ thể hơn có thể giúp bạn có được chính xác những gì bạn cần.


2
Cảm ơn nhưng activexem xét ở đâu?
qweruiop

nếu có một dòng sau giao diện, thì nó có một địa chỉ IP được gán cho nó, và theo ý tôi nói, bạn sẽ tạo thành 'hoạt động'.
Nathan McCoy

1

Tôi muốn câu hỏi rõ ràng hơn một chút. Giả sử rằng Active interface only, bạn chỉ hiển thị tên của các giao diện hoạt động (Trong trường hợp UPRUNNINGtrạng thái của tôi active) mà không có bất kỳ chi tiết nào khác. Sau đó thử điều này:

ifconfig | \
  grep "UP\|RUNNIG" \
  | awk '{print $1}' \
  | grep ':' \
  | tr -d ':' \
  | grep -v lo

Đầu ra sẽ như sau:

en0
en1
en2
bridge0
p2p0
awdl0
llw0
utun0
utun1
utun2
utun3
en6

Điều chỉnh grep -vtrường và thêm vào các giao diện không mong muốn hơn như loopback-> lovv, nếu cần.

Bây giờ, nếu bạn muốn và bạn sẽ cần kiểm tra xem các giao diện tìm thấy có hoạt động hay không. Sau đó, chúng ta chỉ có thể chuyển chúng thành một đối số ifconfig <interface>như hiển thị bên dưới:

[[ $(ifconfig en0 | grep -w active) ]] && echo "en0 is active"

Đơn giản hóa điều này hơn nữa và thực hiện nó trong một chức năng:

checkActiveInterfaces()
{
  local intARR=( $(ifconfig | \
      grep "UP\|RUNNIG" \
      | awk '{print $1}' \
      | grep ':' \
      | tr -d ':' \
      | grep -v lo) );
    intARR=( $(printf "%s\n" "${intARR[@]}" | sort -u) );
    for i in "${intARR[@]}"; do
      [[ $(ifconfig $i | grep -w active) ]] && {
       echo "$i"
    }
    done
}

Thực hiện chức năng này sẽ chỉ trả về các giao diện hoạt động. Trong trường hợp của tôi:

awdl0
en0
llw0

0

Sau đây sẽ chỉ in ra những giao diện được cấu hình để có IP

ifconfig | grep "inet.*broadcast"

0

Chỉ nhận MAC giao diện HOẠT ĐỘNG:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address

Lưu ý rằng MacOS không có ipmặc định; bạn cần HomeBrew cho điều đó, sau đó chạy brew install iproute2macmột lần. Mã nguồn của nó có tại github.com/brona/iproute2mac
Jeroen Wiert Pluimers

-1
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

Làm thế nào nó hoạt động:

  • ifconfig
  • Grep cho các dòng chứa "inet addr"
    • Những dòng này chứa IP.
  • Grep cho các dòng không chứa "127.0.0.1"
    • Chúng tôi thường không quan tâm đến localhost.
    • -v bị đảo ngược grep
  • Từ các dòng còn lại, xóa "Bcast"
  • Cắt trường 2 bằng cách sử dụng ":" làm dấu phân cách
    • In câu trả lời.

-1
ifconfig en0 | grep status

Điều này sẽ hiển thị trạng thái của kết nối ethernet en0

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.