Tworzę oprogramowanie dla systemu Ubuntu Linux, które musi łączyć się z punktem dostępu Wi-Fi. Sieć Wi-Fi nie jest wstępnie zdefiniowana i może się zmieniać kilka razy podczas pojedynczego uruchomienia oprogramowania (użytkownik jest tym, który zamawia zmianę). Chodzi o to, że biorąc pod uwagę zbiór identyfikatorów SSID i ich hasła WPA lub WEP, oprogramowanie powinno być w stanie przełączać się pomiędzy sieciami, bez potrzeby zmiany jakichkolwiek plików konfiguracyjnych w dowolnym miejscu w systemie.Podłączanie do chronionej sieci Wi-Fi z Python na Linuksie
Ogromnym problemem, jak się wydaje, jest przekazanie hasła do połączenia. Oto, z czym dotychczas współpracowałem:
- Ubuntu 12.10 maszyna wyposażona w klucz WiFi.
- Python, który uruchamia oprogramowanie, a które zostaną wykorzystane do żądania połączenia
- connman 0,79
- wpa_supplicant v1.0
- d-bus
Na początku myślałem, że byłoby możliwe przekazanie hasła do connmana przez d-bus, ale ani ta wersja programu connman, ani też 1.11 nie ujawniają żadnej metody. Wtedy dowiedziałem się, że można zrzucić plik service_<SSID>.conf
do katalogu /var/lib/connman/
. Zawartość pliku jest bardzo prosty i wygląda następująco:
[service_SSID]
Type=wifi
Name=Network-SSID
Passphrase=here-goes-the-passphrase
Po utworzeniu tego pliku, podłączenie do sieci wymaga prostego połączenia do net.connman.Service.Connect (metoda) w odpowiedniej usługi. Problem polega na tym, że program connman nie przeanalizuje pliku konfiguracyjnego, dopóki nie zostanie ponownie uruchomiony. Wymaga to przywilejów sudo, dodatkowego czasu i stwarza ryzyko dla wszystkich "rzeczy, które mogą pójść źle teraz". Wtedy pomyślałem, że hasło można jakoś przekazać do interfejsu API d-bus wpa_supplicant, ale nie udało mi się znaleźć niczego.
Wyszukiwania Google również mnie zawiodły. To tak, jakby nikt wcześniej nie próbował tego robić.
Komenda sudo iwconfig wlan0 essid <SSID> key s:<PASSPHRASE>
powoduje błąd SET failed on device wlan0 ; Invalid argument.
. Poza tym wymaga sudo, którego chciałbym uniknąć.
Próbowałem dowiedzieć się, w jaki sposób program wpa_gui robi magię. Przede wszystkim odkryłem, że to również wymaga sudo, i że wysyła kilka poleceń bezpośrednio do /var/run/wpa_supplicant/wlan0
. Replikowanie tego zachowania byłoby dla mnie ostatecznością, jeśli nie znajdę niczego prostszego.
Pytanie brzmi następująco: Jak korzystać z Pythona, aby połączyć się z siecią WiFi chronioną WEP/WPA?
Zastanawiam się również, czy używanie connmana jest dobrym podejściem i jeśli nie powinienem powrócić do Menedżera sieci, który jest domyślny w Ubuntu.
Czy możesz mi powiedzieć, co byłoby DICT zabezpieczenie WEP? – Natim
Niestety, nigdy nie potrzebowałem sprawdzać, jak to zrobić z WEP, więc nie mogę ci tu pomóc. Nie wyobrażam sobie jednak, że byłoby inaczej. – ZalewaPL
@ZalewaPL Wiem, że minęło już prawie rok od ostatniej odpowiedzi, ale według tego [link] (https://developer.gnome.org/NetworkManager/unstable/spec.html#org.freedesktop.NetworkManager) nie nawet trzeba wprowadzić rodzaj zabezpieczenia (WEP, WPA2, itp.), wystarczy podać hasło (psk). Cytowanie pierwszego parametru AddAndActivateConnection: 'Ustawienia i właściwości połączenia; jeśli niepełne brakujące ustawienia zostaną automatycznie zakończone przy użyciu danego urządzenia i określonego obiektu. "Usunąłem więc ** security ** i ** key-mgmt ** from ** connection_params ** i został on pomyślnie połączony. :) – kv1dr