Durch die Prozessersetzung <(…)
wird eine Pipe erstellt, /dev/fd
ein Pfad angegeben, der dem Dateideskriptor entspricht, in dem sich die Pipe befindet, und der Dateiname als Argument an das Programm übergeben. Hier ist das Programm sudo
, und es übergibt dieses Argument (das für ihn nur eine Zeichenfolge ist) an wpa_supplicant
, das es als Dateinamen behandelt.
Das Problem ist, dass sudo alle Dateideskriptoren außer den Standarddeskriptoren schließt (stdin = 0, stdout = 1 und stderr = 2). Die Pipe der Prozessersetzung befindet sich in einem anderen Deskriptor, der geschlossen wird. Wenn Sie also wpa_supplicant
versuchen, ihn zu öffnen, wird eine Datei gefunden, die nicht vorhanden ist.
Wenn Ihre Sudo-Richtlinie dies zulässt ( closefrom_override
Option aktiviert), können Sie festlegen, dass Dateideskriptoren nicht geschlossen werden sollen. Dies ist jedoch normalerweise nicht der Fall.
sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)
Alternativ können Sie die Daten dort übergeben, da Sie keine Standardeingabe verwenden.
wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin
Alternativ können Sie eine Shell von sudo ausführen und die Prozessersetzung dort ablegen. Achten Sie beim Zitieren darauf, ob der Befehl Sonderzeichen enthält.
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'
Gilles 'SO - hör auf böse zu sein'
quelle