Overzicht
`expect` automatiseert interactieve sessies door te wachten op vooraf gedefinieerde patronen (bijv. prompt-strings) en vervolgens specifieke strings (bijv. gebruikersinvoer) te verzenden. Hierdoor kunnen complexe taken worden uitgevoerd zonder handmatige tussenkomst.
Belangrijkste kenmerken
- Tcl-gebaseerde scriptingtaalextensie
- Automatisering van interacties met interactieve programma's (bijv. ssh, ftp, telnet)
- Functies voor het matchen van promptpatronen en het verzenden van antwoorden
- Nuttig voor het automatiseren van repetitieve en handmatige taken
Belangrijkste opties
Dit zijn opties die de uitvoeringsmethode van het `expect`-commando zelf regelen. Ze verschillen van de `expect`- en `send`-commando's die binnen scripts worden gebruikt.
Uitvoeringscontrole en debugging
Gegenereerde opdracht:
Probeer de opdrachtcombinaties.
Uitleg:
`expect` Voer het commando uit.
Combineer deze opties en voer de opdracht virtueel uit met de AI.
Installatie
`expect` is niet standaard inbegrepen in de meeste Linux-distributies en moet daarom worden geïnstalleerd via een pakketbeheerder.
Debian/Ubuntu
sudo apt update && sudo apt install expect
Installeer `expect` met de APT-pakketbeheerder.
RHEL/CentOS/Fedora
sudo dnf install expect
Installeer `expect` met de DNF (of Yum) pakketbeheerder.
Gebruiksvoorbeelden
`expect`-scripts hebben meestal de extensie `.exp` en beginnen met `#!/usr/bin/expect` om te worden uitgevoerd door de `expect`-interpreter.
Automatisch antwoorden op een eenvoudige prompt
#!/usr/bin/expect
set timeout 10
spawn sh -c "echo -n 'Proceed? (y/n) '
read response"
expect "Proceed? (y/n) "
send "y\r"
expect eof
Een script dat automatisch 'y' invoert op een vraag zoals `Proceed? (y/n)`. (Gebruikt `sh` voor het voorbeeld)
SSH-login automatisering (veiligheidswaarschuwing)
#!/usr/bin/expect
set timeout 20
set username "your_user"
set hostname "your_host"
set password "your_password"
spawn ssh $username@$hostname
expect "password:"
send "$password\r"
expect "$"
send "ls -l\r"
expect "$"
send "exit\r"
expect eof
Een voorbeeld van het automatisch inloggen op een externe server via SSH en het uitvoeren van commando's. **Het direct opnemen van wachtwoorden in scripts is zeer onveilig en wordt in productieomgevingen niet aanbevolen.**
Automatiseren van het passwd-commando (veiligheidswaarschuwing)
#!/usr/bin/expect
set timeout 10
set old_pass "old_password"
set new_pass "new_password"
spawn passwd
expect "Current password:"
send "$old_pass\r"
expect "New password:"
send "$new_pass\r"
expect "Retype new password:"
send "$new_pass\r"
expect eof
Een voorbeeld van het automatisch wijzigen van een wachtwoord met het `passwd`-commando. **Het hardcoderen van wachtwoorden in scripts is zeer onveilig.**
Tips & Aandachtspunten
`expect`-scripts zijn krachtig, maar er zijn enkele aandachtspunten om rekening mee te houden voor beveiliging en stabiliteit.
Belangrijkste tips
- **Wachtwoordbeveiliging**: Het direct hardcoderen van wachtwoorden in scripts is zeer gevaarlijk. Overweeg omgevingsvariabelen, veilige configuratiebestanden of andere beveiligingsmechanismen zoals `ssh-agent` te gebruiken.
- **Time-out instellen**: Gebruik het commando `set timeout` om de maximale tijd in te stellen die `expect` wacht op een specifiek patroon. De standaardwaarde is 10 seconden, en u kunt `set timeout -1` instellen voor oneindig wachten.
- **Nauwkeurige patroonmatching**: `expect` ondersteunt reguliere expressies. Omdat prompts mogelijk niet exact overeenkomen, kunt u flexibele patronen gebruiken of de `*` wildcard benutten.
- **Debugging**: Door `expect -d your_script.exp` uit te voeren in debugmodus, kunt u gedetailleerd zien op welke patronen `expect` wacht en welke strings het verzendt.
- **Gebruik van `interact`**: U kunt het commando `interact` gebruiken wanneer u de controle aan de gebruiker wilt overdragen tijdens de uitvoering van het script.