Jeg trenger å skrive et skript som kjører på en PC med Centos 7 og kobles til en annen PC med Centos 7 ved å bruke ssh, utfør en konsollkommando, for eksempel «ls -la» og lagre utgangen av den i en fil for senere å kunne analysere den utgangen.

Jeg har skrevet følgende EXPECT-skript:

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 skriptet kobles riktig gjennom ssh til maskinen med IP = 129.0.0.10 og viser meldingene på skjermen som vises på «puts»: Utføre ls -la Utføre ps -af Lukke ssh-sesjonen

Det viser imidlertid ikke resultatet av å utføre kommandoene jeg sender med send:

ls -la ps -af 

Hva er galt med dette skriptet?

Hvordan kan jeg lage utdataene fra de forrige kommandoene lagret i en fil for å kunne analysere det senere med en bash skript eller et C-program?

Kommentarer

  • Bare bruk en sta ndard ssh-kommando med ssh-nøkler og en heredoc
  • Det virker som om du overkompliserer ting. Du trenger ikke bruke forvent å automatisere ting via ssh.
  • prøvde du en kommando som spawn ssh [email protected] ls -la>Ls?
  • Kjør skriptet ditt med expect -d ssh_connection.exp og se hvor problemene er. Det første jeg ' anbefaler, er å erstatte alle soveplassene med expect "prompt#"

Svar

Du trenger ikke å bruke expect for å gjøre dette. ssh -kommandoen kan ta flere argumenter for kommandoer du vil kjøre via SSH-tilkoblingen.

Trinn 1

Sett opp et SSH-nøkkelpar (google det) og kopier deretter SSH nøkkel til den eksterne serveren. For å gjøre dette anbefaler jeg å bruke ssh-copy-id. Se svaret mitt på denne U & LQ & A med tittelen: Hvordan kopiere riktig private nøkler fra eksterne servere til min lokale maskin slik at jeg kan koble til ved hjelp av ssh .

Trinn # 2

Nå med muligheten til å SSH til en server på plass ved hjelp av en nøkkel , problemet ditt ovenfor blir til dette:

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

Du kan bli fancy og bruke her dokumenter (heredocs aka . her-docs) for å forbedre denne teknikken ytterligere.

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

eller legg kommandoene i en fil og send dem til ssh:

$ ssh [email protected] < my.cmds 

Kommentarer

Svar

Takk,

Jeg har endret skriptet mitt og erstattet linjen:

spawn ssh [email protected]

med denne andre, som du forteller meg:

spawn ssh [email protected] «ls -la; ps -af»

Nå ser jeg kommandoene som sendes ut på skjermen og jeg kan omdirigere til en fil.

Deretter prøvde jeg å tilpasse dette skriptet for å utføre en kommando på en annen maskin som er en Cisco-lignende bryter (den er ikke Cisco, men den er kompatibel).

Skriptet som jeg kobler til bryteren med 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

putter» Lukking av ssh-sesjonen \ r «

send» exit \ r «**

Dette fungerer ikke på bryteren, og jeg får denne feilen:

spawn ssh [email protected] show vlan 501

[email protected] «passord:

imish: ugyldig alternativ -» c «

Prøv` imish –help «for mer informasjon.

send: spawn id exp6 ikke åpen

while executing 

«send» exit \ r «»

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

Så jeg må bruke forventningsskriptet som sender kommandoen med «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»

Nå får jeg ingen feil, men ingenting vises på skjermen.

Jeg har lest at dette skjer fordi linux- og UNIX-systemer automatisk buffer utdataene sine når de kjører ikke-interaktivt. Jeg tror at Expect kan få programmene til å tro at de kjører interaktivt ved hjelp av «unbuffer», men jeg vet ikke hvordan jeg skal bruke «unbuffer» med «send». Mine forsøk på å gjøre dette, fungerer ikke.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *