Devo scrivere uno script che gira su un PC con Centos 7 e si connette a un altro PC con Centos 7 usando ssh, esegui un comando da console, ad esempio “ls -la” e salva loutput di esso in un file per poterlo analizzare successivamente.

Ho scritto il seguente 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" 

Questo script si connette correttamente tramite ssh alla macchina con IP = 129.0.0.10 e visualizza sullo schermo i messaggi che appare su “put”: Esecuzione di ls -la Esecuzione di ps -af Chiusura della sessione ssh

Tuttavia, non mostra il risultato dellesecuzione dei comandi che invio con send:

ls -la ps -af 

Cosa cè di sbagliato in questo script?

Come posso salvare in un file loutput dei comandi precedenti per poterlo analizzare in seguito con un bash script o un programma in C?

Commenti

  • Usa semplicemente uno sta Comando ndard ssh con chiavi ssh e heredoc
  • Sembra che tu stia complicando troppo le cose. Non è necessario utilizzare si aspettano di automatizzare le cose tramite ssh.
  • hai provato un comando come spawn ssh [email protected] ls -la>Ls?
  • Esegui lo script con expect -d ssh_connection.exp e vedi dove sono i problemi. La prima cosa che ' consiglio è di sostituire tutti i posti letto con expect "prompt#"

Risposta

Non è necessario utilizzare expect per eseguire questa operazione. ssh può accettare argomenti aggiuntivi dei comandi che desideri eseguire tramite la connessione SSH.

Passaggio n. 1

Imposta una coppia di chiavi SSH (google it) e quindi copia lSSH key per il server remoto. Per fare ciò, ti consiglio di utilizzare ssh-copy-id. Vedi la mia risposta a questa U & LQ & A intitolata: Come copiare correttamente chiavi private dai server remoti alla mia macchina locale in modo che possa connettermi utilizzando ssh .

Passaggio 2

Ora con la possibilità di SSH su un server in posizione utilizzando una chiave , il tuo problema precedente si trasforma in questo:

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

Puoi essere fantasioso e usare qui documenti (heredocs aka . here-docs) per migliorare ulteriormente questa tecnica.

$ ssh [email protected] <<EOF > ls -la > ps -af > EOF 

oppure metti i comandi in un file e passali a ssh:

$ ssh [email protected] < my.cmds 

Commenti

Risposta

Grazie,

Ho modificato il mio script sostituendo la riga:

spawn ssh [email protected]

con questaltro, come mi dici:

spawn ssh [email protected] “ls -la; ps -af”

Ora vedo loutput dei comandi sullo schermo e posso reindirizzare a un file.

Successivamente ho provato ad adattare questo script per eseguire un comando su unaltra macchina che è uno switch simile a Cisco (non è Cisco, ma è compatibile).

Lo script con cui mi collego allo switch utilizzando ssh è:

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

set timeout 120

spawn ssh [email protected] “show vlan 500”

aspetta “assword:”

invia il prompt “PASSWORD \ r”

aspetta ” # “

sleep 5

inserisce” Chiusura della sessione ssh \ r “

invia” exit \ r “**

Non funziona sullo switch e ottengo questo errore:

spawn ssh [email protected] show vlan 501

[email protected] “s password:

imish: invalid option -” c “

Prova” imish –help “per ulteriori informazioni informazioni.

invia: spawn id exp6 non aperto

while executing 

“send” exit \ r “”

(file "./ssh_script_v3.exp" line 7) 

Quindi devo usare lo script previsto che invia il comando utilizzando “send”:

! / usr / bin / wait

spawn ssh [email protected]

aspetta “assword:”

invia “utente \ r”

aspetta “>”

sleep 5

invia “sh vlan 500 \ r”

sleep 5

invia “exit \ r”

Ora non ricevo alcun errore, ma sullo schermo non viene visualizzato nulla.

Ho letto che questo accade perché i sistemi Linux e UNIX bufferizzano automaticamente loutput quando vengono eseguiti in modo non interattivo. Penso che Expect possa far credere ai programmi di essere in esecuzione in modo interattivo tramite “unbuffer”, ma non so come usare “unbuffer” con “send”. I miei tentativi per farlo non funzionano.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *