X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=bup.git;a=blobdiff_plain;f=lib%2Fbup%2Fssh.py;h=de0448d003467f248572311b81b861e6d3560e46;hp=f91e16dcb34bc9ce1d755704b2c1a8f96db439b3;hb=bf67f94dd4f4096de4eee07a7dc377d6c889a016;hpb=7ce8041f03454aa8393e85a7c4aa5f55a79e51fb diff --git a/lib/bup/ssh.py b/lib/bup/ssh.py index f91e16d..de0448d 100644 --- a/lib/bup/ssh.py +++ b/lib/bup/ssh.py @@ -1,24 +1,21 @@ """SSH connection. Connect to a remote host via SSH and execute a command on the host. """ -import os -import sys -import re -import subprocess -from bup import helpers +from __future__ import absolute_import, print_function +import sys, os, re, subprocess +from bup import helpers, path +from bup.compat import environ -def connect(rhost, port, subcmd): +def connect(rhost, port, subcmd, stderr=None): """Connect to 'rhost' and execute the bup subcommand 'subcmd' on it.""" - assert(not re.search(r'[^\w-]', subcmd)) - main_exe = os.environ.get('BUP_MAIN_EXE') or sys.argv[0] - nicedir = os.path.split(os.path.abspath(main_exe))[0] - nicedir = re.sub(r':', "_", nicedir) - if rhost == '-': + assert not re.search(br'[^\w-]', subcmd) + nicedir = re.sub(b':', b'_', path.exedir()) + if rhost == b'-': rhost = None if not rhost: - argv = ['bup', subcmd] + argv = [b'bup', subcmd] else: # WARNING: shell quoting security holes are possible here, so we # have to be super careful. We have to use 'sh -c' because @@ -27,22 +24,32 @@ def connect(rhost, port, subcmd): # can't exec *safely* using argv, because *both* ssh and 'sh -c' # allow shellquoting. So we end up having to double-shellquote # stuff here. - escapedir = re.sub(r'([^\w/])', r'\\\\\\\1', nicedir) - buglvl = helpers.atoi(os.environ.get('BUP_DEBUG')) - force_tty = helpers.atoi(os.environ.get('BUP_FORCE_TTY')) - cmd = r""" + escapedir = re.sub(br'([^\w/])', br'\\\\\\\1', nicedir) + buglvl = helpers.atoi(environ.get(b'BUP_DEBUG')) + force_tty = helpers.atoi(environ.get(b'BUP_FORCE_TTY')) + cmd = b""" sh -c PATH=%s:'$PATH BUP_DEBUG=%s BUP_FORCE_TTY=%s bup %s' """ % (escapedir, buglvl, force_tty, subcmd) - argv = ['ssh'] + argv = [b'ssh'] if port: - argv.extend(('-p', port)) - argv.extend((rhost, '--', cmd.strip())) + argv.extend((b'-p', port)) + argv.extend((rhost, b'--', cmd.strip())) #helpers.log('argv is: %r\n' % argv) - def setup(): - # runs in the child process - if not rhost: - os.environ['PATH'] = ':'.join([nicedir, - os.environ.get('PATH', '')]) - os.setsid() - return subprocess.Popen(argv, stdin=subprocess.PIPE, stdout=subprocess.PIPE, - preexec_fn=setup) + if rhost: + env = environ + else: + envpath = environ.get(b'PATH') + env = environ.copy() + env[b'PATH'] = nicedir if not envpath else nicedir + b':' + envpath + if sys.version_info[0] < 3: + return subprocess.Popen(argv, + stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=stderr, + env=env, + preexec_fn=lambda: os.setsid()) + else: + return subprocess.Popen(argv, + stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=stderr, + env=env, + start_new_session=True)