Jeg skal skrive et script, der kører på en pc med Centos 7 og forbinder til en anden pc med Centos 7 ved hjælp af ssh, udfør en konsolkommando, for eksempel “ls -la”, og gem output for den i en fil for senere at kunne analysere den output.

Jeg har skrevet følgende EXPECT-script:

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" 

Dette script forbinder korrekt gennem ssh til maskinen med IP = 129.0.0.10 og viser meddelelserne på skærmen der vises på “sætter”: Udfører ls -la Udfører ps -af Lukning af ssh-sessionen

Det viser dog ikke resultatet af udførelsen af de kommandoer, jeg sender med send:

ls -la ps -af 

Hvad er der galt med dette script?

Hvordan kan jeg lave output fra de tidligere kommandoer gemt i en fil for at kunne analysere det senere med en bash script eller et C-program?

Kommentarer

  • Brug bare en sta ndard ssh-kommando med ssh-nøgler og en heredoc
  • Det ser ud til, at du overkompliserer ting. Du behøver ikke bruge forvente at automatisere ting via ssh.
  • prøvede du en kommando som spawn ssh [email protected] ls -la>Ls?
  • Kør dit script med expect -d ssh_connection.exp og se, hvor problemerne er. Den første ting, jeg ' anbefaler, er at erstatte alle sovepladser med expect "prompt#"

Svar

Du behøver ikke bruge expect til at gøre dette. ssh kommandoen kan tage yderligere argumenter for kommandoer, du vil køre via SSH-forbindelsen.

Trin # 1

Opsæt et SSH-nøglepar (google det) og kopier derefter SSH nøgle til fjernserveren. For at gøre dette anbefaler jeg at bruge ssh-copy-id. Se mit svar på denne U & LQ & A med titlen: Sådan kopieres korrekt private nøgler fra eksterne servere til min lokale maskine, så jeg kan oprette forbindelse ved hjælp af ssh .

Trin # 2

Nu med muligheden for at SSH til en server på plads ved hjælp af en nøgle , bliver dit ovenstående problem til dette:

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

Du kan få lyst til at bruge her dokumenter (heredocs aka . her-docs) for yderligere at forbedre denne teknik.

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

eller læg kommandoerne i en fil og send dem til ssh:

$ ssh [email protected] < my.cmds 

Kommentarer

Svar

Tak,

Jeg har ændret mit script, der erstatter linjen:

spawn ssh [email protected]

med denne anden, som du fortæller mig:

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

Nu ser jeg kommandoerne, der sendes ud på skærmen og jeg kan omdirigere til en fil.

Derefter forsøgte jeg at tilpasse dette script til at udføre en kommando på en anden maskine, der er en Cisco-lignende switch (den er ikke Cisco, men den er kompatibel).

Scriptet, som jeg forbinder til switchen ved hjælp af ssh, er:

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

set timeout 120

spawn ssh [email protected] “show vlan 500”

expect “assword:”

send “PASSWORD \ r”

expect “prompt # “

sleep 5

sætter” Lukning af ssh-session \ r “

send” exit \ r “**

Dette fungerer ikke på kontakten, og jeg får denne fejl:

spawn ssh [email protected] show vlan 501

[email protected] “s password:

imish: ugyldig mulighed -” c “

Prøv` imish –help “for mere information.

send: spawn id exp6 er ikke åben

while executing 

“send” exit \ r “”

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

Så jeg skal bruge det forventede script, der sender kommandoen ved hjælp af “send”:

! / usr / bin / expect

spawn ssh [email protected]

forvent “assword:”

send “bruger \ r”

forvent “>”

sleep 5

send “sh vlan 500 \ r”

sleep 5

send “exit \ r”

Nu får jeg ingen fejl, men intet vises på skærmen.

Jeg har læst, at dette sker, fordi linux- og UNIX-systemer automatisk buffer deres output, når de kører ikke-interaktivt. Jeg tror, at Expect kan få programmerne til at tro, at de kører interaktivt ved hjælp af “unbuffer”, men jeg ved ikke, hvordan man bruger “unbuffer” med “send”. Mine forsøg på at gøre dette fungerer ikke.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *