You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When linux users are created, they get files copied to their home directory copied from /etc/skel. These files aren't available in the image's default home directory, and even if they were, they would typically get replaced by a mounted home directory not bootstrapped with the files.
Due to this, we won't get colors in the terminals for example, and terminal headings are different.
Login shells will run two files, /etc/profile and optionally one of three possible profile files in the user's home directory.
/etc/profile
/etc/bash.bashrc is sourced by /etc/profile
The first of any ~/.bash_profile, ~/.bash_login, and ~/.profile
~/.bashrc is sourced by /etc/skel/.profile, and ~/.bash_profile files typically does that as well if they are defined.
Change idea
Since /etc/skel files won't get copied, should we try to get them invoked if no files are available in the home directory?
I'm thinking about the following change:
# Default to using /etc/skel/.profile and /etc/skel/.bashrc if not in the user's# home directory.USER root
RUN echo ". /etc/bash.bashrc-skel-appendix" >> /etc/bash.bashrc
COPY bash.bashrc-skel-appendix /etc/bash.bashrc-skel-appendix
USER ${NB_USER}
# /etc/skel files should have been copied to a user's home directory, but if the# user's home directory is mounted for example it may not contain files initially# copied from /etc/skel. This can lead to terminals without colors etc.## This script is made to be sourced from the end of /etc/bash.bashrc in order to# default to source files from /etc/skel as a fallback to missing files in the# home directory.## ref: https://github.com/pangeo-data/pangeo-docker-images/issues/574.## ~/.bash_profile, ~/.bash_login, or ~/.profile are defined, it doesn't make# sense to fallback to /etc/skel/.profile, so then return.
[ -f"$HOME/.bash_profile" ] &&return
[ -f"$HOME/.bash_login" ] &&return
[ -f"$HOME/.profile" ] &&return# /etc/skel/.profile directly sources ~/.bashrc if defined, so we first check if# it isn't, and then sources /etc/skel/.bashrc instead.#if [ !-f"$HOME/.bashrc" ];then. /etc/skel/.bashrc
# --------------------------------------------------------------------------# The section below is adjusted from an Ubuntu 22.04 /etc/skel/.bashrc file# in order to tweak how PS1 was set. This influences the terminal prompt and# title.## CHANGES:# - removed "#" from the line with force_color_prompt=yes# - removed "@\h" from PS1's prompt section# - removed "\u@\h: " from the PS1's xterm title section# --------------------------------------------------------------------------# uncomment for a colored prompt, if the terminal has the capability; turned# off by default to not distract the user: the focus in a terminal window# should be on the output of commands, not on the prompt
force_color_prompt=yes
if [ -n"$force_color_prompt" ];thenif [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null;then# We have color support; assume it's compliant with Ecma-48# (ISO/IEC-6429). (Lack of such support is extremely rare, and such# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fifiif [ "$color_prompt"= yes ];then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ 'else
PS1='${debian_chroot:+($debian_chroot)}\u:\w\$ 'fiunset color_prompt force_color_prompt
# If this is an xterm set the title to dircase"$TERM"in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\w\a\]$PS1"
;;
*)
;;
esacfi# Now run /etc/skel/.profile as it wasn't in the user's home directory.. /etc/skel/.profile
Result without PS1 changes
Result with PS1 changes
/etc/profile content reference
Called first in bash login shells. Calls /etc/bash.bashrc and then things in /etc/profile.d.
cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).if [ "${PS1-}" ];thenif [ "${BASH-}" ] && [ "$BASH"!="/bin/sh" ];then# The file bash.bashrc already sets the default PS1.# PS1='\h:\w\$ 'if [ -f /etc/bash.bashrc ];then. /etc/bash.bashrc
fielseif [ "$(id -u)"-eq 0 ];then
PS1='# 'else
PS1='$ 'fififiif [ -d /etc/profile.d ];thenforiin /etc/profile.d/*.sh;doif [ -r$i ];then.$ifidoneunset i
fi
/etc/bash.bashrc content reference
cat /etc/bash.bashrc
# System-wide .bashrc file for interactive bash(1) shells.# To enable the settings / commands in this file for login shells as well,# this file has to be sourced in /etc/profile.# If not running interactively, don't do anything
[ -z"$PS1" ] &&return# check the window size after each command and, if necessary,# update the values of LINES and COLUMNS.shopt -s checkwinsize
# set variable identifying the chroot you work in (used in the prompt below)if [ -z"${debian_chroot:-}" ] && [ -r /etc/debian_chroot ];then
debian_chroot=$(cat /etc/debian_chroot)fi# set a fancy prompt (non-color, overwrite the one in /etc/profile)# but only if not SUDOing and have SUDO_PS1 set; then assume smart user.if! [ -n"${SUDO_USER}"-a-n"${SUDO_PS1}" ];then
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ 'fi# Commented out, don't overwrite xterm -T "title" -n "icontitle" by default.# If this is an xterm set the title to user@host:dir#case "$TERM" in#xterm*|rxvt*)# PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'# ;;#*)# ;;#esac# enable bash completion in interactive shells#if ! shopt -oq posix; then# if [ -f /usr/share/bash-completion/bash_completion ]; then# . /usr/share/bash-completion/bash_completion# elif [ -f /etc/bash_completion ]; then# . /etc/bash_completion# fi#fi# sudo hintif [ !-e"$HOME/.sudo_as_admin_successful" ] && [ !-e"$HOME/.hushlogin" ] ;thencase"$(groups)"in*\ admin\ *|*\ sudo\ *)
if [ -x /usr/bin/sudo ];then
cat <<-EOF To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details.EOFfiesacfi# if the command-not-found package is installed, use itif [ -x /usr/lib/command-not-found -o-x /usr/share/command-not-found/command-not-found ];thenfunctioncommand_not_found_handle {
# check because c-n-f could've been removed in the meantimeif [ -x /usr/lib/command-not-found ];then
/usr/lib/command-not-found -- "$1"return$?elif [ -x /usr/share/command-not-found/command-not-found ];then
/usr/share/command-not-found/command-not-found -- "$1"return$?elseprintf"%s: command not found\n""$1">&2return 127
fi
}
fi
/etc/skel content reference
ls -alh /etc/skel/
total 20K
drwxr-xr-x 2 root root 4.0K Aug 8 14:07 .
drwxr-xr-x 1 root root 4.0K Aug 21 09:03 ..
-rw-r--r-- 1 root root 220 Jan 6 2022 .bash_logout
-rw-r--r-- 1 root root 3.7K Jan 6 2022 .bashrc
-rw-r--r-- 1 root root 807 Jan 6 2022 .profile
cat .profile
# ~/.profile: executed by the command interpreter for login shells.# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login# exists.# see /usr/share/doc/bash/examples/startup-files for examples.# the files are located in the bash-doc package.# the default umask is set in /etc/profile; for setting the umask# for ssh logins, install and configure the libpam-umask package.#umask 022# if running bashif [ -n"$BASH_VERSION" ];then# include .bashrc if it existsif [ -f"$HOME/.bashrc" ];then."$HOME/.bashrc"fifi# set PATH so it includes user's private bin if it existsif [ -d"$HOME/bin" ] ;then
PATH="$HOME/bin:$PATH"fi# set PATH so it includes user's private bin if it existsif [ -d"$HOME/.local/bin" ] ;then
PATH="$HOME/.local/bin:$PATH"fi
cat .bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)# for examples# If not running interactively, don't do anythingcase$-in*i*) ;;
*) return;;
esac# don't put duplicate lines or lines starting with space in the history.# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite itshopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
# check the window size after each command and, if necessary,# update the values of LINES and COLUMNS.shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will# match all files and zero or more directories and subdirectories.#shopt -s globstar# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] &&eval"$(SHELL=/bin/sh lesspipe)"# set variable identifying the chroot you work in (used in the prompt below)if [ -z"${debian_chroot:-}" ] && [ -r /etc/debian_chroot ];then
debian_chroot=$(cat /etc/debian_chroot)fi# set a fancy prompt (non-color, unless we know we "want" color)case"$TERM"in
xterm-color|*-256color) color_prompt=yes;;
esac# uncomment for a colored prompt, if the terminal has the capability; turned# off by default to not distract the user: the focus in a terminal window# should be on the output of commands, not on the prompt#force_color_prompt=yesif [ -n"$force_color_prompt" ];thenif [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null;then# We have color support; assume it's compliant with Ecma-48# (ISO/IEC-6429). (Lack of such support is extremely rare, and such# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fifiif [ "$color_prompt"= yes ];then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ 'else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ 'fiunset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dircase"$TERM"in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac# enable color support of ls and also add handy aliasesif [ -x /usr/bin/dircolors ];thentest -r ~/.dircolors &&eval"$(dircolors -b ~/.dircolors)"||eval"$(dircolors -b)"alias ls='ls --color=auto'#alias dir='dir --color=auto'#alias vdir='vdir --color=auto'alias grep='grep --color=auto'alias fgrep='fgrep --color=auto'alias egrep='egrep --color=auto'fi# colored GCC warnings and errors#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'# some more ls aliasesalias ll='ls -alF'alias la='ls -A'alias l='ls -CF'# Add an "alert" alias for long running commands. Use like so:# sleep 10; alertalias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'# Alias definitions.# You may want to put all your additions into a separate file like# ~/.bash_aliases, instead of adding them here directly.# See /usr/share/doc/bash-doc/examples in the bash-doc package.if [ -f~/.bash_aliases ];then.~/.bash_aliases
fi# enable programmable completion features (you don't need to enable# this, if it's already enabled in /etc/bash.bashrc and /etc/profile# sources /etc/bash.bashrc).if!shopt -oq posix;thenif [ -f /usr/share/bash-completion/bash_completion ];then. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ];then. /etc/bash_completion
fifi
cat .bash_logout
# ~/.bash_logout: executed by bash(1) when login shell exits.# when leaving the console clear the screen to increase privacyif [ "$SHLVL"= 1 ];then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi
The text was updated successfully, but these errors were encountered:
consideRatio
changed the title
DRAFT ISSUE: Terminal colors etc -- adjust to missing /etc/skel files in user's home dir (.profile, .bashrc, .bash_logout)?
Terminal colors etc -- adjust to missing /etc/skel files in user's home dir (.profile, .bashrc, .bash_logout)?
Aug 21, 2024
When linux users are created, they get files copied to their home directory copied from
/etc/skel
. These files aren't available in the image's default home directory, and even if they were, they would typically get replaced by a mounted home directory not bootstrapped with the files.Due to this, we won't get colors in the terminals for example, and terminal headings are different.
How files are executed
Login shells
Login shells will run two files,
/etc/profile
and optionally one of three possible profile files in the user's home directory./etc/profile
/etc/bash.bashrc
is sourced by/etc/profile
~/.bash_profile
,~/.bash_login
, and~/.profile
~/.bashrc
is sourced by/etc/skel/.profile
, and~/.bash_profile
files typically does that as well if they are defined.Change idea
Since
/etc/skel
files won't get copied, should we try to get them invoked if no files are available in the home directory?I'm thinking about the following change:
/etc/profile
content referenceCalled first in bash login shells. Calls
/etc/bash.bashrc
and then things in/etc/profile.d
.cat /etc/profile
/etc/bash.bashrc
content referencecat /etc/bash.bashrc
/etc/skel
content referencels -alh /etc/skel/
total 20K drwxr-xr-x 2 root root 4.0K Aug 8 14:07 . drwxr-xr-x 1 root root 4.0K Aug 21 09:03 .. -rw-r--r-- 1 root root 220 Jan 6 2022 .bash_logout -rw-r--r-- 1 root root 3.7K Jan 6 2022 .bashrc -rw-r--r-- 1 root root 807 Jan 6 2022 .profile
cat .profile
cat .bashrc
cat .bash_logout
The text was updated successfully, but these errors were encountered: