| #!/usr/bin/env python |
| |
| """This runs 'ls -l' on a remote host using SSH. At the prompts enter hostname, |
| user, and password. |
| |
| $Id: sshls.py 489 2007-11-28 23:40:34Z noah $ |
| """ |
| |
| import pexpect |
| import getpass |
| import os |
| |
| |
| def ssh_command(user, host, password, command): |
| """This runs a command on the remote host. This could also be done with the |
| pxssh class, but this demonstrates what that class does at a simpler level. |
| This returns a pexpect.spawn object. This handles the case when you try to |
| connect to a new host and ssh asks you if you want to accept the public key |
| fingerprint and continue connecting. """ |
| |
| ssh_newkey = 'Are you sure you want to continue connecting' |
| child = pexpect.spawn('ssh -l %s %s %s' % (user, host, command)) |
| i = child.expect([pexpect.TIMEOUT, ssh_newkey, 'password: ']) |
| if i == 0: # Timeout |
| print 'ERROR!' |
| print 'SSH could not login. Here is what SSH said:' |
| print child.before, child.after |
| return None |
| if i == 1: # SSH does not have the public key. Just accept it. |
| child.sendline('yes') |
| child.expect('password: ') |
| i = child.expect([pexpect.TIMEOUT, 'password: ']) |
| if i == 0: # Timeout |
| print 'ERROR!' |
| print 'SSH could not login. Here is what SSH said:' |
| print child.before, child.after |
| return None |
| child.sendline(password) |
| return child |
| |
| |
| def main(): |
| |
| host = raw_input('Hostname: ') |
| user = raw_input('User: ') |
| password = getpass.getpass('Password: ') |
| child = ssh_command(user, host, password, '/bin/ls -l') |
| child.expect(pexpect.EOF) |
| print child.before |
| |
| if __name__ == '__main__': |
| try: |
| main() |
| except Exception as e: |
| print str(e) |
| traceback.print_exc() |
| os._exit(1) |