forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/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. """
 | 
						|
 | 
						|
import pexpect
 | 
						|
import getpass
 | 
						|
import time
 | 
						|
 | 
						|
# 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, 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(),
 | 
						|
            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
 | 
						|
#"""
 | 
						|
 |