Meu laptop está conectado à internet apenas por wifi, mas ocasionalmente ele é desconectado. Quando isso acontece, não consigo ssh
entrar nele e preciso fazer login fisicamente para reconectar o wifi com nmcli
(não configurei nenhum gráfico).
Infelizmente, algumas teclas do teclado não respondem, sendo necessárias para o login do usuário e a senha do Wi-Fi.
Então configurei uma conta de usuário cujo nome usa apenas chaves que funcionam e cujo "shell" de login é um script para reconectar o wifi:
#!/usr/bin/bash
if /usr/bin/nmcli device wifi connect 'SSID' password 'PASSWORD'; then
echo "Connected as $(ip -json -4 address show wlp2s0 | jq -r '.[0].addr_info[0].local')"
else
echo 'Failed to connect to wifi'
fi
read -sN 1 -p 'Press any key to exit...'
wirec:x:970:969::/:/opt/wirec/wirec
Definitivamente não é uma ótima configuração, mas funciona enquanto espero um novo teclado chegar. Também descobri que NetworkManager
tem um recurso de reconexão automática, que é tudo o que eu realmente quero. Mas isso me fez pensar:
Em um caso geral, onde um programa está esperando uma entrada interativa sensível, e sem conectividade de rede, e não há teclado, é possível obter a entrada para o programa? Ou escrevê-la quando há rede para executar quando não há é tão bom quanto possível?
Eu uso
script
( https://linux.die.net/man/1/script )Mas para o seu caso especial eu usaria
rina
e deixaria isso rodando em atmux
ouscreen
:Se você não conseguir executar ping em 8.8.8.8 por 10 segundos, execute o comando.
Substitua 8.8.8.8 pelo roteador do seu ISP.
rina: https://git.data.coop/tange/tangetools/src/branch/master/rina
Bem, tudo se resume aos tipos de dispositivos de entrada que o programa está disposto a aceitar.
Note que programas de linha de comando como
nmcli
estão usando um dispositivo TTY para entrada, não especificamente um teclado. Então, qualquer coisa que possa ser representada como um dispositivo TTY funcionará: se seu laptop tiver uma porta serial RS-232, ou um adaptador USB para serial, você poderia facilmente usá-lo para sessões de linha de comando, mas você precisaria de algum hardware que agisse como um terminal na outra ponta do cabo serial.Com a maioria das distribuições Linux, alguma configuração mínima também é necessária. Por exemplo, em distribuições modernas usando
systemd
, você normalmente precisaria de apenas um único comando para fazer o sistema aceitar persistentemente logins na/dev/ttyS0
porta serial: .systemctl enable --now [email protected]
Se você estiver disposto a escrever um driver de dispositivo TTY personalizado, então basicamente tudo vale: se tudo o que você pode ter para entrada é um único fio de dados e um fio terra, você pode fazer um dispositivo TTY que aceita entrada por código Morse, por exemplo. A menos que você já seja proficiente em código Morse, você ainda pode preferir algo que possa exibir visualmente caracteres para o lado de saída, no entanto :-)
Se o hardware disponível já estiver coberto por drivers existentes e você não quiser fazer programação em nível de kernel, há maneiras de fazer isso no espaço do usuário também. A maneira mais simples seria usar os recursos do seu ambiente de desktop para atribuir ações de teclas personalizadas a coisas como eventos de botão do mouse; então você poderia usar um mouse de jogo multibotões como um substituto de um teclado numérico, por exemplo.
Ou você pode pegar o código-fonte de utilitários como
screen
outmux
e reescrever seu tratamento de entrada para ler qualquer dispositivo de entrada (ou até mesmo um conjunto bruto de pinos GPIO) que esteja disponível para você; o utilitário então lidaria com a configuração de um dispositivo pseudo-TTY (PTY) que poderia ser usado para executar qualquer programa interativo baseado em TTY usando seu hardware de entrada personalizado.