Подстановка процесса <(…)
создает канал, использует /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 …)'
Жиль "ТАК - перестань быть злым"
источник