Підстановка процесу <(…)
створює трубу, використовує /dev/fd
для визначення шляху, еквівалентного дескриптору файлу, де знаходиться труба, і передає ім'я файлу як аргумент програмі. Ось програма є sudo
, і вона передає той аргумент (який є лише рядком, наскільки це стосується) wpa_supplicant
, який трактує її як ім'я файлу.
Проблема полягає в тому, що sudo закриває всі дескриптори файлів, крім стандартних (stdin = 0, stdout = 1 і stderr = 2). Труба заміщення процесу знаходиться в іншому дескрипторі, який закривається, тому, wpa_supplicant
намагаючись відкрити його, він знаходить файл, який не існує.
Якщо ваша політика sudo дозволяє ( closefrom_override
опція увімкнена), ви можете сказати їй не закривати дескриптори файлів. Але зазвичай це не так.
sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)
Крім того, оскільки ви не використовуєте стандартний ввід, передайте дані туди.
wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin
Крім того, запустіть оболонку від sudo і покладіть туди заміну процесу. Будьте обережні з цитуванням, якщо команда містить спеціальні символи.
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'