2 Connect to a remote host via SSH and execute a command on the host.
5 from __future__ import absolute_import, print_function
6 import sys, os, re, subprocess
8 from bup import helpers, path
9 from bup.compat import environ
11 def connect(rhost, port, subcmd, stderr=None):
12 """Connect to 'rhost' and execute the bup subcommand 'subcmd' on it."""
13 assert not re.search(br'[^\w-]', subcmd)
14 if rhost is None or rhost == b'-':
15 argv = [path.exe(), subcmd]
17 buglvl = helpers.atoi(environ.get(b'BUP_DEBUG'))
18 force_tty = helpers.atoi(environ.get(b'BUP_FORCE_TTY'))
19 tty_width = helpers.atoi(environ.get(b'BUP_TTY_WIDTH'))
21 sh -c 'BUP_DEBUG=%d BUP_FORCE_TTY=%d BUP_TTY_WIDTH=%d bup %s'
22 """ % (buglvl, force_tty, tty_width, subcmd)
25 argv.extend((b'-p', port))
26 argv.extend((rhost, b'--', cmd.strip()))
27 #helpers.log('argv is: %r\n' % argv)
28 if sys.version_info[0] < 3:
29 return subprocess.Popen(argv,
30 stdin=subprocess.PIPE, stdout=subprocess.PIPE,
32 preexec_fn=lambda: os.setsid())
34 return subprocess.Popen(argv,
35 stdin=subprocess.PIPE, stdout=subprocess.PIPE,
37 start_new_session=True)