/etc/profile.d and "ssh -t"
I didn't find the reason of the problem. Maybe it's specific for the platform (SLES 10 or the variation I use). I found a workaround instead:
ssh -t remote1 "/bin/bash --login -c some-script"
This forces a login shell which runs profile scripts.
Related videos on Youtube
petersohn
Updated on September 18, 2022Comments
-
petersohn almost 2 years
I wanted to run a script on a remote machine. The simple solution is this:
ssh remote1 some-script
This works until the remote script doesn't want to connect to another remote machine (
remote2
) which requires interactive authentication, like tis one (remote2
is only reachable throughremote1
in this case):ssh remote1 "ssh remote2 some-script"
The solution for the problem is to use the
-t
option for ssh.ssh -t remote1 "ssh remote2 some-script"
This works, but I get probems in case I use this (where
some-script
may execute further ssh commands):ssh -t remote1 some-script
I found that some environment variables are not set which are set when I don't use the
-t
option. These envrionment variables are set in scripts from/etc/profile.d
. I guess that these scripts are not run for some reason if using the-t
option, but are run if I don't use it.What's the reason of this? Is there any way to work around it? I am using SUSE linux (version 10).
Edit: I did some additional research. I put some output lines to the following places:
- in one file in
/etc/profile.d
- in
~/.bash_profile
(file didn't exist before) - in
~/.bashrc
(file didn't exist before)
Then I checked several scenarios what output I get and in what order (the environment variable I checked is
$PATH
):ssh remote1
:profile.d
,.bashrc
,.bash_profile
.$PATH
OK.ssh -t remote1
:profile.d
,.bashrc
,.bash_profile
.$PATH
OK.ssh remote1 echo '$PATH'
: only.bashrc
.$PATH
OK.ssh -t remote1 echo '$PATH'
: no script output.$PATH
NOK.
Now I really don't understand what's going on. If I run an interactive shell, everything seems to be working fine (though I find it strange that
~/.bashrc
is included before~/.bash_profile
). If I start a non-interactive shell without-t
, profile scripts don't seem to run but environment variables are set. If I start a non-interactive shell with-t
, then profile scrtipts are not run and environment variables are not set. Does anyone have an explanation on this? - in one file in
-
petersohn over 11 yearsThis still does not explain the difference between calling ssh with and without
-t
. I also checked the appropriateprofile.d
file and/etc/profile
. Inprofile.d
there are no special checks for setting$PATH
. In/etc/profile
the only check is that$PROFILEREAD
is empty, wich is set at the end of that script. I checked, this variable is set when I run ssh without-t
, but not if I run it with-t
. -
chutz over 11 yearsThe only difference between
ssh server command
andssh -t server command
is the presence of a tty. Have you checked if any of the files in/etc/profile.d
are doing such checks? grep fortty
orTERM
and see what that brings about. -
petersohn over 11 yearsAs I said, the files in
/etc/profile.d
has no such conditions. I also checked/etc/profile
, again not containing such conditions. It is possible that it is a platform specific problem on this system, but I can't find the cause.