source: CMTManagement/utils/passmass.py@ 421

Last change on this file since 421 was 421, checked in by garonne, 18 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.