Minun täytyy kirjoittaa komentosarja, joka toimii tietokoneella, jossa on Centos 7, ja muodostaa yhteyden toiseen tietokoneeseen, jossa on Centos 7 Suorita ssh: n avulla konsolikomento, esimerkiksi ”ls -la” ja tallenna sen ulostulo tiedostoon, jotta voit myöhemmin analysoida tuotoksen.
Olen kirjoittanut seuraavan EXPECT-komentosarjan:
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"
Tämä komentosarja yhdistyy oikein ssh: n kautta koneeseen, jonka IP = 129.0.0.10, ja näyttää näytöllä viestit joka näkyy ”put” -kohdassa: Suoritetaan ls -la Suoritetaan ps -af ssh-istunnon sulkeminen
Se ei kuitenkaan näytä lähetettyjen komentojeni suorittamisen tulosta:
ls -la ps -af
Mitä vikaa tässä komentosarjassa on?
Kuinka voin tehdä tiedostoon tallennettujen edellisten komentojen lähdön analysoimaan sitä myöhemmin bashilla komentosarja tai C-ohjelma?
Kommentit
Vastaa
Sinun ei tarvitse käyttää tätä expect
. ssh
-komento voi ottaa lisää argumentteja komennoista, jotka haluat suorittaa SSH-yhteyden kautta.
Vaihe # 1
Asenna SSH-avainpari (google se) ja kopioi sitten SSH avain etäpalvelimeen. Tätä varten suosittelen käyttämään ssh-copy-id
. Katso vastaukseni tähän U & LQ & A otsikkoon: Kuinka kopioida oikein yksityiset avaimet etäpalvelimilta paikalliseen koneeseeni, jotta voin muodostaa yhteyden ssh: n avulla .
Vaihe # 2
Nyt mahdollisuus SSH-palvelimeen paikallaan avaimen avulla , yllä oleva ongelmasi muuttuu seuraavaksi:
$ ssh [email protected] "ls -la; ps -af"
Voit hemmotella itseäsi ja käyttää täällä olevia dokumentteja (heredocs aka . here-docs) tämän tekniikan parantamiseksi edelleen.
$ ssh [email protected] <<EOF > ls -la > ps -af > EOF
tai laita komennot tiedostoon ja välitä ne osoitteeseen ssh
:
$ ssh [email protected] < my.cmds
kommentit
- miksi kysymykseni on täällä unix.stackexchange.com/questions/458801/… merkittiin kaksoiskappaleeksi? Uskon, että se on ' erilainen, kun haluan saada ylennetyn käyttäjänimen kirjoittamisen paitsi salasanan.
Vastaa
Kiitos,
Olen muokannut komentosarjaani korvaamalla rivi:
kutee ssh [email protected]
tämän toisen kanssa, kuten kerrot minulle:
kutee ssh [email protected] ”ls -la; ps -af”
Nyt näen komennot näytöllä ja voin ohjata tiedoston.
Seuraavaksi yritin sovittaa tämän komentosarjan suorittamaan komennon toisella koneella, joka on Cisco-tyyppinen kytkin (se ei ole Cisco, mutta se on yhteensopiva).
Skripti, jolla yhdistän kytkimeen ssh: n avulla, on:
** #! / usr / bin / várható -f
aseta aikakatkaisu 120
kutee ssh [email protected] ”näytä vlan 500”
várita ”assword:”
lähetä ”SALASANA \ r”
odotettavissa ”-kehote # ”
sleep 5
laittaa” ssh-istunnon sulkemisen \ r ”
send” exit \ r ”**
Tämä ei toimi kytkimessä ja saan tämän virheen:
spawn ssh [email protected] näytä vlan 501
[email protected]: n salasana:
imish: virheellinen vaihtoehto – ”c”
Kokeile lisää `imish –help tiedot.
send: spawn id exp6 not open
while executing
”send” exit \ r ””
(file "./ssh_script_v3.exp" line 7)
Joten minun on käytettävä odottavaa komentosarjaa, joka lähettää komennon ”send” -toiminnolla:
! / usr / bin / várta
kutee ssh käyttäjä@129.0.0.50
odotettavissa ”assword:”
lähetä ”käyttäjä \ r”
odotettavissa ”>”
sleep 5
send ”sh vlan 500 \ r”
sleep 5
send ”exit \ r”
Nyt en saa virheitä, mutta mitään ei näytetä näytöllä.
Olen lukenut, että tämä tapahtuu, koska linux- ja UNIX-järjestelmät puskuroivat lähdön automaattisesti, kun ne toimivat ei-vuorovaikutteisesti. Luulen, että Expect voi saada ohjelmat ajattelemaan, että ne toimivat vuorovaikutteisesti ”unbufferin” avulla, mutta en tiedä miten käyttää ”unbuffer” -toimintoa ”send” -toiminnon kanssa. Asennukseni tehdä tämä, älä toimi.
spawn ssh [email protected] ls -la>Ls
?expect -d ssh_connection.exp
ja katso missä ongelmat ovat. Ensimmäinen asia, jota ' suosittelen, on korvata kaikki unetexpect "prompt#"