Jag måste skriva ett skript som körs på en dator med Centos 7 och ansluter till en annan dator med Centos 7 genom att använda ssh, kör ett konsolkommando, till exempel ”ls -la” och spara utdata från den till en fil för att senare kunna analysera den utdata.

Jag har skrivit följande 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" 

Detta skript ansluts korrekt genom ssh till maskinen med IP = 129.0.0.10 och visar meddelandena på skärmen som visas på ”puts”: Exekvera ls -la Exekvera ps -af Stänga ssh-sessionen

Det visar dock inte resultatet av att köra kommandona jag skickar med send:

ls -la ps -af 

Vad är fel med det här skriptet?

Hur kan jag göra utdata från tidigare kommandon sparade i en fil för att kunna analysera det senare med en bash skript eller ett C-program?

Kommentarer

  • Använd bara en sta ndard ssh-kommando med ssh-tangenter och en heredoc
  • Det verkar som om du överkomplicerar saker. Du behöver inte använda förvänta dig att automatisera saker via ssh.
  • försökte du ett kommando som spawn ssh [email protected] ls -la>Ls?
  • Kör ditt skript med expect -d ssh_connection.exp och se var problemen är. Det första jag ' rekommenderar är att ersätta alla sovplatser med expect "prompt#"

Svar

Du behöver inte använda expect för att göra detta. ssh -kommandot kan ta ytterligare argument för kommandon som du vill köra via SSH-anslutningen.

Steg # 1

Ställ in ett SSH-nyckelpar (google det) och kopiera sedan SSH nyckel till fjärrservern. För att göra detta rekommenderar jag att du använder ssh-copy-id. Se mitt svar på denna U & LQ & A med titeln: Hur man kopierar korrekt privata nycklar från fjärrservrar till min lokala maskin så att jag kan ansluta med ssh .

Steg # 2

Nu med möjligheten att SSH till en server på plats med en nyckel , ditt ovannämnda problem blir till detta:

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

Du kan bli snäll och använda här dokument (heredocs aka . här-docs) för att ytterligare förbättra denna teknik.

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

eller lägg kommandona i en fil och skicka dem till ssh:

$ ssh [email protected] < my.cmds 

Kommentarer

Svar

Tack,

Jag har ändrat mitt skript som ersätter raden:

spawn ssh [email protected]

med den här andra, som du säger till mig:

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

Nu ser jag kommandona på skärmen och jag kan omdirigera till en fil.

Därefter försökte jag anpassa det här skriptet för att utföra ett kommando på en annan maskin som är en Cisco-liknande switch (det är inte Cisco, men det är kompatibelt).

Skriptet som jag ansluter till växeln med ssh är:

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

set timeout 120

spawn ssh [email protected] ”visa vlan 500”

förvänta sig ”assword:”

skicka ”LÖSENORD \ r”

förvänta sig ”prompten # ”

sleep 5

placerar” Avsluta ssh-session \ r ”

skicka” exit \ r ”**

Detta fungerar inte på omkopplaren och jag får det här felet:

spawn ssh [email protected] show vlan 501

[email protected] ”s lösenord:

imish: ogiltigt alternativ -” c ”

Försök med” imish –help ”för mer information.

skicka: spawn id exp6 öppnas inte

while executing 

”skicka” exit \ r ””

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

Så jag måste använda förväntningsskriptet som skickar kommandot med ”skicka”:

! / usr / bin / expect

spawn ssh [email protected]

expect ”assword:”

send ”user \ r”

expect ”>”

sömn 5

skicka ”sh vlan 500 \ r”

sömn 5

skicka ”exit \ r”

Nu får jag inget fel, men inget visas på skärmen.

Jag har läst att detta händer eftersom Linux- och UNIX-system automatiskt buffrar utdata när de körs icke-interaktivt. Jag tror att Expect kan få programmen att tro att de körs interaktivt med hjälp av ”unbuffer”, men jag vet inte hur man använder ”unbuffer” med ”send”. Mina försök att göra detta fungerar inte.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *