Réaliser un script sur une clef usb qui configure le wifi au démarrage du Pi

Bonjour
Est-il possible de réaliser un script sur une clef usb qui configure le wifi au démarrage du Pi ?

  • J’aimerai placer un fichier sur une clef usb qui contient les données wifi de la connexion wifi, par exemple :

    MonFichier.txt :

    ssid=« NOM_RESEAU »
    psk=« MOTDEPASSE »

  • Ensuite insérer cette clef

  • Que le Pi au démarrage récupère les données du fichier de la clef (MonFichier.txt) et modifie le fichier /etc/wpa_supplicant/wpa_supplicant.conf par exemple :

    wpa_supplicant.conf :

    country=FR
    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    network={
    ssid=« NOM_RESEAU »
    scan_ssid=1
    psk=« MOTDEPASSE »
    key_mgmt=WPA-PSK
    }

Merci pour vos conseils et exemples de scripts.
Je demande cela car je souhaite prêter des pi à des membres de notre webradio et qu’ils puissent écouter le flux de la webradio chez eux. Cela sans que la personne n’ait à brancher un écran et un clavier au Pi pour saisir ses paramètres wifi. (Voir ma discussion précédente sur le forum )

Le Raspberry le fait, mais faut mettre le fichier « wpa_supplicant.conf » dans /boot/.

Alors je ferais un script qui détecte la carte SD, et si il détecte un fichier « wpa_supplicant.conf » ou « wpa_supplicant.txt » par exemple, il le copie sur le /boot/, et lance un redémarrage. Pour éviter un boot en loop, il renomme avant sur la clé USB le fichier en « wpa_supplicant.conf.done » par exemple.

Plutôt la carte USB ?
Auriez vous un exemple de code ?

Moi j’avais un code pour ma PiDashCam, elle détecte le USB et copie des fichier dessus.

#!/bin/bash
while true;
do
	if [ -e "/dev/sda1" ]
	then
		sudo mount -t ntfs /dev/sda1 /media/usbout -w
		#ton code ici, par exemple (non testé)
		if [ -e "/media/usbout/wpa_supplicant.txt" ]
		then
		    sudo cp -f /media/usbout/wpa_supplicant.txt /boot/wpa_supplicant.conf
		    mv /media/usbout/wpa_supplicant.txt /media/usbout/wpa_supplicant.txt.done
		    sudo reboot
		#sudo umount /media/usbout
		sleep 60
        fi
	sleep 10
done

J’ai ajusté au pif le code pour ton besoin, bref c’est l’idée, ne reste plus qu’a l’améliorer pour tes besoins et les bugs que tu peux rencontrer. C’est un service qui surveille.

La je ne sais pas si tu es en mode Desktop ou non, car en mode Desktop, le USB est chargé automatiquement, alors faudra plutot scanner le dossier /media/. et vérifier les partitions chargés à la place, dans une boucle pour tout les montages. Après tu peux te coder une application ou une ligne de commande pour aviser que la copie est faite (app qui pop en Desktop, ou un Message general en ligne de commande).

Je suis en Deskstop. Ce script est une bonne base pour commencer. Par contre au niveau des ports usb. La clef sera détectée branchée sur n’importe lequel ?

Euh… la c’est plus obscur.

levelKro votre code devrait convenir.

Le montage me semble temporaire (sudo mount -t ntfs /dev/sda1 /media/usbout -w) et ne devrait par interféré avec celui qui est fait en mode desktop ? (Lorsqu’il y a ensuite le #sudo umount /media/usbout , j’ ôterai le commentaire de cette ligne).

le /dev/sda est le disque vu par le système, qui soit sata, usb ou autres…, sauf la carte sd qui est vu autrement
alors monitorer la présence su sda indique qu’un appareil de type disque est connecté.

Pour le port USB, ont s’en fou, c’est dans un autre /dev qui a une implication.

Vu que tu as 4 port sur un RPi 1/2/3/4, tu peux monitorer sd…A B C et D. Mais vus que tu es sur Desktop, les USB disque son chargé automatique, alors c’est de scanner les médias chargé, qui le sont habituellement dans /media. Faudra alors ajuster le code en conséquence.

Sinon, regarde du côté du FSCHANGE : fschange – Linux File System Change Notification

Je comprends le reste, mais pas çà. Du coup je ne peux pas adapter le code. Comme je débute sous Raspberry je potasse un bouquin acheté en ligne, donc encore merci pour toutes ces indications.

  • J’ai quand meme testé le script. J’ai changé ntfs par vfat (clé en FAT32)
  • J’ai crée le dossier /media/usbout (je ne sais pas si je dois donner des droits dessus et faire un chmod)
    Cela n’a pas fonctionné. Mais j’essayerai de recommencer demain !
    … euh le dossier /media/usbout il faut le créer sur la carte sd ou le pi ?

hello,

ça doit pouvoir se faire a l’insertion de la clé USB grâce a UDEV
( l’insertion de la clé, udev lance un job )
ds /etc/udev/rules.d on crée un fichier ( 90-modif_wpa.rules ) avec dedans :

ACTION=="add", KERNEL=="sd*", ATTRS{serial}=="4C530001310125116240", RUN+="/home/pi/execute_shell.sh"

pour que l’action ne se fasse qu’_ l’insertion d’une clé particulière on peut utiliser son numéro de série ou un autre truc identifiant ( ATTRS{serial}==« 4C530001310125116240 » )

on l’obtiens avec lsusb -vd [vendor]:[product] voir man lsusb pour détails

après le shell qui va te mettre à jour le wpa_supplicant.conf … plein de solutions possibles sans doute autant que de programmeurs lol …

par exemple : a l’insertion de la clé on sauvegarde le wpa_supplicant.conf d’origine, on le remplace par le nouveau on débranche la clé on reboot si on rebranche la clé on récupère la config d’origine…

source : UDEV : Exécuter un script à l'insertion d'un disque ou clé USB - Wiki - Wiki

1 « J'aime »

Merci bof.

  • Ceci fonctionne t-il au démarrage lorsque la clef usb est branchée ?
  • 90-modif_wpa.rules il s’agit bien de créer un fichier et pas modifier 90_wpa.rules existant ?
    Merci !

je suppose que oui puisque la règle fonctionne quand le système détecte la clé.

oui ! avec le numéro 90 il sera executé avant le fichier 99 "standard’.

tu peux commencer en créant un fichier sh simple ( après un chmod +x pour le rendre exécutable ) par exemple /home/pi/execute_shell.sh avec dedans

#!/bin/sh
cd /home/pi
ls -l > log

si après un less /home/pi/log, le fichier log apparaît à l’insertion ( et/ou) au démarrage ça fonctionne !

a noter que suivant le système utilisé (Lite ou desktop ) il te faudra ou non monter la clé.

en desktop un sudo find / -name "mon_fichier" >result permettra de trouver le chemin du fichier recherché

la lecture de result:

while read line  
do   
   echo "$line"
   filename=$line
done < result

le fichier recherché ( avec son chemin) devrait se trouvé ds la variable filename …
avec un sudo cp $filename /etc/wpa_supplicant/wpa_supplicant.conf on devrait remplacer le fichier de conf wifi…

Grand Merci, j’apprends beaucoup de choses. Avec tous vos conseils je suis parvenu à une solution qui fonctionne. Je confirme que le script est exécuté au démarrage si la clef est déjà branchée.