https://github.com/openssh/openssh-portable/blob/V_7_7/session.c#L1668 In interactive sessions, the shell would be started as "login shell", /etc/profile (or zprofile in the case of zsh) would be sourced. However, when user instructs ssh to execute a command with a non-interactive session, because the shell is started without -l / -- login, the profile files would not be sourced, which leads to inconsistency among the two types of sessions (typically missing expected environment variables in the non-interactive session). Is there any reason that the shell in a non-interactive session should not be started as "login shell"?
That inconsistency is intentional. Command execution sessions are assumed to be non-interactive and are essential to ssh's use as a transport for other protocols (e.g. rsync or git). Shell profile scripts are allows to contain actions that write to stdout and these would interfere with ssh being used as a transport if sourced.
> Command execution sessions are assumed to be non-interactive Of course, but login shell is not equivalent to interactive shell > Shell profile scripts are allows to contain actions that write to stdout and these would interfere with ssh being used as a transport if sourced It is the responsibility of the script writer that he/she should make sure such actions are only performed in interactive shell (e.g. by checking whether "$-" has i, or by putting them in the "rc" file instead). It does not really make sense to break the non-interactive command execution environment just for that, because ssh is logging in either way.
We don't intend to change this for the reasons that I've already described.
Close RESOLVED bugs with the release of openssh-8.0