2013-07-23 31 views
6

Tôi đã viết kịch bản quản lý wlan để xử lý các mạng mở/ad-hoc/wep/wpa2. Bây giờ tôi đang cố gắng phân tích đầu ra quét iw wlan0 để có được tính năng quét đẹp cho tập lệnh của tôi. Mục tiêu của tôi là để có được kết quả như thế này:Phân tích cú pháp đầu ra quét iw wlan0

SSID  channel  signal  encryption 
wlan-ap  6   70%   wpa2-psk 
test  1   55%   wep 

gì tôi đã achived đã đầu ra như thế này là:

$ iw wlan0 scan | grep 'SSID\|freq\|signal\|capability' | tac 
SSID: Koti783 
signal: -82.00 dBm 
capability: ESS Privacy ShortPreamble SpectrumMgmt ShortSlotTime (0x0531) 
freq: 2437 

Tôi đã cố gắng để nghiên cứu bash/sed/awk nhưng havent được tìm thấy nhưng một cách để đạt được những gì tôi đang cố gắng. Vậy cách tốt để đạt được điều đó là gì?

+1

đầu vào không cung cấp đủ thông tin để đạt được đầu ra đó – hek2mgl

+0

Xin lưu ý rằng trang trợ giúp của chính iw đọc "KHÔNG sàng lọc công cụ này, chúng tôi không xem đầu ra của nó ổn định". – Bryce

Trả lời

7

Dưới đây là giải pháp cuối cùng của tôi dựa của Sudo_O answer:

$1 == "BSS" { 
    MAC = $2 
    wifi[MAC]["enc"] = "Open" 
} 
$1 == "SSID:" { 
    wifi[MAC]["SSID"] = $2 
} 
$1 == "freq:" { 
    wifi[MAC]["freq"] = $NF 
} 
$1 == "signal:" { 
    wifi[MAC]["sig"] = $2 " " $3 
} 
$1 == "WPA:" { 
    wifi[MAC]["enc"] = "WPA" 
} 
$1 == "WEP:" { 
    wifi[MAC]["enc"] = "WEP" 
} 
END { 
    printf "%s\t\t%s\t%s\t\t%s\n","SSID","Frequency","Signal","Encryption" 

    for (w in wifi) { 
     printf "%s\t\t%s\t\t%s\t%s\n",wifi[w]["SSID"],wifi[w]["freq"],wifi[w]["sig"],wifi[w]["enc"] 
    } 
}' 

Đầu ra:

$ sudo iw wlan0 scan | awk -f scan.awk 
SSID  Frequency Signal  Encryption 
netti  2437  -31.00 dBm Open 
Koti783  2437  -84.00 dBm WPA 
WLAN-AP  2462  -85.00 dBm WPA 
+1

Công việc tuyệt vời, vui mừng vì bạn đã có được giải pháp đầy đủ và đăng câu trả lời cho mọi người +1. Bây giờ bạn có đủ danh tiếng bạn có thể +1 giải pháp của tôi :) –

+1

Không có trình duyệt IE "WEP", vì vậy giải pháp của bạn không hoạt động để phát hiện mã hóa WEP. –

+0

Như @ nicolas-marchildon đã đề cập ở trên, bạn cần phải cài đặt gawk trong Raspberry Pi để có thể chạy điều này. – Jordan

2

thực tiễn không tốt là thử phân tích cú pháp đầu ra phức tạp của các chương trình dành cho con người để đọc (thay vì máy phân tích cú pháp).

ví dụ: đầu ra của iw có thể thay đổi tùy thuộc vào cài đặt ngôn ngữ của hệ thống và/hoặc phiên bản iw, để bạn với "người quản lý" chỉ hoạt động trên máy phát triển của bạn.

thay vào đó bạn có thể sử dụng cùng một giao diện mà iw sử dụng để có được nó thông tin: các phụ trợ thư viện libnl

bạn cũng có thể muốn có một cái nhìn tại wireless-tools (iwconfig, iwlist ...) mà sử dụng libiw thư viện.

+0

Hãy để tôi sửa. iw sử dụng thư viện libnl. –

+0

@AriMalinen thực sự, cảm ơn: tôi đã cập nhật câu trả lời của tôi cho phù hợp –

+0

Xin lưu ý rằng trang trợ giúp của iw đọc "KHÔNG sàng lọc công cụ này, chúng tôi không coi đầu ra của nó ổn định." – Bryce

5

Dưới đây là một kịch bản GNU awk để bạn đi mà lấy các SSID và kênh cho mỗi BSS độc đáo:

/^BSS/{ 
    MAC = $2 
} 
/SSID/ { 
    wifi[MAC]["SSID"] = $2 
} 
/primary channel/ { 
    wifi[MAC]["channel"] = $NF 
} 

# Insert new block here 

END { 
    printf "%s\t\t%s\n","SSID","channel" 

    for (w in wifi) { 
     printf "%s\t\t%s\n",wifi[w]["SSID"],wifi[w]["channel"] 
    } 
} 

Nó phải là dễ dàng để bạn có thể thêm các khối mới cho tín hiệu và mã hóa xem xét tất cả các học bạn đã làm.

Lưu kịch bản để nộp như wifi.awk và chạy như:

$ sudo iw wlan0 scan | awk -f wifi.awk 

Kết quả sẽ có trong định dạng yêu cầu:

SSID  channel 
wlan-ap  6 
test  1 
+0

Thats rất đẹp và hữu ích. Cảm ơn bạn. Tôi chỉ không thể tìm hiểu làm thế nào để hiển thị mã hóa của AP. –

+2

Điều này thật tuyệt nếu bạn may mắn sử dụng gawk thay vì Awk truyền thống. Lệnh awk trong OpenWrt đến từ Busybox và không hỗ trợ các mảng đa chiều. –

3

Đây là một chức năng Bash đơn giản trong đó sử dụng internals độc quyền Bash và sinh ra chỉ có một sub-shell:

#!/bin/bash 
function iwScan() { 
    # disable globbing to avoid surprises 
    set -o noglob 
    # make temporary variables local to our function 
    local AP S 
    # read stdin of the function into AP variable 
    while read -r AP; do 
    ## print lines only containing needed fields 
    [[ "${AP//'SSID: '*}" == '' ]] && printf '%b' "${AP/'SSID: '}\n" 
    [[ "${AP//'signal: '*}" == '' ]] && (S=(${AP/'signal: '}); printf '%b' "${S[0]},";) 
    done 
    set +o noglob 
} 

iwScan <<< "$(iw wlan0 scan)" 

Output:

-66.00,FRITZ!Box 7312 
-56.00,ALICE-WLAN01 
-78.00,o2-WLAN93 
-78.00,EasyBox-7A2302 
-62.00,dlink 
-74.00,EasyBox-59DF56 
-76.00,BELAYS_Network 
-82.00,o2-WLAN20 
-82.00,BPPvM 

Chức năng có thể dễ dàng sửa đổi để cung cấp thêm các trường bằng cách thêm bộ lọc cần thiết vào trong khi read -r AP while-loop, ví dụ:

[[ "${AP//'last seen: '*}" == '' ]] && (S=(${AP/'last seen: '}); printf '%b' "${S[0]},";) 
.210

Output:

-64.00,1000,FRITZ!Box 7312 
-54.00,492,ALICE-WLAN01 
-76.00,2588,o2-WLAN93 
-78.00,652,LN8-Gast 
-72.00,2916,WHITE-BOX 
-66.00,288,ALICE-WLAN 
-78.00,800,EasyBox-59DF56 
-80.00,720,EasyBox-7A2302 
-84.00,596,ALICE-WLAN08 
2

Tôi đang sử dụng giải pháp như vậy cho openwrt:

wlan_scan.sh

#!/bin/sh 
sudo iw dev wlan0 scan | awk -f wlan_scan.awk | sort 

wlan_scan.awk

/^BSS/ { 
    mac = gensub (/^BSS[[:space:]]*([0-9a-fA-F:]+).*?$/, "\\1", "g", $0); 
} 
/^[[:space:]]*signal:/ { 
    signal = gensub (/^[[:space:]]*signal:[[:space:]]*(\-?[0-9.]+).*?$/, "\\1", "g", $0); 
} 
/^[[:space:]]*SSID:/ { 
    ssid = gensub (/^[[:space:]]*SSID:[[:space:]]*([^\n]*).*?$/, "\\1", "g", $0); 
    printf ("%s %s %s\n", signal, mac, ssid); 
} 

kết quả

-62.00 c8:64:c7:54:d9:05 a 
-72.00 70:72:3c:1c:af:17 b 
-81.00 78:f5:fd:be:33:cb c 
Các vấn đề liên quan