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.