Python lấy danh sách SSID wifi linux

def get_wifi_ssid_rows(self) -> List[List[str]]:
        rows: List[List[str]] = list()
        results: List[Dict[str, Union[int, str]]] = list()
        for bssid in self.wifi_instance.bssids.keys():
            try:
                assert 'essid' in self.wifi_instance.bssids[bssid].keys() and \
                       'signal' in self.wifi_instance.bssids[bssid].keys() and \
                       'channel' in self.wifi_instance.bssids[bssid].keys() and \
                       'enc' in self.wifi_instance.bssids[bssid].keys() and \
                       'cipher' in self.wifi_instance.bssids[bssid].keys() and \
                       'auth' in self.wifi_instance.bssids[bssid].keys() and \
                       'clients' in self.wifi_instance.bssids[bssid].keys(), 'Bad AP'

                assert self.wifi_instance.bssids[bssid]['enc'] != 'UNKNOWN', 'Bad Encryption'
                assert self.wifi_instance.bssids[bssid]['cipher'] != 'UNKNOWN', 'Bad Cipher'
                assert self.wifi_instance.bssids[bssid]['auth'] != 'UNKNOWN', 'Bad Authentication'
                if self.wifi_channel != -1:
                    assert self.wifi_instance.bssids[bssid]['channel'] == self.wifi_channel, 'Bad WiFi channel'

                results.append({
                    'essid': self.wifi_instance.bssids[bssid]['essid'],
                    'bssid': bssid,
                    'signal': self.wifi_instance.bssids[bssid]['signal'],
                    'channel': self.wifi_instance.bssids[bssid]['channel'],
                    'encryption': self.wifi_instance.bssids[bssid]['enc'] + ' ' +
                                  self.wifi_instance.bssids[bssid]['auth'] + ' ' +
                                  self.wifi_instance.bssids[bssid]['cipher'],
                    'clients': len(self.wifi_instance.bssids[bssid]['clients'])})

            except AssertionError:
                pass

        sorted_results: List[Dict[str, Union[int, str]]] = sorted(results, key=lambda k: k['signal'], reverse=True)
        for sorted_result in sorted_results:
            rows.append([sorted_result['essid'],
                         sorted_result['bssid'],
                         sorted_result['signal'],
                         sorted_result['channel'],
                         sorted_result['encryption'],
                         sorted_result['clients']])
            if 'WPA' in sorted_result['encryption'] and \
                    sorted_result['bssid'] not in self.wifi_instance.pmkid_authentications.keys():
                self.tm_instance.add_task(self.wifi_instance.send_association_request,
                                          sorted_result['bssid'],
                                          sorted_result['essid'],
                                          False)
        return rows

# endregion


# region Main function 

Nếu bạn nhập

data = subprocess.check_output(['netsh', 'wlan', 'show', 'profiles']).decode('utf-8').split('\n')
4 trong cmd, bạn sẽ được hiển thị cấu hình cho các kết nối wifi mà máy tính của bạn đã lưu trữ

Sau đó, nếu bạn nhập

data = subprocess.check_output(['netsh', 'wlan', 'show', 'profiles']).decode('utf-8').split('\n')
0, đầu ra được cung cấp sẽ chứa khóa mạng là mật khẩu WiFi

Lấy mật khẩu

Đầu tiên nhập quy trình con, đây là mô-đun chúng ta sẽ sử dụng để tương tác với cmd

import subprocess

Tiếp theo, lấy đầu ra cho lệnh "netsh wlan show profiles" bằng cách sử dụng quy trình con. check_output(). Sau đó, giải mã đầu ra bằng utf-8 và chia chuỗi theo ký tự xuống dòng để lấy từng dòng trong một chuỗi riêng biệt

data = subprocess.check_output(['netsh', 'wlan', 'show', 'profiles']).decode('utf-8').split('\n')

Bây giờ chúng tôi có một danh sách các chuỗi, chúng tôi có thể nhận được các dòng chỉ chứa "Tất cả hồ sơ người dùng". Với những dòng này, sau đó chúng ta cần chia nó bằng dấu '. ', lấy phía bên tay phải và xóa ký tự đầu tiên và cuối cùng

profiles = [i.split(":")[1][1:-1] for i in data if "All User Profile" in i]

Bây giờ, biến a chứa tên cấu hình WiFi, chúng ta có thể nhận đầu ra cho lệnh "netsh wlan show profile {Profile Name} key=clear" bằng cách sử dụng quy trình con. check_output() một lần nữa cho một cấu hình cụ thể trong khi lặp qua tất cả các cấu hình

for i in profiles:
    results = subprocess.check_output(['netsh', 'wlan', 'show', 'profile', i, 'key=clear']).decode('utf-8').split('\n')

Vẫn trong vòng lặp, hãy tìm các dòng có chứa "Nội dung chính", chia cho '. ' và xóa ký tự đầu tiên và cuối cùng giống như trước đây

    results = [b.split(":")[1][1:-1] for b in results if "Key Content" in b]

Bây giờ chúng ta sẽ có một danh sách chứa một chuỗi là khóa cấu hình cụ thể. Ở đây bạn chỉ có thể sử dụng một câu lệnh in đơn giản nhưng tôi chỉ định dạng nó một chút

    try:
        print ("{:<30}|  {:<}".format(i, results[0]))
    except IndexError:
        print ("{:<30}|  {:<}".format(i, ""))

Bây giờ hãy đặt một lệnh gọi đầu vào ở cuối tập lệnh bên ngoài vòng lặp để khi tập lệnh được chạy, nó sẽ không dừng ngay lập tức khi kết quả được hiển thị

________số 8

Lưu tập tin này với một. py và bây giờ bạn có thể chạy tập lệnh. Bạn có thể chạy nó bằng cách nhấp đúp vào tập lệnh, chạy nó trong IDLE hoặc thậm chí cmd bằng cách sử dụng

data = subprocess.check_output(['netsh', 'wlan', 'show', 'profiles']).decode('utf-8').split('\n')
1

Kịch bản cuối cùng

data = subprocess.check_output(['netsh', 'wlan', 'show', 'profiles']).decode('utf-8').split('\n')
0

Bạn cũng có thể tìm ý chính cho điều này trên Github tại đây

UnicodeDecodeError Bỏ qua - Bản sửa đổi 1

Tôi nhận thấy rằng nhiều người đang gặp sự cố với việc này khi đưa ra UnicodeDecodeError mô tả rằng codec 'utf-8' không thể giải mã một byte cụ thể. Điều này là do một byte trong một trong các tên hồ sơ không phải là ký tự trong mã hóa utf-8

Một cách để khắc phục điều này là thay đổi mã hóa từ

data = subprocess.check_output(['netsh', 'wlan', 'show', 'profiles']).decode('utf-8').split('\n')
2 thành
data = subprocess.check_output(['netsh', 'wlan', 'show', 'profiles']).decode('utf-8').split('\n')
3 hoặc mã hóa khác có thể hỗ trợ ký tự của bạn. Làm điều này trước khi thử tập lệnh tiếp theo

Một cách khác là bỏ qua lỗi và bắt lỗi sau. Vì vậy, mã mới trong trường hợp này sẽ là

data = subprocess.check_output(['netsh', 'wlan', 'show', 'profiles']).decode('utf-8').split('\n')
3

Xin lưu ý rằng các cấu hình gây ra lỗi sẽ vẫn không cung cấp mật khẩu do mã hóa vẫn chưa chính xác. Bạn sẽ phải tìm mật khẩu theo cách thủ công như được hiển thị ở đầu bài đăng này

Các vấn đề và câu hỏi thường gặp

Tại sao mật khẩu không hiển thị cho một hoặc nhiều mạng?

Nếu một mạng có một loại xác thực đặc biệt, rất có thể điều này sẽ không lấy được mật khẩu. Rất có thể sẽ có các phương pháp tìm mật khẩu khác

Tôi đang sử dụng một ngôn ngữ khác ngoài tiếng Anh

Thật không may, do các chuỗi được sử dụng trong tập lệnh này để xác định các giá trị, điều này sẽ chỉ hoạt động trên các máy sử dụng ngôn ngữ tiếng Anh. Điều này là do các chuỗi như "Nội dung chính" có khả năng thay đổi đối với các ngôn ngữ khác

Để khắc phục điều này, bạn sẽ cần xác định các chuỗi mà chúng tôi đang cố xác định bằng ngôn ngữ hiện tại của bạn và thay thế chúng trong tập lệnh