source: CMTManagement/utils/passmass.py @ 421

Last change on this file since 421 was 421, checked in by garonne, 17 years ago
  • Property svn:executable set to *
File size: 2.2 KB
Line 
1#!/usr/bin/env python
2'''Change passwords on the named machines.
3    passmass host1 host2 host3 . . .
4Note that login shell prompt on remote machine must end in # or $.
5'''
6
7import pexpect
8import sys, getpass
9
10USAGE = '''passmass host1 host2 host3 . . .'''
11SHELL_PROMPT = '[#\$] '
12
13def login(host, user, password):
14    child = pexpect.spawn('ssh %s@%s'%(user, host))
15    child.expect('password:')
16    child.sendline(password)
17    i = child.expect(['Permission denied', SHELL_PROMPT, 'Terminal type'])
18    if i == 0:
19        print 'Permission denied on host:', host
20        return None
21    elif i == 2:
22        child.sendline('vt100')
23        i = child.expect('[#\$] ')
24    return child
25
26def change_password(child, user, oldpassword, newpassword):
27    child.sendline('passwd %s'%user)
28    i = child.expect(['Old [Pp]assword', 'New [Pp]assword'])
29    # Root does not require old password, so it gets to bypass the next step.
30    if i == 0:
31        child.sendline(oldpassword)
32        child.expect('New [Pp]assword')
33    child.sendline(newpassword)
34    i = child.expect(['New [Pp]assword', 'Retype', 'Re-enter'])
35    if i == 0:
36        print 'Host did not like new password. Here is what it said...'
37        print child.before
38        child.send (chr(3)) # Ctrl-C
39        child.sendline('') # This should tell remote passwd command to quit.
40        return
41    child.sendline(newpassword)
42
43def main():
44    if len(sys.argv) <= 1:
45        print USAGE
46        return 1
47
48    user = raw_input('Username: ')
49    password = getpass.getpass('Current Password: ')
50    newpassword = getpass.getpass('New Password: ')
51    newpasswordconfirm = getpass.getpass('Confirm New Password: ')
52    if newpassword != newpasswordconfirm:
53        print 'New Passwords do not match.'
54        return 1
55
56    for host in sys.argv[1:]:
57        child = login(host, user, password)
58        if child == None:
59            print 'Could not login to host:', host
60            continue
61        print 'Changing password on host:', host
62        change_password(child, user, password, newpassword)
63        child.expect(SHELL_PROMPT)
64        child.sendline('exit')
65
66if __name__ == '__main__':
67    try:
68        main()
69    except pexpect.ExceptionPexpect, e:
70        print str(e)
71
72
Note: See TracBrowser for help on using the repository browser.