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
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
- Perché la mia domanda qui unix.stackexchange.com/questions/458801/… è stato contrassegnato come duplicato? Credo che ' sia diverso in quanto voglio essere promosso per inserire il nome utente e non solo la password.
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.
spawn ssh [email protected] ls -la>Ls
?expect -d ssh_connection.exp
e vedi dove sono i problemi. La prima cosa che ' consiglio è di sostituire tutti i posti letto conexpect "prompt#"