From: Lennart Poettering Date: Fri, 31 Jan 2025 14:06:34 +0000 (+0100) Subject: run: tweak logic how we set $TERM for activated services X-Git-Tag: v258-rc1~1227^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4d6eb6441a5332c285e35907894c7d4f3463ba64;p=thirdparty%2Fsystemd.git run: tweak logic how we set $TERM for activated services There are two cases when we invoke a service on a TTY: 1. We ourselves are connected to a TTY and would intend to enable PTY forwarding. 2. We are allocating a TTY but are not ourselves connected to a TTY and just want to input/output to pipe or other non-TTY fd. Let's propagate $TERM only as-is in the first case. In the 2nd case, let's explicitly set $TERM to "dumb", so that invoked progams do not issue needless ansi sequences, since we are not propagating them to a terminal either. This should be a much safer result, for cases where people include invocations of systemd-nspawn with full TTY allocation in a shell pipeline or so. (of course, the user can always explicitly override this) --- diff --git a/src/run/run.c b/src/run/run.c index b2d74f60889..816fd8dd9a4 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -1233,7 +1233,7 @@ static int transient_kill_set_properties(sd_bus_message *m) { } static int transient_service_set_properties(sd_bus_message *m, const char *pty_path, int pty_fd) { - bool send_term = false; + int send_term = false; /* tri-state */ int r; /* We disable environment expansion on the server side via ExecStartEx=:. @@ -1312,14 +1312,22 @@ static int transient_service_set_properties(sd_bus_message *m, const char *pty_p if (r < 0) return bus_log_create_error(r); - send_term = isatty_safe(STDIN_FILENO) || isatty_safe(STDOUT_FILENO) || isatty_safe(STDERR_FILENO); + send_term = -1; } - if (send_term) { + if (send_term != 0) { const char *e; - e = getenv("TERM"); - if (e) { + /* Propagate $TERM only if we are actually connected to a TTY */ + if (isatty_safe(STDIN_FILENO) || isatty_safe(STDOUT_FILENO) || isatty_safe(STDERR_FILENO)) { + e = getenv("TERM"); + send_term = true; + } else + /* If we are not connected to any TTY ourselves, then send TERM=dumb, but only if we + * really need to (because we actually allocated a TTY for the service) */ + e = "dumb"; + + if (send_term > 0) { _cleanup_free_ char *n = NULL; n = strjoin("TERM=", e);