Sunday 10 February 2013 14:45
Over the last few months, I've frequently needed to use SSH from Python, but
didn't find any of the existing solutions to be well-suited for what I needed
(see below for discussion of other solutions). So, I've created
make using SSH from Python easy. For instance, to run
import spur shell = spur.SshShell(hostname="localhost", username="bob", password="password1") result = shell.run(["echo", "-n", "hello"]) print result.output # prints hello
shell.run() executes a command, and returns the result once it's
finished executing. If you don't want to wait until the command has finished,
you can call
shell.spawn() instead, which returns a process object:
process = shell.spawn(["sh", "-c", "read value; echo $value"]) process.stdin_write("hello\n") result = process.wait_for_result() print result.output # prints hello
spur.py also allows commands to be run locally using the same interface:
import spur shell = spur.LocalShell() result = shell.run(["echo", "-n", "hello"]) print result.output # prints hello
For a complete list of supported operations, take a look at the project on GitHub.
spur.py is certainly not the only way to use SSH from Python, and it's possible that one of the other solutions might be better suited for what you need. I've come across three other main alternatives.
The first is to shell out to
ssh. It works, but it's ugly.
The second is to use Fabric. Unfortunately, I found Fabric to be a bit too high-level. It's useful for implementing deployment scripts using SSH, but I found it awkward to use as a general-purpose library for SSH.
Finally, there's paramiko. I found paramiko to be a bit too low-level, but both Fabric and spur.py are built on top of paramiko.