From e4dd1bf9357f0369ed0ba1e5b7c66c696b0a2fb9 Mon Sep 17 00:00:00 2001 From: Robey Pointer Date: Fri, 27 Jan 2006 10:19:25 -0800 Subject: [PATCH] [project @ robey@master-shake.local-20060127181925-3e7e5133b20d2f5b] add a demo for sftp --- demos/demo.py | 1 + demos/demo_sftp.py | 115 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100755 demos/demo_sftp.py diff --git a/demos/demo.py b/demos/demo.py index 1eb33e8..e5efc94 100755 --- a/demos/demo.py +++ b/demos/demo.py @@ -131,6 +131,7 @@ try: print '*** Unable to open host keys file' keys = {} + # check server's host key -- this is important. key = t.get_remote_server_key() if not keys.has_key(hostname): print '*** WARNING: Unknown host key!' diff --git a/demos/demo_sftp.py b/demos/demo_sftp.py new file mode 100755 index 0000000..a9ce6ff --- /dev/null +++ b/demos/demo_sftp.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python + +# Copyright (C) 2003-2005 Robey Pointer +# +# This file is part of paramiko. +# +# Paramiko is free software; you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 2.1 of the License, or (at your option) +# any later version. +# +# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Paramiko; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +# based on code provided by raymond mosteller (thanks!) + +import base64 +import getpass +import os +import socket +import sys +import traceback + +import paramiko +import interactive + + +# setup logging +paramiko.util.log_to_file('demo_sftp.log') + +# get hostname +username = '' +if len(sys.argv) > 1: + hostname = sys.argv[1] + if hostname.find('@') >= 0: + username, hostname = hostname.split('@') +else: + hostname = raw_input('Hostname: ') +if len(hostname) == 0: + print '*** Hostname required.' + sys.exit(1) +port = 22 +if hostname.find(':') >= 0: + hostname, portstr = hostname.split(':') + port = int(portstr) + + +# get username +if username == '': + default_username = getpass.getuser() + username = raw_input('Username [%s]: ' % default_username) + if len(username) == 0: + username = default_username +password = getpass.getpass('Password for %s@%s: ' % (username, hostname)) + + +# get host key, if we know one +hostkeytype = None +hostkey = None +try: + host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) +except IOError: + try: + host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts')) + except IOError: + print '*** Unable to open host keys file' + host_keys = {} + +if host_keys.has_key(hostname): + hostkeytype = host_keys[hostname].keys()[0] + hostkey = host_keys[hostname][hostkeytype] + print 'Using host key of type %s' % hostkeytype + + +# now, connect and use paramiko Transport to negotiate SSH2 across the connection +try: + t = paramiko.Transport((hostname, port)) + t.connect(username=username, password=password, hostkey=hostkey) + sftp = paramiko.SFTPClient.from_transport(t) + + # dirlist on remote host + dirlist = sftp.listdir('.') + print "Dirlist:", dirlist + + # copy this demo onto the server + try: + sftp.mkdir("demo_sftp_folder") + except IOError: + print '(assuming demo_sftp_folder/ already exists)' + sftp.open('demo_sftp_folder/README', 'w').write('This was created by demo_sftp.py.\n') + data = open('demo_sftp.py', 'r').read() + sftp.open('demo_sftp_folder/demo_sftp.py', 'w').write(data) + print 'created demo_sftp_folder/ on the server' + + # copy the README back here + data = sftp.open('demo_sftp_folder/README', 'r').read() + open('README_demo_sftp', 'w').write(data) + print 'copied README back here' + + t.close() + +except Exception, e: + print '*** Caught exception: %s: %s' % (e.__class__, e) + traceback.print_exc() + try: + t.close() + except: + pass + sys.exit(1)