Connection wifi en python

je souhaiterais me connecter à un SSID dans un script python:
j’ai trouvé ce script :

def connect_to(ssid: str, password: str):
    if not is_wifi_available(ssid):
        return False
    subprocess.call(['nmcli', 'd', 'wifi', 'connect', ssid, 'password', password])
    return is_connected_to(ssid)

mais il renvoie un erreur liée à un pb de privileges :

Exécute ton script en sudo ?

Sinon ajoute ton utilisateur au groupe de ce process qui gère le wifi.

j’ai ecrit ça :

def connect_to(ssid: str, password: str):
    if not is_wifi_available(ssid):
        return False
    ch = "sudo nmcli device wifi connect "+ssid+" password "+password
    ch_mod=ch.split()
    proc = subprocess.run(
    ch_mod,
    stdout=subprocess.PIPE,
    input="mon_passwd_raspbian",
    encoding="utf8",
)

il faudrait que je gère les exceptions

Yo @bbd666
La ligne ch = "sudo nmcli device wifi connect "+ssid+" password "+password ne fonctionnera sans doute pas.
sudo ne lit pas les mots de passe depuis stdin dans ce contexte (sauf cas très spécifiques et configurés avec sudo -S).

Il vaut mieux :

  • Soit exécuter ton script avec les privilèges root directement (sudo python script.py)
  • Soit ajouter ton utilisateur au fichier sudoers avec les droits sans mot de passe pour nmcli.

++

A tester :

import subprocess

def connect_to(ssid: str, password: str) -> bool:
    if not is_wifi_available(ssid):
        print(f"SSID '{ssid}' non trouvé.")
        return False

    try:
        result = subprocess.run(
            ["sudo", "nmcli", "device", "wifi", "connect", ssid, "password", password],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            check=True
        )
        print(f"Connecté à {ssid} : {result.stdout.strip()}")
        return True
    except subprocess.CalledProcessError as e:
        print(f"Erreur nmcli : {e.stderr.strip()}")
        return False
    except Exception as e:
        print(f"Erreur système : {str(e)}")
        return False

(les appels print sont utiles pour le debug)

++

1 « J'aime »

Merci bcp ∇ pour cet exemple tres utile.
je crois que mon script fonctionne (aucune erreur).
je l’ai adapté d’un exemple en changeant d’encodage (utf8 au lieu d’ascii).
stackoverflow
je l’ai aussi testé en interactif avec saisie manuelle du mdp:

proc = subprocess.run(
    ch_mod,
    stdout=subprocess.PIPE,
    input=getpass("password: "),
    encoding="utf8",
)

Mais je suis qd même intéressé par ta seconde méthode (fichier sudooers). Pourrais tu me fournir les explications pas à pas ?

J’ai utilisé ta gestion des exceptions que j’ai ajouté à mon script.

Tu peux configurer ton utilisateur pour qu’il n’ait pas besoin de saisir son mot de passe sudo pour exécuter nmcli.
Pour ça, faut ajouter une ligne dans le fichier sudoers.
Mais faut le faire avec visudo pour éviter de le corrompre ! (tu peux flinguer ton système)

sudo visudo
(ça va éditer le fichier avec nano ou vi selon ce que tu as configuré)

Et tu ajoutes la ligne suivante pour permettre à ton utilisateur (par exemple, bbd666) d’exécuter nmcli sans mot de passe :

bbd666 ALL=(ALL) NOPASSWD: /usr/bin/nmcli

Après avoir ajouté cette ligne, tu pourras vérifier que tout roule avec
sudo visudo -c

Et voilà, tu pourras utiliser sudo nmcli dans ton script sans avoir à saisir un mot de passe.

++

1 « J'aime »

crystal clear !!
MERCI