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
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
- Hvorfor mit spørgsmål her unix.stackexchange.com/questions/458801/… blev markeret som duplikat? Jeg tror, det ' er anderledes, da jeg ønsker at blive forfremmet for at indtaste brugernavnet, ikke kun adgangskoden.
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.
spawn ssh [email protected] ls -la>Ls
?expect -d ssh_connection.exp
og se, hvor problemerne er. Den første ting, jeg ' anbefaler, er at erstatte alle sovepladser medexpect "prompt#"