1 | #!/usr/bin/env python
|
---|
2 | '''Change passwords on the named machines.
|
---|
3 | passmass host1 host2 host3 . . .
|
---|
4 | Note that login shell prompt on remote machine must end in # or $.
|
---|
5 | '''
|
---|
6 |
|
---|
7 | import pexpect
|
---|
8 | import sys, getpass
|
---|
9 |
|
---|
10 | USAGE = '''passmass host1 host2 host3 . . .'''
|
---|
11 | SHELL_PROMPT = '[#\$] '
|
---|
12 |
|
---|
13 | def 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 |
|
---|
26 | def 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 |
|
---|
43 | def 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 |
|
---|
66 | if __name__ == '__main__':
|
---|
67 | try:
|
---|
68 | main()
|
---|
69 | except pexpect.ExceptionPexpect, e:
|
---|
70 | print str(e)
|
---|
71 |
|
---|
72 |
|
---|