Podstawienie procesu <(…)
tworzy potok, używa /dev/fd
do podania ścieżki równoważnej deskryptorowi pliku, w którym potok się znajduje, i przekazuje nazwę pliku jako argument do programu. Tutaj program jest sudo
i przekazuje ten argument (który jest tylko ciągiem, jeśli chodzi o to) wpa_supplicant
, który traktuje go jako nazwę pliku.
Problem polega na tym, że sudo zamyka wszystkie deskryptory plików oprócz standardowych (stdin = 0, stdout = 1 i stderr = 2). Potok zastępowania procesu znajduje się na innym deskryptorze, który zostaje zamknięty, więc gdy wpa_supplicant
próbuje go otworzyć, znajduje plik, który nie istnieje.
Jeśli twoje zasady sudo na to pozwalają ( closefrom_override
opcja włączona), możesz powiedzieć, aby nie zamykać deskryptorów plików. Ale zwykle tak nie jest.
sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)
Alternatywnie, ponieważ nie używasz standardowego wejścia, przekaż tam dane.
wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin
Alternatywnie, uruchom powłokę z sudo i umieść tam podstawienie procesu. Ostrożnie z cytowaniem, jeśli polecenie zawiera znaki specjalne.
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'