A substituição de processo <(…)
cria um canal, usa /dev/fd
para fornecer um caminho equivalente ao descritor de arquivo em que o canal está e passa o nome do arquivo como argumento para o programa. Aqui está o programa sudo
, e ele passa esse argumento (que é apenas uma string, no que diz respeito a) wpa_supplicant
, que o trata como um nome de arquivo.
O problema é que o sudo fecha todos os descritores de arquivos, exceto os padrão (stdin = 0, stdout = 1 e stderr = 2). O canal da substituição do processo está em outro descritor, que é fechado; portanto, ao wpa_supplicant
tentar abri-lo, ele encontra um arquivo que não existe.
Se sua política do sudo permitir ( closefrom_override
opção ativada), você pode dizer para não fechar os descritores de arquivo. Mas esse geralmente não é o caso.
sudo -C 64 wpa_supplicant … -c <(wpa_passphrase …)
Como alternativa, como você não está usando entrada padrão, passe os dados para lá.
wpa_passphrase … | sudo wpa_supplicant … -c /dev/stdin
Como alternativa, execute um shell no sudo e coloque a substituição do processo lá. Tome cuidado ao citar se o comando contiver caracteres especiais.
sudo bash -c 'wpa_supplication … -c <(wpa_passphrase …)'
Gilles 'SO- parar de ser mau'
fonte