Regular readers will be familiar with ShutIt, a framework I work on that allows me to automate all sorts of workflows and tools that I publish on GitHub.
This article demonstrates a new feature that uses this platform to make doing expect-type tasks trivial.
Embedded ShutIt
In response to a request, I recently added a feature which may be useful to others.
All this is available in python scripts if you:
pip install shutit
You can now automate interactions in python scripts. This script just gets the hostname and logs it:
import shutit_standalone import logging
shutit_obj = shutit_standalone.create_bash_session() hostname_str = shutit_obj.send_and_get_output('hostname') shutit_obj.log('Hostname is: ' + hostname_str, loglevel=logging.CRITICAL)
Since ShutIt is a big wrapper/platform built onpexpect, it takes care of setting up the prompt, figuring out when the command is done and a whole load of other stuff you never want to worry about about terminals.
Log Into Server Example
This example logs into a server, taking the password from user input, and ensures git is installed on it before logging out:
import shutit_standalone import logging
shutit_obj = shutit_standalone.create_bash_session()
username = shutit_obj.get_input('Input username: ') server = shutit_obj.get_input('Input server: ', ispass=True) password = shutit_obj.get_input('Input password', ispass=True)
shutit_obj.login('ssh ' + username + '@' + server, password=password) shutit_obj.install('git') shutit_obj.logout()
ShutIt takes care of determining what package manager is on the host. If you’re not logged in as root it prompts you for a sudo password before attempting the install.
Pause Mid-Flight to Look Around
If you want to insert yourself in the middle of the run, you can add a ‘pause_point’, which will hand you back the terminal until you hit CTRL+[, after which it continues:
import shutit_standalone import logging
username = shutit_obj.get_input('Input username: ') server = shutit_obj.get_input('Input server: ', ispass=True) password = shutit_obj.get_input('Input password', ispass=True)
shutit_obj.login('ssh ' + username + '@' + server, password=password) shutit.obj.pause_point('Take a look around!') shutit_obj.install('git') shutit_obj.logout()
Send Commands Until Specific Output Seen
If you need to wait for something to happen, you can ‘send_until’ a regexp is seen in the output. This trivial example runs a command to wait 20 seconds and then create a file, and the ‘send_until’ command does not complete until the file is created.
import shutit_standalone import logging
username = shutit_obj.get_input('Input username: ') server = shutit_obj.get_input('Input server: ', ispass=True) password = shutit_obj.get_input('Input password', ispass=True)
shutit_obj.login('ssh ' + username + '@' + server, password=password) shutit_obj.send('rm -f newfile && sleep 20 && touch newfile &') shutit.obj.send_until('ls newfile | wc -l','1') shutit_obj.logout()
Challenge!
This can do a lot more, but I just want to give a flavour here.
I challenge you to give me a real-world automation task I can’t automate!
Ad
My book Docker in Practice:

Get 39% off with the code: 39miell