| Index: third_party/pexpect/examples/ssh_tunnel.py
|
| diff --git a/third_party/pexpect/examples/ssh_tunnel.py b/third_party/pexpect/examples/ssh_tunnel.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d7619118e08886eedb19a3dedf772dabd475d124
|
| --- /dev/null
|
| +++ b/third_party/pexpect/examples/ssh_tunnel.py
|
| @@ -0,0 +1,105 @@
|
| +#!/usr/bin/env python
|
| +
|
| +'''This starts an SSH tunnel to a given host. If the SSH process ever dies then
|
| +this script will detect that and restart it. I use this under Cygwin to keep
|
| +open encrypted tunnels to port 25 (SMTP), port 143 (IMAP4), and port 110
|
| +(POP3). I set my mail client to talk to localhost and I keep this script
|
| +running in the background.
|
| +
|
| +Note that this is a rather stupid script at the moment because it just looks to
|
| +see if any ssh process is running. It should really make sure that our specific
|
| +ssh process is running. The problem is that ssh is missing a very useful
|
| +feature. It has no way to report the process id of the background daemon that
|
| +it creates with the -f command. This would be a really useful script if I could
|
| +figure a way around this problem.
|
| +
|
| +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 getpass
|
| +import time
|
| +
|
| +
|
| +try:
|
| + raw_input
|
| +except NameError:
|
| + raw_input = input
|
| +
|
| +
|
| +# SMTP:25 IMAP4:143 POP3:110
|
| +tunnel_command = 'ssh -C -N -f -L 25:127.0.0.1:25 -L 143:127.0.0.1:143 -L 110:127.0.0.1:110 %(user)@%(host)'
|
| +host = raw_input('Hostname: ')
|
| +user = raw_input('Username: ')
|
| +X = getpass.getpass('Password: ')
|
| +
|
| +def get_process_info ():
|
| +
|
| + # This seems to work on both Linux and BSD, but should otherwise be considered highly UNportable.
|
| +
|
| + ps = pexpect.run ('ps ax -O ppid')
|
| + pass
|
| +
|
| +def start_tunnel ():
|
| +
|
| + try:
|
| + ssh_tunnel = pexpect.spawn (tunnel_command % globals())
|
| + ssh_tunnel.expect ('password:')
|
| + time.sleep (0.1)
|
| + ssh_tunnel.sendline (X)
|
| + time.sleep (60) # Cygwin is slow to update process status.
|
| + ssh_tunnel.expect (pexpect.EOF)
|
| +
|
| + except Exception as e:
|
| + print(str(e))
|
| +
|
| +def main ():
|
| +
|
| + while True:
|
| + ps = pexpect.spawn ('ps')
|
| + time.sleep (1)
|
| + index = ps.expect (['/usr/bin/ssh', pexpect.EOF, pexpect.TIMEOUT])
|
| + if index == 2:
|
| + print('TIMEOUT in ps command...')
|
| + print(str(ps))
|
| + time.sleep (13)
|
| + if index == 1:
|
| + print(time.asctime(), end=' ')
|
| + print('restarting tunnel')
|
| + start_tunnel ()
|
| + time.sleep (11)
|
| + print('tunnel OK')
|
| + else:
|
| + # print 'tunnel OK'
|
| + time.sleep (7)
|
| +
|
| +if __name__ == '__main__':
|
| +
|
| + main ()
|
| +
|
| +# This was for older SSH versions that didn't have -f option
|
| +#tunnel_command = 'ssh -C -n -L 25:%(host)s:25 -L 110:%(host)s:110 %(user)s@%(host)s -f nothing.sh'
|
| +#nothing_script = '''#!/bin/sh
|
| +#while true; do sleep 53; done
|
| +#'''
|
| +
|
|
|