Line | |
---|
1 | #!/usr/bin/env python |
---|
2 | """This starts an SSH tunnel to a given host. |
---|
3 | If the SSH process ever dies then this script will detect that and restart it. |
---|
4 | I use this under Cygwin to keep open encrypted tunnels to |
---|
5 | port 110 (POP3) and port 25 (SMTP). I set my mail client to talk to |
---|
6 | localhost and I keep this script running in the background. |
---|
7 | """ |
---|
8 | import pexpect |
---|
9 | import getpass |
---|
10 | import time |
---|
11 | |
---|
12 | #tunnel_command = 'ssh -C -N -L 25:%(host)s:25 -L 110:%(host)s:110 %(user)s@%(host)s' |
---|
13 | tunnel_command = 'ssh -C -n -L 25:%(host)s:25 -L 110:%(host)s:110 %(user)s@%(host)s -f nothing.sh' |
---|
14 | nothing_script = """#!/bin/sh |
---|
15 | while true; do sleep 53; done |
---|
16 | """ |
---|
17 | host = raw_input('Hostname: ') |
---|
18 | user = raw_input('Username: ') |
---|
19 | X = getpass.getpass('Password: ') |
---|
20 | |
---|
21 | def start_tunnel (): |
---|
22 | ssh_tunnel = pexpect.spawn (tunnel_command % globals()) |
---|
23 | try: |
---|
24 | ssh_tunnel.expect ('password:') |
---|
25 | except Exception, e: |
---|
26 | print str(e) |
---|
27 | print ssh_tunnel.before |
---|
28 | print ssh_tunnel.after |
---|
29 | time.sleep (0.1) |
---|
30 | ssh_tunnel.sendline (X) |
---|
31 | time.sleep (60) # Cygwin is slow to update process status. |
---|
32 | ssh_tunnel.expect (pexpect.EOF) |
---|
33 | |
---|
34 | def main (): |
---|
35 | while 1: |
---|
36 | ps = pexpect.spawn ('ps') |
---|
37 | time.sleep (1) |
---|
38 | index = ps.expect (['/usr/bin/ssh', pexpect.EOF, pexpect.TIMEOUT]) |
---|
39 | if index == 2: |
---|
40 | print 'TIMEOUT in ps command...' |
---|
41 | print ps.before |
---|
42 | print ps.after |
---|
43 | if index == 1: |
---|
44 | print time.asctime(), |
---|
45 | print 'restarting tunnel' |
---|
46 | start_tunnel () |
---|
47 | time.sleep (60) |
---|
48 | print 'tunnel OK' |
---|
49 | else: |
---|
50 | # print 'tunnel OK' |
---|
51 | time.sleep (60) |
---|
52 | |
---|
53 | if __name__ == '__main__': |
---|
54 | main () |
---|
55 | |
---|
56 | |
---|
Note: See
TracBrowser
for help on using the repository browser.