Close stdin, stdout, and stderr when using syslog or forking to daemon (#283)

* Close stdin, stdout, and stderr when using syslog or forking to daemon

Fixes #139

* Ensure we close devnull after use
This commit is contained in:
Brian May 2018-11-01 09:27:50 +11:00 committed by GitHub
parent 7a54d12f80
commit b473b91633
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 5 deletions

View File

@ -59,6 +59,8 @@ def main():
ipport_v6 = "auto" if not opt.disable_ipv6 else None ipport_v6 = "auto" if not opt.disable_ipv6 else None
if opt.syslog: if opt.syslog:
ssyslog.start_syslog() ssyslog.start_syslog()
ssyslog.close_stdin()
ssyslog.stdout_to_syslog()
ssyslog.stderr_to_syslog() ssyslog.stderr_to_syslog()
return_code = client.main(ipport_v6, ipport_v4, return_code = client.main(ipport_v6, ipport_v4,
opt.ssh_cmd, opt.ssh_cmd,

View File

@ -8,12 +8,24 @@ _p = None
def start_syslog(): def start_syslog():
global _p global _p
_p = ssubprocess.Popen(['logger', with open(os.devnull, 'w') as devnull:
'-p', 'daemon.notice', _p = ssubprocess.Popen(
'-t', 'sshuttle'], stdin=ssubprocess.PIPE) ['logger', '-p', 'daemon.notice', '-t', 'sshuttle'],
stdin=ssubprocess.PIPE,
stdout=devnull,
stderr=devnull
)
def close_stdin():
sys.stdin.close()
def stdout_to_syslog():
sys.stdout.flush()
os.dup2(_p.stdin.fileno(), sys.stdout.fileno())
def stderr_to_syslog(): def stderr_to_syslog():
sys.stdout.flush()
sys.stderr.flush() sys.stderr.flush()
os.dup2(_p.stdin.fileno(), 2) os.dup2(_p.stdin.fileno(), sys.stderr.fileno())