ChatGPT解决这个技术问题 Extra ChatGPT

.bashrc at ssh login

When I ssh into my ubuntu-box running Hardy 8.04, the environment variables in my .bashrc are not set.

If I do a source .bashrc, the variables are properly set, and all is well.

How come .bashrc isn't run at login?

How on earth is this "off topic"?
I'm not strict like this, but my guess is that this belongs in serverfault.com, superuser.com, or askubuntu.com
@MichaelButler Agreed. Wonder why they don't move it instead of just close it down...
@Luc - Questions can only be moved within 60 days of being created. This question wasn't closed as off topic until 3 and a half years after it was created. I believe the 60 days rule has something to do with when the question databases are backed up or something... it becomes more difficult to migrate after that backup occurs.
I thought it was a pretty useful question. Encountered this issue when I had to ssh into machine A, in order to ssh into machine B (only accessible via A's local network). Taught me a practical difference between .bashrc and .bash_profile !

A
Ayman Hourieh

.bashrc is not sourced when you log in using SSH. You need to source it in your .bash_profile like this:

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

this should work on any sane distro with Bash, thus all these comments are obsolete :)
This isn't necessary with Ubuntu 12.04 LTS server, since .bashrc is sourced when you SSH in, by default.
@orokusaki: Correction, it is :) There was a rogue .bash_profile file which was forcing .profile to be skipped.
Like @LesterPeabody, my .bashrc wasn't being sourced on a Ubuntu 12.04 LTS server because of a rogue .bash_profile. It was created by the RVM install. I moved the RVM command to .profile and delete .bash_profile. All running fine now.
fwiw Debian Jessie/8 already sources .bashrc out-of-the-box - but it does it from .profile, not .bash_profile.
3
3 revs, 2 users 80%

I had similar situation like Hobhouse. I wanted to use the command

ssh myhost.com 'some_command'

where some_command exists in /var/some_location.

I tried to append /var/some_location to the PATH environment variable by editing $HOME/.bashrc but that wasn't working. Because per default, .bashrc (on Ubuntu 10.4 LTS) exits early due to this piece of code:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Meaning if you want to change the environment for the ssh non-login shell, you should add code above that line.


Cool tip dewd. I've run into this trap when running scripts from jenkins. I've logged via ssh and it worked. Jenkins logged non-interactively and it failed.
Why the common solution is to not even set a new path for non-interactive shells is beyond me. There should be quite a bit above that if statement, for just this reason. Seems like only the aliases and the initialization of interactive tools should go below that line...
On other version of Ubuntu the interactive check looks like: bash # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac
Thanks, this solved it for me. Wish I'd seen this about an hour ago!
From man ssh: " If a command is specified, it is executed on the remote host instead of a login shell." For me on Fedora Core 29 it doesn't call neither .bashrc nor .bash_profile when running commands (and calls them without commands).
l
lhunath

For an excellent resource on how bash invocation works, what dotfiles do what, and how you should use/configure them, read this:

DotFiles


The key passage: "causes it to read /etc/profile and then one of .bash_profile or .bash_login or .profile."
L
Loïc Wolff

If ayman's solution doesn't work, try naming your file .profile instead of .bash_profile. That worked for me.


Awesome. I lost 15 minutes on this detail.
i think .profile loads on GUI login. .bash_profile its for terminal logins.
This also worked for SSH login to a Debian Jessie docker container (using a data only container for persistent storage) - BUT you may also want to check /etc/passwd to check your login shell is /bin/bash & not /bin/sh -------> /bin/dash
@RazecLuar .profile is to be executed by any login shell, regardless of whether said shell intends to spawn a GUI. Your comment totally contradicts the question and this answer, which clearly indicate that .profile is invoked on SSHing in - a distinctly non-GUI method.
s
swaz

Similar as @Loïc Wolff , Added below in my $HOME/.bash_profile Ubuntu 16

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        echo "Executed .bash_profile , calling .bashrc"
        . "$HOME/.bashrc"
    fi
fi