diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 7dccd55a6..e73aaf2dd 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -4,6 +4,7 @@ import faulthandler import functools import hashlib import inspect +import itertools import json import logging import os @@ -3306,6 +3307,9 @@ class Archiver: if cmd is not None and result.func == self.do_serve: forced_result = result argv = shlex.split(cmd) + # Drop environment variables (do *not* interpret them) before trying to parse + # the borg command line. + argv = list(itertools.dropwhile(lambda arg: '=' in arg, argv)) result = self.parse_args(argv[1:]) if result.func != forced_result.func: # someone is trying to execute a different borg subcommand, don't do that! diff --git a/src/borg/testsuite/archiver.py b/src/borg/testsuite/archiver.py index 287dfe2c2..f2608f13b 100644 --- a/src/borg/testsuite/archiver.py +++ b/src/borg/testsuite/archiver.py @@ -2841,6 +2841,13 @@ def test_get_args(): 'borg init --encryption=repokey /') assert args.func == archiver.do_serve + # Check that environment variables in the forced command don't cause issues. If the command + # were not forced, environment variables would be interpreted by the shell, but this does not + # happen for forced commands - we get the verbatim command line and need to deal with env vars. + args = archiver.get_args(['borg', 'serve', ], + 'BORG_HOSTNAME_IS_UNIQUE=yes borg serve --info') + assert args.func == archiver.do_serve + def test_compare_chunk_contents(): def ccc(a, b):