Se você quiser continuar com uma sessão interativa, a maneira usual é usar expect
para fazer o login:
#!/usr/bin/expect
spawn telnet mymachine -l myusername
expect Password:
send password\r
expect -- {$ }
interact
Quando estou fornecendo nome de usuário e senha para fazer o telnet para login, ele é automaticamente fechado após o seguinte comando:
echo password | telnet mymachine -l mysuername
As saídas do console:
Connected to mymachine.
Connection closed by foreign host.
Em seguida, a conexão é fechada. Existe uma maneira de manter a conexão enquanto ainda fornece nome de usuário e senha para o login de uma só vez?
Atualização: Eu escrevi um alias de acordo com a resposta aceita que faz o login sem digitar o nome de usuário e senha toda vez:
alias logon='rm loginscript; echo \#\!\/usr\/bin\/expect >> loginscript ; echo spawn telnet remotemachine -l username >> loginscript ; echo expect Password: >> loginscript ; echo send password"\r" >> loginscript ; echo expect -- \{\$ \} >> loginscript ; echo interact >> loginscript; chmod 777 loginscript; ./loginscript'
Supondo que você ainda deseja interagir com a sessão telnet
depois de enviar a senha, é necessário alimentá-la com a entrada do terminal local:
(echo password; cat) | telnet -l user host
Dependendo de como sua implementação telnet
tenta interagir com o terminal local, você pode achar necessário:
saved=$(stty -g); stty raw -echo
(echo password; cat) | telnet -l user host
stty "$saved"
Ou até mesmo:
saved=$(stty -g); stty raw -echo
(echo password; cat) | telnet -l user host 2>&1 | cat
stty "$saved"
(em alguns sistemas, você pode precisar de cat -u
no lugar de cat
)
Outra opção é usar expect
que usa um pseudo-terminal em vez de pipes para interagir com o aplicativo (observe que telnetd
também gera um erro no outro extremo, então um extra não é estritamente necessário neste caso).