Esperar script conecta com ssh mas não executa comandos

0

Eu preciso escrever um script que rode em um PC com o Centos 7 e conecte a outro PC com o Centos 7 usando ssh, execute um comando de console, por exemplo "ls -la" e salve a saída dele em um arquivo para ser capaz de 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 conecta-se corretamente através do ssh à máquina com o IP = 129.0.0.10 e exibe na tela as mensagens que aparecem em "puts": Executando ls -la Executando ps -af Fechando a sessão ssh

No entanto, ele não mostra o resultado da execução dos comandos enviados com envio:

ls -la
ps -af

O que há de errado com esse script?

Como posso fazer a saída dos comandos anteriores salvos em um arquivo para poder analisá-lo posteriormente com um script bash ou um programa em C?

    
por jstechg 27.07.2018 / 11:41

2 respostas

0

Você não precisa usar expect para fazer isso. O comando ssh pode receber argumentos adicionais dos comandos que você deseja executar por meio da conexão SSH.

Etapa 1

Configure um par de chaves SSH (google it) e copie a chave SSH para o servidor remoto. Para fazer isso, eu recomendo usar ssh-copy-id . Veja minha resposta a essa pergunta e resposta com os títulos da U & L intitulada: Como copiar corretamente chaves privadas de servidores remotos para o meu localmachine para que eu possa se conectar usando ssh .

Etapa 2

Agora com a capacidade de usar o SSH em um servidor usando uma chave, seu problema acima se transforma nisso:

$ ssh [email protected] "ls -la; ps -af"

Você pode se interessar e usar aqui os documentos (heredocs aka. here-docs) para melhorar ainda mais essa 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
    
por 27.07.2018 / 12:21
0

Obrigado,

Eu 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 esse script para executar um comando em outra máquina que é um switch similar da Cisco (não é Cisco, mas é compatível).

O script com o qual eu me conecto ao switch usando ssh é:

** #! / usr / bin / expect -f

tempo limite definido 120

spawn ssh [email protected] "show vlan 500"

espere "assword:"

envie "PASSWORD \ r"

espere "prompt #"

dormir 5

coloca "Fechando a sessão ssh \ r"

enviar "sair \ r" **

>

Isso não funciona no switch e eu recebo este erro:

spawn ssh [email protected] mostra vlan 501

senha do usuá[email protected]:

imish: opção inválida - 'c'

Tente 'imish --help' para mais informações.

send: exp de identificação do spawn não aberto

while executing

"enviar" sair \ 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]

espere "assword:"

envie "usuário \ r"

espere ">"

dormir 5

envie "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 automaticamente sua saída quando executados de forma não interativa. Eu acho que o Expect pode fazer os programas pensarem que eles estão rodando interativamente por meio de "unbuffer", mas eu não sei como usar "unbuffer" com "send". Minhas tentativas para fazer isso, não funcionam.

    
por 27.07.2018 / 18:01