La substitution de processus <(…)
crée un canal, utilise /dev/fd
pour donner un chemin équivalent au descripteur de fichier où se trouve le canal et transmet le nom du fichier comme argument au programme. Ici, le programme est sudo
, et il passe cet argument (qui n'est qu'une chaîne, en ce qui le concerne) à wpa_supplicant
, qui le traite comme un nom de fichier.
Le problème est que sudo ferme tous les descripteurs de fichiers à l'exception des descripteurs standard (stdin = 0, stdout = 1 et stderr = 2). Le canal de la substitution de processus se trouve sur un autre descripteur, qui se ferme, donc quand il wpa_supplicant
essaie de l'ouvrir, il trouve un fichier qui n'existe pas.
Si votre stratégie sudo le permet ( closefrom_override
option activée), vous pouvez lui dire de ne pas fermer les descripteurs de fichiers. Mais ce n'est généralement pas le cas.
sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)
Alternativement, puisque vous n'utilisez pas d'entrée standard, passez-y les données.
wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin
Vous pouvez également exécuter un shell à partir de sudo et y placer la substitution de processus. Soyez prudent en citant si la commande contient des caractères spéciaux.
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'
Gilles 'SO- arrête d'être méchant'
la source