piping arquivo de texto para telnet sobre ssh

1

Gostaria de enviar um arquivo de texto com comandos para uma sessão de telnet que abri em um cliente ssh. Isso é possível? um exemplo: Eu tenho um arquivo de texto cmds que contém comandos como

FirstFunction(A,B,C,0x9001,123456,7);
SecondFunction(A,B,C1,2,4);
ThirdFunction(A,B,C,D,E,F);

e eu posso copiar 7 colar cada comando na sessão de telnet que eu tenho aberto em um shell ssh cliente. posso automatizar isso para transmitir diretamente cada linha para a sessão de telnet?

EDIT1
No meu host ssh, abro a sessão de telnet (para onde os comandos devem ir) como telnet MyHost

EDIT2
Eu tentei:

$ ssh root@cc1 telnet MyHost < cmds                                                                                       
Welcome to MyHost                                                                                                              
Trying 10.254.0.2...                                                                                                                            
Connected to MyHost.                                                                                                                            
Escape character is '^]'.                                                                                                                       
Connection closed by foreign host.
ron@jpax-build07:~/tmp$ 

não parece canalizar o arquivo cmds para a sessão de telnet.
O que eu tentei também é:

$ ssh root@cc1 cmds - | telnet MyHost
Welcome to MyHost
cat: cmds: No such file or directory
telnet: could not resolve MyHost/telnet: Name or service not known

EDIT 3
Eu instalei expect e tentei o seguinte:

#!/usr/bin/expect
spawn ssh root@ccTest telnet -l MyHost
#expect Password:
#send "mypassword\r"
expect {-> }
send "some_cmd(20)\r"
expect {$ }
send "exit\r"
expect eof

mas isso é o que eu recebi:

$ ./jpax_txcmd.sh 
spawn ssh root@ccTest telnet -l MyHost
bad flag "-> ": must be -glob, -regexp, -exact, -notransfer, -nocase, -i, -indices, -iread, -timestamp, -timeout, -nobrace, or --
    while executing
"expect {-> }"
    (file "./jpax_txcmd.sh" line 5)
$
    
por cerr 12.07.2016 / 23:17

1 resposta

3

O problema com o telnet é que, uma vez que ele lê o fim do arquivo, ele fechará a conexão e você não verá nenhuma saída. Um truque simples é manter a entrada aberta por algum tempo extra, por exemplo:

(cat cmds; sleep 15) | ssh root@cc1 telnet MyHost 

Obviamente, esta não é uma solução robusta, então você deve usar algo que seja capaz de detectar quando o controle remoto terminar, por exemplo, expect . O exemplo a seguir espera que o script implemente uma conversa típica de telnet sobre ssh envolvendo um login para myusername com a senha mypassword e enviando o comando ls -l para um prompt $<space> shell:

#!/usr/bin/expect
spawn ssh root@cc1 telnet -l myusername myhost
expect Password:
send "mypassword\r"
expect {$ }
send "ls -l\r"
expect {$ }
send "exit\r"
expect eof
    
por 15.07.2016 / 17:42