Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """Friendly Python SSH2 interface."""
- import os
- import tempfile
- import paramiko
- class Connection(object):
- """Connects and logs into the specified hostname.
- Arguments that are not given are guessed from the environment."""
- def __init__(self,
- host,
- username = None,
- private_key = None,
- password = None,
- port = 22,
- ):
- self._sftp_live = False
- self._sftp = None
- if not username:
- username = os.environ['LOGNAME']
- # Log to a temporary file.
- templog = tempfile.mkstemp('.txt', 'ssh-')[1]
- paramiko.util.log_to_file(templog)
- # Begin the SSH transport.
- self._transport = paramiko.Transport((host, port))
- self._tranport_live = True
- # Authenticate the transport.
- if password:
- # Using Password.
- self._transport.connect(username = username, password = password)
- else:
- # Use Private Key.
- if not private_key:
- # Try to use default key.
- if os.path.exists(os.path.expanduser('~/.ssh/id_rsa')):
- private_key = '~/.ssh/id_rsa'
- elif os.path.exists(os.path.expanduser('~/.ssh/id_dsa')):
- private_key = '~/.ssh/id_dsa'
- else:
- raise TypeError, "You have not specified a password or key."
- private_key_file = os.path.expanduser(private_key)
- rsa_key = paramiko.RSAKey.from_private_key_file(private_key_file)
- self._transport.connect(username = username, pkey = rsa_key)
- def _sftp_connect(self):
- """Establish the SFTP connection."""
- if not self._sftp_live:
- self._sftp = paramiko.SFTPClient.from_transport(self._transport)
- self._sftp_live = True
- def get(self, remotepath, localpath = None):
- """Copies a file between the remote host and the local host."""
- if not localpath:
- localpath = os.path.split(remotepath)[1]
- self._sftp_connect()
- self._sftp.get(remotepath, localpath)
- def put(self, localpath, remotepath = None):
- """Copies a file between the local host and the remote host."""
- if not remotepath:
- remotepath = os.path.split(localpath)[1]
- self._sftp_connect()
- self._sftp.put(localpath, remotepath)
- def execute(self, command):
- """Execute the given commands on a remote machine."""
- channel = self._transport.open_session()
- channel.exec_command(command)
- output = channel.makefile('rb', -1).readlines()
- if output:
- return output
- else:
- return channel.makefile_stderr('rb', -1).readlines()
- def close(self):
- """Closes the connection and cleans up."""
- # Close SFTP Connection.
- if self._sftp_live:
- self._sftp.close()
- self._sftp_live = False
- # Close the SSH Transport.
- if self._tranport_live:
- self._transport.close()
- self._tranport_live = False
- def __del__(self):
- """Attempt to clean up if not explicitly closed."""
- self.close()
- def main():
- """Little test when called directly."""
- # Set these to your own details.
- myssh = Connection('nubar.hep.upenn.edu', username='jmarg', private_key="key2.ssh")
- myssh.put('ssh.py', '/home/jmarg/python/asdf.py')
- #myssh.get('/home/jmarg/python/temp.txt', 'temp2.txt')
- myssh.close()
- # start the ball rolling.
- if __name__ == "__main__":
- main()
- def connAndSend():
- pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement