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
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
- Hvorfor spørsmålet mitt her unix.stackexchange.com/questions/458801/… ble merket som duplikat? Jeg tror det ' er annerledes da jeg ønsker å bli forfremmet for å skrive inn brukernavnet, ikke bare passordet.
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.
spawn ssh [email protected] ls -la>Ls
?expect -d ssh_connection.exp
og se hvor problemene er. Det første jeg ' anbefaler, er å erstatte alle soveplassene medexpect "prompt#"