diff options
Diffstat (limited to 'demos/demo_sftp.py')
-rw-r--r-- | demos/demo_sftp.py | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/demos/demo_sftp.py b/demos/demo_sftp.py new file mode 100644 index 0000000..dbcb2cb --- /dev/null +++ b/demos/demo_sftp.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python + +# Copyright (C) 2003-2007 Robey Pointer <robeypointer@gmail.com> +# +# 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 distributed 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., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +# based on code provided by raymond mosteller (thanks!) + +import base64 +import getpass +import os +import socket +import sys +import traceback + +import paramiko +from paramiko.py3compat import input + + +# setup logging +paramiko.util.log_to_file("demo_sftp.log") + +# Paramiko client configuration +UseGSSAPI = True # enable GSS-API / SSPI authentication +DoGSSAPIKeyExchange = True +Port = 22 + +# get hostname +username = "" +if len(sys.argv) > 1: + hostname = sys.argv[1] + if hostname.find("@") >= 0: + username, hostname = hostname.split("@") +else: + hostname = input("Hostname: ") +if len(hostname) == 0: + print("*** Hostname required.") + sys.exit(1) + +if hostname.find(":") >= 0: + hostname, portstr = hostname.split(":") + Port = int(portstr) + + +# get username +if username == "": + default_username = getpass.getuser() + username = input("Username [%s]: " % default_username) + if len(username) == 0: + username = default_username +if not UseGSSAPI: + password = getpass.getpass("Password for %s@%s: " % (username, hostname)) +else: + password = None + + +# 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: + # try ~/ssh/ too, because windows can't have a folder named ~/.ssh/ + 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 hostname in host_keys: + 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( + hostkey, + username, + password, + gss_host=socket.getfqdn(hostname), + gss_auth=UseGSSAPI, + gss_kex=DoGSSAPIKeyExchange, + ) + sftp = paramiko.SFTPClient.from_transport(t) + + # dirlist on remote host + dirlist = sftp.listdir(".") + print("Dirlist: %s" % dirlist) + + # copy this demo onto the server + try: + sftp.mkdir("demo_sftp_folder") + except IOError: + print("(assuming demo_sftp_folder/ already exists)") + with sftp.open("demo_sftp_folder/README", "w") as f: + f.write("This was created by demo_sftp.py.\n") + with open("demo_sftp.py", "r") as f: + data = f.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 + with sftp.open("demo_sftp_folder/README", "r") as f: + data = f.read() + with open("README_demo_sftp", "w") as f: + f.write(data) + print("copied README back here") + + # BETTER: use the get() and put() methods + sftp.put("demo_sftp.py", "demo_sftp_folder/demo_sftp.py") + sftp.get("demo_sftp_folder/README", "README_demo_sftp") + + t.close() + +except Exception as e: + print("*** Caught exception: %s: %s" % (e.__class__, e)) + traceback.print_exc() + try: + t.close() + except: + pass + sys.exit(1) |