diff options
Diffstat (limited to 'third_party/Python/module/pexpect-2.4/examples/passmass.py')
| -rw-r--r-- | third_party/Python/module/pexpect-2.4/examples/passmass.py | 90 | 
1 files changed, 90 insertions, 0 deletions
| diff --git a/third_party/Python/module/pexpect-2.4/examples/passmass.py b/third_party/Python/module/pexpect-2.4/examples/passmass.py new file mode 100644 index 000000000000..b1e17b9cb036 --- /dev/null +++ b/third_party/Python/module/pexpect-2.4/examples/passmass.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python + +"""Change passwords on the named machines. passmass host1 host2 host3 . . . +Note that login shell prompt on remote machine must end in # or $. """ + +import pexpect +import sys, getpass + +USAGE = '''passmass host1 host2 host3 . . .''' +COMMAND_PROMPT = '[$#] ' +TERMINAL_PROMPT = r'Terminal type\?' +TERMINAL_TYPE = 'vt100' +SSH_NEWKEY = r'Are you sure you want to continue connecting \(yes/no\)\?' + +def login(host, user, password): + +    child = pexpect.spawn('ssh -l %s %s'%(user, host)) +    fout = file ("LOG.TXT","wb") +    child.setlog (fout) + +    i = child.expect([pexpect.TIMEOUT, SSH_NEWKEY, '[Pp]assword: ']) +    if i == 0: # Timeout +        print 'ERROR!' +        print 'SSH could not login. Here is what SSH said:' +        print child.before, child.after +        sys.exit (1) +    if i == 1: # SSH does not have the public key. Just accept it. +        child.sendline ('yes') +        child.expect ('[Pp]assword: ') +    child.sendline(password) +    # Now we are either at the command prompt or +    # the login process is asking for our terminal type. +    i = child.expect (['Permission denied', TERMINAL_PROMPT, COMMAND_PROMPT]) +    if i == 0: +        print 'Permission denied on host:', host +        sys.exit (1) +    if i == 1: +        child.sendline (TERMINAL_TYPE) +        child.expect (COMMAND_PROMPT) +    return child + +# (current) UNIX password: +def change_password(child, user, oldpassword, newpassword): + +    child.sendline('passwd')  +    i = child.expect(['[Oo]ld [Pp]assword', '.current.*password', '[Nn]ew [Pp]assword']) +    # Root does not require old password, so it gets to bypass the next step. +    if i == 0 or i == 1: +        child.sendline(oldpassword) +        child.expect('[Nn]ew [Pp]assword') +    child.sendline(newpassword) +    i = child.expect(['[Nn]ew [Pp]assword', '[Rr]etype', '[Rr]e-enter']) +    if i == 0: +        print 'Host did not like new password. Here is what it said...' +        print child.before +	child.send (chr(3)) # Ctrl-C +        child.sendline('') # This should tell remote passwd command to quit. +        return +    child.sendline(newpassword) + +def main(): + +    if len(sys.argv) <= 1: +        print USAGE +        return 1 + +    user = raw_input('Username: ') +    password = getpass.getpass('Current Password: ') +    newpassword = getpass.getpass('New Password: ') +    newpasswordconfirm = getpass.getpass('Confirm New Password: ') +    if newpassword != newpasswordconfirm: +        print 'New Passwords do not match.' +        return 1 + +    for host in sys.argv[1:]: +        child = login(host, user, password) +        if child == None: +            print 'Could not login to host:', host +            continue +        print 'Changing password on host:', host +        change_password(child, user, password, newpassword) +        child.expect(COMMAND_PROMPT) +        child.sendline('exit') + +if __name__ == '__main__': +    try: +        main() +    except pexpect.ExceptionPexpect, e: +        print str(e) + | 
