From cace9cf6f65422fbbc78c11515ceba56fd00f87a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 11 Aug 2025 15:58:31 +0900 Subject: [PATCH] machinectl: set TERM=dumb when running on a dumb terminal or with a pipe Fixes #38527. --- src/machine/machinectl.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index 4e3138b2ff1..fd37bde874a 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -1400,18 +1400,25 @@ static int shell_machine(int argc, char *argv[], void *userdata) { return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Shell only supported on local machines."); - /* Pass $TERM & Co. to shell session, if not explicitly specified. */ - FOREACH_STRING(v, "TERM=", "COLORTERM=", "NO_COLOR=") { - if (strv_find_prefix(arg_setenv, v)) - continue; + if (terminal_is_dumb()) { + /* Set TERM=dumb if we are running on a dumb terminal or with a pipe. + * Otherwise, we will get unwanted OSC sequences. */ + if (!strv_find_prefix(arg_setenv, "TERM=")) + if (strv_extend(&arg_setenv, "TERM=dumb") < 0) + return log_oom(); + } else + /* Pass $TERM & Co. to shell session, if not explicitly specified. */ + FOREACH_STRING(v, "TERM=", "COLORTERM=", "NO_COLOR=") { + if (strv_find_prefix(arg_setenv, v)) + continue; - const char *t = strv_find_prefix(environ, v); - if (!t) - continue; + const char *t = strv_find_prefix(environ, v); + if (!t) + continue; - if (strv_extend(&arg_setenv, t) < 0) - return log_oom(); - } + if (strv_extend(&arg_setenv, t) < 0) + return log_oom(); + } (void) polkit_agent_open_if_enabled(arg_transport, arg_ask_password); -- 2.47.3