summaryrefslogtreecommitdiffhomepage
path: root/demo.py
diff options
context:
space:
mode:
authorRobey Pointer <robey@master-shake.local>2006-01-26 19:01:14 -0800
committerRobey Pointer <robey@master-shake.local>2006-01-26 19:01:14 -0800
commit0efdc8af5f529a24c9602ae7578e20de1176e55d (patch)
treecd83e66ee5c8932c376b2996b2d5945c640af947 /demo.py
parent7058195e3848467c3f2635797f675efba4650bef (diff)
[project @ robey@master-shake.local-20060127030114-b6810c4c29964a4e]
code from mike looijmans for a windows interactive shell -- while i'm mucking around in here, clean up the demos a bit too
Diffstat (limited to 'demo.py')
-rwxr-xr-xdemo.py210
1 files changed, 0 insertions, 210 deletions
diff --git a/demo.py b/demo.py
deleted file mode 100755
index a02e8867..00000000
--- a/demo.py
+++ /dev/null
@@ -1,210 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (C) 2003-2005 Robey Pointer <robey@lag.net>
-#
-# 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.
-
-
-# ----- WINDOWS USERS PLEASE NOTE -----
-# This demo won't work on Windows because it uses pseudo-terminals, which
-# are a posix-only feature. check out the README file for a simpler demo.
-
-
-import sys, os, socket, threading, getpass, time, base64, select, termios, tty, traceback
-import paramiko
-
-
-##### utility functions
-
-def agent_auth(username, t, event):
- agent = paramiko.Agent()
- agent_keys = agent.get_keys()
- if len(agent_keys) > 0:
- for key in agent_keys:
- print 'Trying ssh-agent key %s' % paramiko.util.hexify(key.get_fingerprint()),
- t.auth_publickey(username, key, event)
- event.wait(10)
- if t.is_authenticated():
- print '... success!'
- return
- print '... nope.'
-
-def manual_auth(username, hostname, event):
- default_auth = 'p'
- auth = raw_input('Auth by (p)assword, (r)sa key, or (d)ss key? [%s] ' % default_auth)
- if len(auth) == 0:
- auth = default_auth
-
- if auth == 'r':
- default_path = os.environ['HOME'] + '/.ssh/id_rsa'
- path = raw_input('RSA key [%s]: ' % default_path)
- if len(path) == 0:
- path = default_path
- try:
- key = paramiko.RSAKey.from_private_key_file(path)
- except paramiko.PasswordRequiredException:
- password = getpass.getpass('RSA key password: ')
- key = paramiko.RSAKey.from_private_key_file(path, password)
- t.auth_publickey(username, key, event)
- elif auth == 'd':
- default_path = os.environ['HOME'] + '/.ssh/id_dsa'
- path = raw_input('DSS key [%s]: ' % default_path)
- if len(path) == 0:
- path = default_path
- try:
- key = paramiko.DSSKey.from_private_key_file(path)
- except paramiko.PasswordRequiredException:
- password = getpass.getpass('DSS key password: ')
- key = paramiko.DSSKey.from_private_key_file(path, password)
- t.auth_publickey(username, key, event)
- else:
- pw = getpass.getpass('Password for %s@%s: ' % (username, hostname))
- t.auth_password(username, pw, event)
-
-
-##### main demo
-
-# setup logging
-paramiko.util.log_to_file('demo.log')
-
-
-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)
-
-# now connect
-try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((hostname, port))
-except Exception, e:
- print '*** Connect failed: ' + str(e)
- traceback.print_exc()
- sys.exit(1)
-
-try:
- event = threading.Event()
- t = paramiko.Transport(sock)
- t.start_client(event)
- # print repr(t)
- event.wait(15)
- if not t.is_active():
- print '*** SSH negotiation failed.'
- sys.exit(1)
- # print repr(t)
-
- try:
- keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
- except IOError:
- try:
- keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts'))
- except IOError:
- print '*** Unable to open host keys file'
- keys = {}
-
- key = t.get_remote_server_key()
- if not keys.has_key(hostname):
- print '*** WARNING: Unknown host key!'
- elif not keys[hostname].has_key(key.get_name()):
- print '*** WARNING: Unknown host key!'
- elif keys[hostname][key.get_name()] != key:
- print '*** WARNING: Host key has changed!!!'
- sys.exit(1)
- else:
- print '*** Host key OK.'
-
- event.clear()
-
- # get username
- if username == '':
- default_username = getpass.getuser()
- username = raw_input('Username [%s]: ' % default_username)
- if len(username) == 0:
- username = default_username
-
- agent_auth(username, t, event)
-
- # ask for what kind of authentication to try
- if not t.is_authenticated():
- manual_auth(username, hostname, event)
-
- event.wait(10)
- # print repr(t)
- if not t.is_authenticated():
- print '*** Authentication failed. :('
- t.close()
- sys.exit(1)
-
- chan = t.open_session()
- chan.get_pty()
- chan.invoke_shell()
- print '*** Here we go!'
- print
-
- try:
- oldtty = termios.tcgetattr(sys.stdin)
- tty.setraw(sys.stdin.fileno())
- tty.setcbreak(sys.stdin.fileno())
- chan.settimeout(0.0)
-
- while 1:
- r, w, e = select.select([chan, sys.stdin], [], [])
- if chan in r:
- try:
- x = chan.recv(1024)
- if len(x) == 0:
- print
- print '*** EOF\r\n',
- break
- sys.stdout.write(x)
- sys.stdout.flush()
- except socket.timeout:
- pass
- if sys.stdin in r:
- # FIXME: reading 1 byte at a time is incredibly dumb.
- x = sys.stdin.read(1)
- if len(x) == 0:
- print
- print '*** Bye.\r\n',
- break
- chan.send(x)
-
- finally:
- termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
-
- chan.close()
- t.close()
-
-except Exception, e:
- print '*** Caught exception: ' + str(e.__class__) + ': ' + str(e)
- traceback.print_exc()
- try:
- t.close()
- except:
- pass
- sys.exit(1)
-