• Zeth will be attending PyCon UK on the 12th to 14th September 2008.

SFTP in Python: Really Simple SSH

29 May 2008

ssh.py provides three common SSH operations, get, put and execute. It is a high-level abstraction upon Paramiko.

I wrote it yesterday for my own needs, so it is still very much in the beta stage. Any improvements or comments gratefully accepted.

In short, it works as follows:

import ssh
s = ssh.Connection('example.com')
s.put('hello.txt')
s.get('goodbye.txt')
s.execute('du -h --max-depth=0')
s.close()

That is it, in the rest of this post, I walk through this line by line.

Installation

First, we need to install paramiko, if you don't have it already.

On Gentoo Linux:

emerge paramiko

On Ubuntu/Debian and so on:

apt-get install python-paramiko

If you want to use Python's easy_install then:

easy_install paramiko

Secondly, you need to grab the ssh.py module, grab it from my code-page, and save it as ssh.py.

Connecting to a remote server

To play with the script interactively, you need to start Python:

python

Now, import the ssh module:

import ssh

Next we need to initiate the connection. If your username is the same on both systems, and you have set up ssh-keys, then all you need to do is:

s = ssh.Connection('example.com')

Connection supports the following options:

host The Hostname of the remote machine.
username Your username at the remote machine.
private_key Your private key file.
password Your password at the remote machine.
port The SSH port of the remote machine.

The host is essential of course. Port defaults to 22. The username defaults to the username you are currently using on the local machine.

You need to use one of the authentication methods, a private key or a password. If you don't specify anything, then ssh.Connection will attempt to use a private_key at ~/.ssh/id_rsa or ~/.ssh/id_dsa.

So to specify a username and password, you can do it like this:

s = ssh.Connection(host = 'example.com', username = 'warrior', password = 'lennalenna')

Of course, Python also allows you to use the order to specify the arguments, so the last example can be written as:

s = ssh.Connection('example.com', 'warrior', password = 'lennalenna')

Operations

Once you have set up the connection, there are three methods you can use. Firstly, to send a file from the local machine, you can use put:

s.put('hello.txt')

The above example copies a file called hello.txt from the current local working directory to the remote server. We can also be more explicit if we want:

s.put('/home/warrior/hello.txt', '/home/zombie/textfiles/report.txt')

So the above example copies /home/warrior/hello.txt on the local server to /home/zombie/textfiles/report.txt on the remote server.

The second operation works in a similar way but in reverse:

s.get('hello.txt')

get takes the file from the remote server to the local server, again we can be more explicit if we want:

s.get('/var/log/strange.log', '/home/warrior/serverlog.txt')

The above example copies the strange.log from the server and saves it as serverlog.txt.

The last operation is execute, this executes a command on the remote server:

s.execute('ls -l')

This returns the output as a Python list.

Closing the connection

You can do as many operations you like while the connection is open, but when you are finished, you need to close the connection between the local and remote machines. You do this with the close method:

s.close()

There we go, that is all I needed to do with SSH. Please do let me know using the comments below if you have any problems using it.

If you import my module in your program and later find that you need more power or flexibility, you should be able to swap it out for the full paramiko with a minimum of fuss.

1 Max says...

Awesome. Paramiko is over complicated for my simple single SSH command needs. I have usually just resorted to using a system command and reading from that.

Posted at 7:53 p.m. on May 29, 2008


2 Peter says...

This is pretty nice, maybe if an mget or mput could be added it would really improve its use. not sure how to do that couldn't figure it out using paramiko its probably impossible as of now. But i just learned python a week ago lol. This program really simplifies paramiko, good job! props

Posted at 3:30 p.m. on June 27, 2008


3 joeg says...

Thanx for coding this up... One glitch I found:

#key_key = paramiko.RSAKey.from_private_key_file(private_key_file) key_key = paramiko.DSSKey.from_private_key_file(private_key_file) self._transport.connect(username = username, pkey = key_key)

i'm resorting to this for the time being... it really should be conditionalized to choose the right RSA/DSS based on the private_key_file name, but well, thought you should know

Posted at 7:48 p.m. on July 30, 2008


What do you have to say?

Show Editing Help


PyCon UK

About

Hello, my name is Zeth, I'll be your host here.

Command Line Warriors is about taking control of your own technology, it looks at our experiences of computing; especially using GNU/Linux, the Python programming language, the command-line and issues such as techno-ethics, best practices and whatever is cool now. If you take control of your technology then you are a Warrior too!

This site is your site too which means that you can contribute and get involved. You can leave comments using the facility provided. For me, the comments and discussions are by far the best part of the site. So please do have your say!

Latest Discussions

Naib

August 27, 2008
And the greatest flaw with this "simple" talley? Women's eights final: 1 United States 6:05.34 Gold 2 Netherlands 6:07.22 Silver 3 Romania 6:07.25 Bronze Men's quadruple sculls final: 1 Poland ...
An Alternative Olympic Medal Table

james

August 27, 2008
Great discussion and a great "add-on" with the European countries! I still find medals per Capita very interesting because it indicates how many medals a country has won, from the ...
An Alternative Olympic Medal Table

Steve

August 27, 2008
Flawed logic. This comparison would only make sense if the EU could only send the same amount of competitors as a single country. Since it is treated as many small ...
An Alternative Olympic Medal Table

Zeth

August 27, 2008
Hi Benjamin, as far as I know, you can put any GSM SIM card into your OpenMoko, so you have the freedom to choose the best deal for you from ...
OpenMoko vs iPhone - Free your phone or Fight your phone?

Benjamin Melançon

August 25, 2008
Network question. I know more about computers than cell phones. Can anyone tell me or point me to a resource about what purchase options for network access are. For instance ...
OpenMoko vs iPhone - Free your phone or Fight your phone?

Mark (Cycom on freenode)

August 23, 2008
Two separate ideas here: First: Is not the competition between KDE and GNOME a good thing? It drives both to improve in a way that Mac and Windows and Linux ...
Is GUADEC just GDEC?

Zeth

August 21, 2008
Thanks for your comments guys, the newspapers need to sit a while on the naughty step until they are willing to play nicely. John Reese, thanks for visiting, it is ...
Newspapers please link to your sources

John

August 20, 2008
Zeth, The link to this file (for view wireless history) doesn't bring up a dialogue. Could you fix this?
Five Tips for Easter

John Reese

August 20, 2008
They're *carts*, not "trolleys"! ;)
Newspapers please link to your sources

akahn

August 20, 2008
Control-L usually selects the whole address, so only Control-L Control-C would be needed.
Newspapers please link to your sources

Sean

August 20, 2008
That was good. I'm crackin' up.
Newspapers please link to your sources

Garrick

August 20, 2008
Here here!
Newspapers please link to your sources

Seth Kriticos

August 19, 2008
bkil: "GTK and Gecko-tied extensions could be ported to non-gecko browsers." *cough* Epiphany is running on gecko currently and integrates some extensions thereof, they are just planning to switch to ...
Will Epiphany be able to compete with Firefox's extensions?

Harshad Modi

August 18, 2008
Thanks helping me!!! but I have problem on banner.... I try to make my own sftp server using paramiko inherit paramiko.ServerInterface class. but I got this error: ERROR:paramiko.transport:SSHException: Error reading ...
SFTP in Python: Paramiko