Pexpect, Python, and Managing Devices -- Tratto

tratto-logo A few months ago I decided to write a web application that would essentially run like RANCID, I named it "tratto." Since then I decided that it would be better to nail down a basic python framework first, then integrate it into say.. a django application. In all of my years as an engineer I had never leveraged expect to accomplish simple and repetitive tasks. I am a recent python "convert" and wanted to write a simple app that could be used as a framework for managing and monitoring network connected devices and hosts. Tratto uses pexpectto connect and parse ssh and telnet sessions. This framework provides an easy way to connect to remote devices and issue commands and store the output. I also wanted an easy way to "extend" this framework and be able to add ways to connect to any operating system (or at least use default shell behavior as a baseline). I manage a wide variety of devices and I wanted to support at least the default implementations of Cisco IOS, OpenBSD, Mac OS X, and Aruba OS. Here is how you would add an operating system's parameters to Tratto (

class ArubaOS(OperatingSystem):
	'''aruba configs'''
	DISABLE_PAGINATION = 'terminal length 0'
	GET_CONFIG	="show run"

There are 3 files included in Tratto right now:

  1. -- This is a class which manages sessions using pexpect
  2. -- This is the class which manages all the operating parameters
  3. -- This is an example file of how to use Tratto to fetch whatever info you want

Here is an example of how to use the framework to connect to devices and issue commands:

#!/usr/bin/env python

import Connectivity
import Systems

#telnet to a cisco switch
m = Systems.OperatingSystems['IOS']
s = Connectivity.Session("",23,telnet,m)
s.login("akonkol", "mypass")
s.sendcommand("show ver")
s.sendcommand("show clock")
s.sendcommand("show run")

#ssh to a apple machine
m = Systems.OperatingSystems['OSX']
s = Connectivity.Session("",22,"ssh",m)
s.login("akonkol", "mypass")
#sendcommand will echo response by default, you can store that
#response in a variable if you wish
result = s.sendcommand("df -h")
print result

#ssh to openbsd box
m = Systems.OperatingSystems['OBSD']
s = Connectivity.Session("",22,"ssh",m)
s.login("akonkol", "mypass")
print s.sendcommand("cat /etc/passwd")
print s.sendcommand("arp -a")

The Future

With Tratto you can technically pull information from any networked device and use that data for whatever you please. Current ideas are integrating Tratto into

  • a config repository application with a web frontend (like RANCID)
  • a network mapping application using cdp neighbors
  • monitoring platform which performs different commands based on certain scenarios ("show interfaces" when IP SLA shows latency)

This is my first attempt at releasing python software, so if you think something could be better let me know. Download Tratto

Tagged as cisco , pexpect python , ssh telnet
Written by Andrew Konkol on January 26th, 2010


This is great! Thanks for this post. I am a newbie at python and this will be a big help.

Melanie Hertling
March 6, 2010
I totally agree, i was bashing my head against pexpect to create a library to manage my connections, and then i suddently found this, i owe you a beer dude !!! +1 for this

March 3, 2011
Hi, i think there is a little mistake with the extra print in the file, in sendcommand func, if you follow the #ssh to a apple machine, if you save an print response, you got 2 responses, i.e.: run show clock in a cisco router: miranda@appsrv01:~/python_scripts/Tratto-Barcelona$ python XXXXXX:3750 via ssh show clock yielded: THU MAR 03 02:49:09 2011 Timezone SV, -6 hr 0 min offset from UTC THU MAR 03 02:49:09 2011 Timezone SV, -6 hr 0 min offset from UTC Regards,

March 3, 2011
I'll take a look at it man, it's been a while since I worked on this code. The main reason I wrote Tratto was to grab full router configs... If you have any suggestions on how to fix it, I would appreciate it.

Andrew Konkol
March 5, 2011
Log in with Twitter, Google, Facebook, LinkedIn to leave a comment.