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
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
- Varför min fråga här unix.stackexchange.com/questions/458801/… var markerad som duplikat? Jag tror att det ' är annorlunda eftersom jag vill bli befordrad för att ange användarnamnet inte bara lösenordet.
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.
spawn ssh [email protected] ls -la>Ls
?expect -d ssh_connection.exp
och se var problemen är. Det första jag ' rekommenderar är att ersätta alla sovplatser medexpect "prompt#"