Am nevoie să scriu un script care rulează pe un PC cu Centos 7 și se conectează la un alt PC cu Centos 7 folosind ssh, executați o comandă de consolă, de exemplu „ls -la” și salvați ieșirea acestuia într-un fișier pentru a putea analiza ulterior ieșirea respectivă.
Am scris următorul 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"
Acest script se conectează corect prin ssh la mașină cu IP = 129.0.0.10 și afișează pe ecran mesajele care apare pe „pune”: Executarea ls -la Executarea ps -af Închiderea sesiunii ssh
Cu toate acestea, nu arată rezultatul executării comenzilor pe care le trimit cu send:
ls -la ps -af
Ce este în neregulă cu acest script?
Cum pot face ieșirea comenzilor anterioare salvate într-un fișier pentru a o putea analiza ulterior cu un bash script sau un program C?
Comentarii
Răspunde
Nu trebuie să folosești expect
pentru a face acest lucru. ssh
poate lua argumente suplimentare pentru comenzile pe care doriți să le rulați prin conexiunea SSH.
Pasul 1 1
Configurați o pereche de chei SSH (google it) și apoi copiați SSH-ul cheie pentru serverul la distanță. Pentru a face acest lucru, aș recomanda utilizarea ssh-copy-id
. Vedeți răspunsul meu la acest U & LQ & Un titlu: Cum se copiază corect chei private de la servere la distanță la mașina mea locală, astfel încât să mă pot conecta folosind ssh .
Pasul # 2
Acum, cu posibilitatea de a SSH pe un server în loc folosind o cheie , problema dvs. de mai sus se transformă în aceasta:
$ ssh [email protected] "ls -la; ps -af"
Puteți obține fantezie și puteți utiliza aici documente (heredocs aka . here-docs) pentru a îmbunătăți în continuare această tehnică.
$ ssh [email protected] <<EOF > ls -la > ps -af > EOF
sau puneți comenzile într-un fișier și le transmiteți la ssh
:
$ ssh [email protected] < my.cmds
Comentarii
- De ce întrebarea mea aici unix.stackexchange.com/questions/458801/… a fost marcat ca duplicat? Cred că ' este diferit, întrucât vreau să fiu promovat pentru a introduce numele de utilizator nu doar parola.
Răspuns
Mulțumesc,
Mi-am modificat scriptul înlocuind linia:
spawn ssh [email protected]
cu celălalt, așa cum îmi spuneți:
spawn ssh [email protected] „ls -la; ps -af”
Acum văd comenzile ieșite pe ecran și pot redirecționa către un fișier.
Apoi am încercat să adaptez acest script pentru a executa o comandă pe o altă mașină care este un switch Cisco (nu este Cisco, dar este compatibil).
Scriptul cu care mă conectez la switch folosind ssh este:
** #! / usr / bin / expect -f
set timeout 120
spawn ssh [email protected] „arată vlan 500”
expect „assword:”
trimite „PASSWORD \ r”
expect „prompt # „
sleep 5
pune„ Închiderea sesiunii ssh \ r ”
trimite„ exit \ r ”**
Acest lucru nu funcționează pe comutator și primesc această eroare:
spawn ssh [email protected] arată parola vlan 501
imish: opțiune nevalidă -” c „
Încercați` imish –help „pentru mai multe informații.
send: spawn id exp6 not open
while executing
„send” exit \ r „”
(file "./ssh_script_v3.exp" line 7)
Deci trebuie să folosesc scriptul expect care trimite comanda folosind „send”:
! / usr / bin / expect
spawn ssh [email protected]
expect „assword:”
send „user \ r”
expect „>”
sleep 5
send „sh vlan 500 \ r”
sleep 5
send „exit \ r”
Acum nu primesc nicio eroare, dar nimic nu este afișat pe ecran.
Am citit că acest lucru se întâmplă deoarece sistemele Linux și UNIX tamponează automat ieșirea atunci când rulează non-interactiv. Cred că Expect poate face ca programele să creadă că rulează interactiv prin intermediul „unbuffer”, dar nu știu cum să folosesc „unbuffer” cu „send”. Încercările mele de a face acest lucru nu funcționează.
spawn ssh [email protected] ls -la>Ls
?expect -d ssh_connection.exp
și vedeți unde sunt problemele. Primul lucru pe care l-am recomandat ' este să înlocuiesc toate somnurile cuexpect "prompt#"