This directory contains scripts that give examples of using Pexpect.

hive.py
    This script creates SSH connections to a list of hosts that
    you provide. Then you are given a command line prompt. Each
    shell command that you enter is sent to all the hosts. The
    response from each host is collected and printed. For example,
    you could connect to a dozen different machines and reboot
    them all at once.

script.py
    This implements a command similar to the classic BSD "script" command.
    This will start a subshell and log all input and output to a file.
    This demonstrates the interact() method of Pexpect.

fix_cvs_files.py
    This is for cleaning up binary files improperly added to
    CVS. This script scans the given path to find binary files;
    checks with CVS to see if the sticky options are set to -kb;
    finally if sticky options are not -kb then uses 'cvs admin'
    to set the -kb option. 

ftp.py
    This demonstrates an FTP "bookmark".
    This connects to an ftp site; does a few ftp commands; and then gives the user
    interactive control over the session. In this case the "bookmark" is to a
    directory on the OpenBSD ftp server. It puts you in the i386 packages
    directory. You can easily modify this for other sites.
    This demonstrates the interact() method of Pexpect.

monitor.py
    This runs a sequence of system status commands on a remote host using SSH.
    It runs a simple system checks such as uptime and free to monitor
    the state of the remote host.

passmass.py
    This will login to a list of hosts and change the password of the
    given user. This demonstrates scripting logins; although, you could
    more easily do this using the pxssh subclass of Pexpect.
    See also the "hive.py" example script for a more general example
    of scripting a collection of servers.

python.py
    This starts the python interpreter and prints the greeting message backwards.
    It then gives the user interactive control of Python. It's pretty useless!

rippy.py
    This is a wizard for mencoder. It greatly simplifies the process of
    ripping a DVD to mpeg4 format (XviD, DivX). It can transcode from any
    video file to another. It has options for resampling the audio stream;
    removing interlace artifacts, fitting to a target file size, etc.
    There are lots of options, but the process is simple and easy to use.

sshls.py
    This lists a directory on a remote machine.

ssh_tunnel.py
    This starts an SSH tunnel to a remote machine. It monitors the connection
    and restarts the tunnel if it goes down.

uptime.py
    This will run the uptime command and parse the output into python variables.
    This demonstrates using a single regular expression to match the output
    of a command and capturing different variable in match groups.
    The regular expression takes into account a wide variety of different
    formats for uptime output.

df.py
    This collects filesystem capacity info using the 'df' command.
    Tuples of filesystem name and percentage are stored in a list.
    A simple report is printed. Filesystems over 95% capacity are highlighted.

