| Index: third_party/pexpect/examples/passmass.py
|
| diff --git a/third_party/pexpect/examples/passmass.py b/third_party/pexpect/examples/passmass.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8f5e21d58bd76db3081f7dc02504f6a6c24219b0
|
| --- /dev/null
|
| +++ b/third_party/pexpect/examples/passmass.py
|
| @@ -0,0 +1,116 @@
|
| +#!/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 $.
|
| +
|
| +PEXPECT LICENSE
|
| +
|
| + This license is approved by the OSI and FSF as GPL-compatible.
|
| + http://opensource.org/licenses/isc-license.txt
|
| +
|
| + Copyright (c) 2012, Noah Spurrier <noah@noah.org>
|
| + PERMISSION TO USE, COPY, MODIFY, AND/OR DISTRIBUTE THIS SOFTWARE FOR ANY
|
| + PURPOSE WITH OR WITHOUT FEE IS HEREBY GRANTED, PROVIDED THAT THE ABOVE
|
| + COPYRIGHT NOTICE AND THIS PERMISSION NOTICE APPEAR IN ALL COPIES.
|
| + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
| + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
| + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
| + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
| + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
| + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
| + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
| +
|
| +'''
|
| +
|
| +from __future__ import print_function
|
| +
|
| +from __future__ import absolute_import
|
| +
|
| +import pexpect
|
| +import sys, getpass
|
| +
|
| +
|
| +try:
|
| + raw_input
|
| +except NameError:
|
| + raw_input = input
|
| +
|
| +
|
| +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__':
|
| + main()
|
|
|