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.