Começando com as ideias já sugeridas no meu comentário, gostaria de oferecer uma resposta. A resposta é testada para funcionar no caso específico de usar uma combinação de wpa_supplicant
(versão v2.6), wpa_passphrase
, GNU bash
(versão 4.4.23) e linux 4.18.
Espero que a solução oferecida aqui, com o objetivo de evitar que algum arquivo de frase secreta remanescente seja adotável de uma maneira mais geral posix, entretanto eu testei apenas a configuração do arch linux disponível para experimentação.
Eu corri
strace wpa_supplicant -i <WIFIINTERFACE> -c <(wpa_passphrase <SSID> <PASSPHRASE>) 2>&1 | less
com os parâmetros reais da minha rede wifi. E a conexão foi estabelecida. Também navegando pelo stace eu acho isso:
execve("/usr/bin/wpa_supplicant", ["wpa_supplicant", "-i", "wlp0s29u1u2", "-c", "/dev/fd/63"], 0x7fffc7b0ad10 /* 39 vars */) = 0
[....]
openat(AT_FDCWD, "/dev/fd/63", O_RDONLY) = 3
fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
read(3, "network={\n\tssid=\"Oscarone\"\n\t#psk"..., 4096) = 116
read(3, "", 4096) = 0
close(3) = 0
socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE) = 3
bind(3, {sa_family=AF_NETLINK, nl_pid=0, nl_groups=0x000001}, 12) = 0
[....]
qual deve ser a maneira como o processo de substituição do processo (o command <(other command)
) funcionou. Pode ser visto que o wpa_supplicant acessou o pipe em /dev/fd/63
e leu a configuração, e depois a fechou mais, depois de fechar o fd 3
, o descritor de arquivo está sendo reutilizado diretamente para abrir um socket
.
Douple verificado através de ls -ialh /proc/<pid of wpa_supplicant>/3
e ele informa:
%código%
significa que a única acessibilidade temporária da senha (através do fifo em 571637 lrwx------ 1 root root 64 Aug 23 20:49 3 -> 'socket:[571092]'
aberto como fd /dev/fd/53
foi de fato fechada e agora ainda é o 3
como socket
informado corretamente.
Parece também que as informações sobre esta maneira de criar uma linha de comandos "sem-arquivo" "sem arquivo" para strace
são discutidas no wiki do linux do arco ( link )
Eu também quero salientar o óbvio. Desde que você introduza a senha no shell, certifique-se de que ela não será gravada no histórico do shell, portanto faça algo parecido com:
set +o history
wpa_supplicant -i INTERFACE -c <(wpa_passphrase SSID PASSPHRASE) &
set -o history
(como mostrado aqui link )