Sweet it is working! I was on #bzr earlier asking to have the link on the paramiko site fixed too. I had a question about executing commands on remote servers and how to receive the output from them. I want to make a script that will allow you to specify the username and password and a sudo user an password so you can execute commands remotely. Another thing i want to do is to use it with pexpect to connect to these terminal servers I have and tell me what hosts they are really connected to.... the sh hosts output is all wrong and I want to automate generating t he host map. Anyway. This is what I have so far. Just a modified
demo.py: I'm by no means great at python yet so suggestions and help is definitely wanted...<br><br>Its here: <a href="http://www.illfunction.com/~illsci/code/pssh.py">http://www.illfunction.com/~illsci/code/pssh.py</a>
<br><br>And here:<br><br>>>> (01:26 PM) (jsabo@frostedflakes) (0/pts/0) (~/Projects/pssh)<br>$ cat pssh.py<br>#!/usr/bin/env python<br><br># This is just a modified demo.py from the paramiko module examples<br># Yay no nsh!
<br><br>import base64<br>from binascii import hexlify<br>from optparse import OptionParser<br>import getpass<br>import os<br>import select<br>import socket<br>import sys<br>import threading<br>import time<br>import traceback
<br>import paramiko<br>import interactive<br>import pexpect<br><br><br><br>def agent_auth(transport, username):<br> """<br> Attempt to authenticate to the given transport using any of the private<br> keys available from an SSH agent.
<br> """<br> agent = paramiko.Agent()<br> agent_keys = agent.get_keys()<br> if len(agent_keys) == 0:<br> return<br> <br> for key in agent_keys:<br> print 'Trying SSH agent key: %s' % hexlify(
key.get_fingerprint()),<br> try:<br> transport.auth_publickey(username, key)<br> return<br> except paramiko.SSHException:<br> print 'SSH agent key: %s Failed!' % hexlify(
key.get_fingerprint())<br><br><br>def manual_auth(transport, username, password):<br> """<br> Attempt to authenticate to the given transport using passwd<br> authentication<br> """
<br> try:<br> transport.auth_password(username, password)<br> except:<br> print "Password Authentication failed"<br> sys.exit(1)<br><br><br>def ssh_connect(hostname, port):
<br> """<br> Connect to remote server and return socket.<br> """<br> try:<br> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br>
sock.connect((hostname, port))<br> except Exception, e:<br> print 'Connection failed: ' + str(e)<br> traceback.print_exc()<br> sys.exit(1)<br><br> return sock
<br><br><br>def get_transport(socket):<br> """<br> Get transport.<br> """<br> try:<br> transport = paramiko.Transport(socket)<br> transport.start_client
()<br> except paramiko.SSHException:<br> print 'Secure Shell negotiation failed.'<br> traceback.print_exc()<br> sys.exit(1)<br><br> return transport<br><br>
def check_hostkey(transport, hostname, known_keys):<br> """<br> Check server's host key -- this is important.<br> """<br> remote_key = transport.get_remote_server_key
()<br> if not known_keys.has_key(hostname):<br> print 'WARNING: Unknown host key!'<br> elif not known_keys[hostname].has_key(remote_key.get_name()):<br> print 'WARNING: Unknown host key!'
<br> elif known_keys[hostname][remote_key.get_name()] != remote_key:<br> print 'WARNING: Host key has changed!!!'<br> sys.exit(1)<br> else:<br> print 'Host key OK.'
<br><br>def get_knownhosts_keys():<br> """<br> Read in your known hosts file and get the keys.<br> """<br> try:<br> known_keys = paramiko.util.load_host_keys
(os.path.expanduser('~/.ssh/known_hosts'))<br> except IOError:<br> print 'Unable to open host keys file'<br> known_keys = {}<br><br> return known_keys<br><br><br>
def main():<br><br> # Remote Auth info<br> hostname = "myhostname"<br> port = int("22")<br> username = "myuser"<br> passwd = "apasswd"<br> sudo_user = "root"
<br> logfile = "pssh.log"<br> command = "touch boh.txt"<br> #passwd = getpass.getpass('Password for %s@%s: ' % (username, hostname))<br><br> # Turn on logging<br>
paramiko.util.log_to_file(logfile, level=1)<br><br> mysock = ssh_connect(hostname, port)<br> t = get_transport(mysock)<br> known_keys = get_knownhosts_keys()<br> check_hostkey(t, hostname, known_keys)
<br><br> agent_auth(t, username)<br> if not t.is_authenticated():<br> manual_auth(t, username, passwd)<br> if not t.is_authenticated():<br> print 'Authentication Failed.'
<br> t.close()<br> sys.exit(1)<br><br> chan = t.open_session()<br> chan.exec_command(command)<br> chan.close()<br> t.close()<br><br><br>if __name__ == "__main__":
<br> main()<br><br><br><br><div><span class="gmail_quote">On 2/8/07, <b class="gmail_sendername">Wouter van Heyst</b> <<a href="mailto:larstiq@larstiq.dyndns.org">larstiq@larstiq.dyndns.org</a>> wrote:</span>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi all,<br><br>On <a href="http://lag.net/paramiko">lag.net/paramiko</a> there is a link to this mailinglist under the
<br>documentation header, but it seems broken.<br><a href="http://www.lag.net/mailman/listinfo/paramiko">http://www.lag.net/mailman/listinfo/paramiko</a><br><br>I'm mailing this to the list also to see if the actualy list itself is
<br>still working.<br><br>Wouter van Heyst<br><br>-----BEGIN PGP SIGNATURE-----<br>Version: GnuPG v1.4.6 (GNU/Linux)<br><br>iQCVAwUBRctYOenTGucjhaP+AQIEYQP/aRsq6AvLC8fYN77ItMOB56gVbVWUaatA<br>hCUyPzwjBKOwaWWqnw8h4XOozdK4xL4FDfEEajrfeTfdpCpgNan/FHW7ai24Vw9S
<br>nBB4baGjAZlm4rwWuAuRp/azr1v/6XkDBVAvLpM6KpqEmV9bSr9iB6GsbOU93Ixd<br>51+wXksFAqg=<br>=x37y<br>-----END PGP SIGNATURE-----<br><br>_______________________________________________<br>paramiko mailing list<br><a href="mailto:paramiko@lag.net">
paramiko@lag.net</a><br><a href="http://www.lag.net/mailman/listinfo/paramiko">http://www.lag.net/mailman/listinfo/paramiko</a><br></blockquote></div><br>