mirror of
https://github.com/sshuttle/sshuttle.git
synced 2025-01-19 12:28:28 +01:00
run in background (daemon) and option
This commit is contained in:
parent
41fd0348eb
commit
2ef3a301fb
49
client.py
49
client.py
@ -4,6 +4,7 @@ import helpers, ssnet, ssh
|
|||||||
from ssnet import SockWrapper, Handler, Proxy, Mux, MuxWrapper
|
from ssnet import SockWrapper, Handler, Proxy, Mux, MuxWrapper
|
||||||
from helpers import *
|
from helpers import *
|
||||||
|
|
||||||
|
import os, sys, atexit, signal, syslog
|
||||||
|
|
||||||
def original_dst(sock):
|
def original_dst(sock):
|
||||||
try:
|
try:
|
||||||
@ -97,14 +98,40 @@ class FirewallClient:
|
|||||||
if rv:
|
if rv:
|
||||||
raise Fatal('cleanup: %r returned %d' % (self.argv, rv))
|
raise Fatal('cleanup: %r returned %d' % (self.argv, rv))
|
||||||
|
|
||||||
|
def exit_cleanup():
|
||||||
|
debug1('exit cleanup\n')
|
||||||
|
os.unlink('sshuttle.pid')
|
||||||
|
|
||||||
def _main(listener, fw, ssh_cmd, remotename, python, seed_hosts, auto_nets):
|
def _main(listener, fw, ssh_cmd, remotename, python, seed_hosts, auto_nets, background):
|
||||||
handlers = []
|
handlers = []
|
||||||
if helpers.verbose >= 1:
|
if helpers.verbose >= 1:
|
||||||
helpers.logprefix = 'c : '
|
helpers.logprefix = 'c : '
|
||||||
else:
|
else:
|
||||||
helpers.logprefix = 'client: '
|
helpers.logprefix = 'client: '
|
||||||
debug1('connecting to server...\n')
|
debug1('connecting to server...\n')
|
||||||
|
|
||||||
|
if background:
|
||||||
|
helpers.do_syslog = True
|
||||||
|
syslog.openlog('sshuttle')
|
||||||
|
|
||||||
|
# we're redirecting the standard outputs here early so that
|
||||||
|
# the stderr debug message of ssh subprocess would be
|
||||||
|
# redirected properly
|
||||||
|
|
||||||
|
# TODO: redirecting stderr of ssh to syslog
|
||||||
|
|
||||||
|
sys.stdout.flush()
|
||||||
|
sys.stderr.flush()
|
||||||
|
si = file('/dev/null', 'r')
|
||||||
|
so = file('/dev/null', 'a+')
|
||||||
|
se = file('/dev/null', 'a+', 0)
|
||||||
|
os.dup2(si.fileno(), sys.stdin.fileno())
|
||||||
|
os.dup2(so.fileno(), sys.stdout.fileno())
|
||||||
|
os.dup2(se.fileno(), sys.stderr.fileno())
|
||||||
|
si.close()
|
||||||
|
so.close()
|
||||||
|
se.close()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
(serverproc, serversock) = ssh.connect(ssh_cmd, remotename, python)
|
(serverproc, serversock) = ssh.connect(ssh_cmd, remotename, python)
|
||||||
except socket.error, e:
|
except socket.error, e:
|
||||||
@ -126,6 +153,22 @@ def _main(listener, fw, ssh_cmd, remotename, python, seed_hosts, auto_nets):
|
|||||||
raise Fatal('expected server init string %r; got %r'
|
raise Fatal('expected server init string %r; got %r'
|
||||||
% (expected, initstring))
|
% (expected, initstring))
|
||||||
debug1('connected.\n')
|
debug1('connected.\n')
|
||||||
|
if background:
|
||||||
|
debug1('daemonizing\n')
|
||||||
|
if os.fork():
|
||||||
|
os._exit(0)
|
||||||
|
os.setsid()
|
||||||
|
if os.fork():
|
||||||
|
os._exit(0)
|
||||||
|
|
||||||
|
outfd = os.open('sshuttle.pid',
|
||||||
|
os.O_WRONLY | os.O_CREAT | os.O_EXCL)
|
||||||
|
os.write(outfd, '%i' % os.getpid())
|
||||||
|
os.close(outfd)
|
||||||
|
|
||||||
|
atexit.register(exit_cleanup)
|
||||||
|
# Normal exit when killed, or atexit won't work
|
||||||
|
signal.signal(signal.SIGTERM, lambda signum, stack_frame: sys.exit(1))
|
||||||
|
|
||||||
def onroutes(routestr):
|
def onroutes(routestr):
|
||||||
if auto_nets:
|
if auto_nets:
|
||||||
@ -182,7 +225,7 @@ def _main(listener, fw, ssh_cmd, remotename, python, seed_hosts, auto_nets):
|
|||||||
|
|
||||||
|
|
||||||
def main(listenip, ssh_cmd, remotename, python, seed_hosts, auto_nets,
|
def main(listenip, ssh_cmd, remotename, python, seed_hosts, auto_nets,
|
||||||
subnets_include, subnets_exclude):
|
subnets_include, subnets_exclude, background):
|
||||||
debug1('Starting sshuttle proxy.\n')
|
debug1('Starting sshuttle proxy.\n')
|
||||||
listener = socket.socket()
|
listener = socket.socket()
|
||||||
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||||
@ -213,6 +256,6 @@ def main(listenip, ssh_cmd, remotename, python, seed_hosts, auto_nets,
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
return _main(listener, fw, ssh_cmd, remotename,
|
return _main(listener, fw, ssh_cmd, remotename,
|
||||||
python, seed_hosts, auto_nets)
|
python, seed_hosts, auto_nets, background)
|
||||||
finally:
|
finally:
|
||||||
fw.done()
|
fw.done()
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
import sys, os
|
import sys, os, syslog
|
||||||
|
|
||||||
logprefix = ''
|
logprefix = ''
|
||||||
verbose = 0
|
verbose = 0
|
||||||
|
do_syslog = False
|
||||||
|
|
||||||
def log(s):
|
def log(s):
|
||||||
try:
|
try:
|
||||||
|
if do_syslog:
|
||||||
|
syslog.syslog(logprefix + s)
|
||||||
|
else:
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
sys.stderr.write(logprefix + s)
|
sys.stderr.write(logprefix + s)
|
||||||
sys.stderr.flush()
|
sys.stderr.flush()
|
||||||
|
6
main.py
6
main.py
@ -45,10 +45,11 @@ def parse_ipport(s):
|
|||||||
|
|
||||||
|
|
||||||
optspec = """
|
optspec = """
|
||||||
sshuttle [-l [ip:]port] [-r [username@]sshserver[:port]] <subnets...>
|
sshuttle [-b] [-l [ip:]port] [-r [username@]sshserver[:port]] <subnets...>
|
||||||
sshuttle --firewall <port> <subnets...>
|
sshuttle --firewall <port> <subnets...>
|
||||||
sshuttle --server
|
sshuttle --server
|
||||||
--
|
--
|
||||||
|
b,background run in background as daemon
|
||||||
l,listen= transproxy to this ip address and port number [0.0.0.0:0]
|
l,listen= transproxy to this ip address and port number [0.0.0.0:0]
|
||||||
H,auto-hosts scan for remote hostnames and update local /etc/hosts
|
H,auto-hosts scan for remote hostnames and update local /etc/hosts
|
||||||
N,auto-nets automatically determine subnets to route
|
N,auto-nets automatically determine subnets to route
|
||||||
@ -104,7 +105,8 @@ try:
|
|||||||
sh,
|
sh,
|
||||||
opt.auto_nets,
|
opt.auto_nets,
|
||||||
parse_subnets(includes),
|
parse_subnets(includes),
|
||||||
parse_subnets(excludes)))
|
parse_subnets(excludes),
|
||||||
|
opt.background))
|
||||||
except Fatal, e:
|
except Fatal, e:
|
||||||
log('fatal: %s\n' % e)
|
log('fatal: %s\n' % e)
|
||||||
sys.exit(99)
|
sys.exit(99)
|
||||||
|
Loading…
Reference in New Issue
Block a user