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

  • Basta usar um sta Comando ndard ssh com chaves ssh e um heredoc
  • Parece que você está complicando as coisas. Você não precisa usar o expect para automatizar coisas via ssh.
  • você tentou um comando como spawn ssh [email protected] ls -la>Ls?
  • Execute seu script com expect -d ssh_connection.exp e veja onde estão os problemas. A primeira coisa que ' d recomendo é substituir todos os dormentes por expect "prompt#"

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

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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *