Ik moet een script schrijven dat op een pc met Centos 7 draait en verbinding maakt met een andere pc met Centos 7 gebruik ssh, voer een console-opdracht uit, bijvoorbeeld “ls -la” en sla de uitvoer ervan op in een bestand om die uitvoer later te kunnen analyseren.
Ik heb het volgende EXPECT-script geschreven:
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"
Dit script maakt correct verbinding via ssh met de machine met IP = 129.0.0.10 en toont op het scherm de berichten dat verschijnt op “put”: Uitvoeren van ls -la Uitvoeren van ps -af De ssh-sessie sluiten
Het toont echter niet het resultaat van het uitvoeren van de opdrachten die ik verstuur met send:
ls -la ps -af
Wat is er mis met dit script?
Hoe kan ik de uitvoer van de vorige commandos opslaan in een bestand om het later te kunnen analyseren met een bash script of een C-programma?
Reacties
Antwoord
U hoeft expect
niet te gebruiken om dit te doen. De ssh
commando kan extra argumenten aannemen van commandos die je via de SSH-verbinding wilt uitvoeren.
Stap # 1
Stel een SSH-sleutelpaar in (google it) en kopieer vervolgens de SSH sleutel naar de externe server. Om dit te doen, raad ik aan ssh-copy-id
te gebruiken. Zie mijn antwoord hierop U & LQ & A met de titel: Correct kopiëren privésleutels van externe servers naar mijn lokale computer zodat ik verbinding kan maken met ssh .
Stap 2
Nu met de mogelijkheid om SSH naar een server te plaatsen met behulp van een sleutel , verandert je bovenstaande probleem in dit:
$ ssh [email protected] "ls -la; ps -af"
Je kunt er fantasie van krijgen en hier documenten (heredocs aka . here-docs) om deze techniek verder te verbeteren.
$ ssh [email protected] <<EOF > ls -la > ps -af > EOF
of plaats de opdrachten in een bestand en geef ze door aan ssh
:
$ ssh [email protected] < my.cmds
Reacties
- Waarom mijn vraag hier unix.stackexchange.com/questions/458801/… is gemarkeerd als duplicaat? Ik denk dat het ' anders is, aangezien ik gepromoveerd wil worden om de gebruikersnaam in te voeren, niet alleen het wachtwoord.
Antwoord
Bedankt,
Ik heb mijn script aangepast door de regel te vervangen:
spawn ssh [email protected]
met deze andere, zoals je me vertelt:
spawn ssh [email protected] “ls -la; ps -af”
Nu zie ik de uitvoer van de opdrachten op het scherm en ik kan omleiden naar een bestand.
Vervolgens probeerde ik dit script aan te passen om een opdracht uit te voeren op een andere computer die een Cisco-achtige switch is (het is niet Cisco, maar het is compatibel).
Het script waarmee ik verbinding maak met de switch via ssh is:
** #! / usr / bin / verwacht -f
time-out 120 instellen
spawn ssh [email protected] “show vlan 500”
verwacht “assword:”
stuur “PASSWORD \ r”
verwacht “prompt # “
slaap 5
zet” Sluit de ssh-sessie \ r “
verzend” exit \ r “**
Dit werkt niet op de switch en ik krijg deze foutmelding:
spawn ssh [email protected] show vlan 501
[email protected] “s wachtwoord:
imish: ongeldige optie -” c “
Probeer` imish –help “voor meer informatie.
send: spawn id exp6 niet open
while executing
“send” exit \ r “”
(file "./ssh_script_v3.exp" line 7)
Dus ik moet het verwachte script gebruiken dat het commando verzendt met “send”:
! / usr / bin / verwacht
spawn ssh [email protected]
verwacht “assword:”
stuur “user \ r”
verwacht “>”
slaap 5
stuur “sh vlan 500 \ r”
slaap 5
stuur “exit \ r”
Nu krijg ik geen foutmelding, maar er wordt niets op het scherm weergegeven.
Ik heb gelezen dat dit gebeurt omdat linux- en UNIX-systemen hun uitvoer automatisch bufferen wanneer ze niet-interactief worden uitgevoerd. Ik denk dat Expect de programmas kan laten denken dat ze interactief draaien door middel van “unbuffer”, maar ik weet niet hoe ik “unbuffer” moet gebruiken met “send”. Mijn pogingen om dit te doen, werken niet.
spawn ssh [email protected] ls -la>Ls
geprobeerd?expect -d ssh_connection.exp
en kijk waar de problemen zitten. Het eerste dat ik ' aanbeveel, is om alle slaapstanden te vervangen doorexpect "prompt#"