Eu preciso escrever um script que rode em um PC com Centos 7 e se conecte a outro PC com Centos 7 usando ssh, execute um comando de console, por exemplo “ls -la” e salve a saída dele em um arquivo para poder analisar posteriormente essa saída.
Eu escrevi o seguinte script EXPECT:
ssh_connection.exp:
#!/usr/bin/expect -f set timeout 120 spawn ssh [email protected] expect "assword:" send "PASSWORD\r" expect "prompt#" sleep 5 puts "Executing ls -la" send "ls -la\r" sleep 10 puts "Executing ps -af" puts "ps -af\r" sleep 10 puts "Closing the ssh session\r" send "exit\r"
Este script se conecta corretamente através do ssh à máquina com IP = 129.0.0.10 e exibe na tela as mensagens que aparece em “puts”: Executando ls -la Executando ps -af Fechando a sessão ssh
No entanto, não mostra o resultado da execução dos comandos que envio com send:
ls -la ps -af
O que há de errado com este script?
Como posso fazer a saída dos comandos anteriores salvos em um arquivo para poder analisá-lo posteriormente com um bash script ou um programa C?
Comentários
Resposta
Você não precisa usar expect
para fazer isso. O ssh
pode ter argumentos adicionais de comandos que você deseja executar por meio da conexão SSH.
Etapa # 1
Configure um par de chaves SSH (pesquise no Google) e copie o SSH chave para o servidor remoto. Para fazer isso, recomendo usar ssh-copy-id
. Veja minha resposta a este U & LQ & Um intitulado: Como copiar corretamente chaves privadas de servidores remotos para minha máquina local para que eu possa me conectar usando ssh .
Etapa 2
Agora com a capacidade de SSH para um servidor no local usando uma chave , seu problema acima se transforma em:
$ ssh [email protected] "ls -la; ps -af"
Você pode se divertir e usar aqui documentos (heredocs aka . here-docs) para aprimorar ainda mais esta técnica.
$ ssh [email protected] <<EOF > ls -la > ps -af > EOF
ou coloque os comandos em um arquivo e passe-os para ssh
:
$ ssh [email protected] < my.cmds
Comentários
- Por que minha pergunta aqui unix.stackexchange.com/questions/458801/… foi marcado como duplicado? Acredito que ' seja diferente, pois desejo ser promovido a inserir o nome de usuário e não apenas a senha.
Resposta
Obrigado,
Modifiquei meu script substituindo a linha:
spawn ssh [email protected]
com este outro, como você me diz:
spawn ssh [email protected] “ls -la; ps -af”
Agora vejo a saída dos comandos na tela e posso redirecionar para um arquivo.
Em seguida, tentei adaptar este script para executar um comando em outra máquina que seja um switch Cisco (não é Cisco, mas é compatível).
O script com o qual me conecto ao switch usando ssh é:
** #! / usr / bin / expect -f
definir o tempo limite 120
spawn ssh [email protected] “show vlan 500”
expect “assword:”
send “PASSWORD \ r”
expect “prompt # “
sleep 5
puts” Fechando a sessão ssh \ r “
send” exit \ r “**
Isso não funciona no switch e recebo este erro:
spawn ssh [email protected] show vlan 501
usuá[email protected] “s senha:
imish: opção inválida -” c “
Tente` imish –help “para mais informações.
send: spawn id exp6 not open
while executing
“send” exit \ r “”
(file "./ssh_script_v3.exp" line 7)
Portanto, devo usar o script expect que envia o comando usando “send”:
! / usr / bin / expect
spawn ssh [email protected]
expect “assword:”
send “user \ r”
expect “>”
dormir 5
enviar “sh vlan 500 \ r”
dormir 5
enviar “sair \ r”
Agora não recebo nenhum erro, mas nada é mostrado na tela.
Eu li que isso acontece porque os sistemas Linux e UNIX armazenam em buffer automaticamente sua saída quando são executados de forma não interativa. Acho que o Expect pode fazer os programas pensarem que estão rodando interativamente por meio de “unbuffer”, mas não sei como usar “unbuffer” com “send”. Minhas tentativas de fazer isso não funcionam.
spawn ssh [email protected] ls -la>Ls
?expect -d ssh_connection.exp
e veja onde estão os problemas. A primeira coisa que ' d recomendo é substituir todos os dormentes porexpect "prompt#"