I can't seem to set a new $PATH such that it is used when executing commands via ssh user@host command
. I have tried adding export PATH=$PATH:$HOME/new_path
to ~/.bashrc and ~/.profile on the remote machine, but executing ssh user@host "echo \$PATH"
shows that the change has not been picked up (it shows /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games). The remote machine is running Ubuntu 8.04.
I'm sure I could hack it into /etc/profile, but that's not a clean solution and it only works when one has root access.
In addition to @signpolyma answer, you will have to add your export before these lines
As grawity said, ~/.bashrc is what you want, since it is sourced by non-interactive non-login shells.
I expect the problem you're having has to do with the default Ubuntu ~/.bashrc file. It usually starts with something like this:
You want to put anything for non-interactive shells before this line.
ssh documentation says:
which is why adding to the bashrc files doesn't work. you do however have the following options:
If the
PermitUserEnvironment
option is set in the sshd config, you can add your PATH setting to~/.ssh/environment
ssh remotemachine 'bash -l -c "somecommand"'
Just had the same problem myself, solved it with:
Do you have an
~/.bash_login
or~/.bash_profile
?Bash in interactive mode checks for these files, and uses the first existing one, in this order:
~/.bash_profile
~/.bash_login
~/.profile
So if you have an
~/.bash_profile
, then whatever changes you do to~/.profile
will be left unseen.Bash in non-interactive mode sometimes reads the file
~/.bashrc
(which is also often source'd from the interactive scripts.) By "sometimes" I mean that it is distribution-dependent: quite oddly, there is a compile-time option for enabling this. Debian enables the~/.bashrc
reading, while e.g. Arch does not.ssh
seems to be using the non-interactive mode,so~/.bashrc
should be enough. When having problems like this, I usually add a few echo's to see what files are being run.You can always say: