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

  • Folosiți doar un sta comanda ndard ssh cu chei ssh și un heredoc
  • Se pare că sunteți prea complicat. Nu trebuie să folosiți expect pentru a automatiza lucruri prin ssh.
  • ați încercat o comandă precum spawn ssh [email protected] ls -la>Ls?
  • Rulați scriptul cu expect -d ssh_connection.exp și vedeți unde sunt problemele. Primul lucru pe care l-am recomandat ' este să înlocuiesc toate somnurile cu expect "prompt#"

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

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

[email protected] „:

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ă.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *