Descobri que su
tem uma opção para preservar o ambiente:
-m, -p, --preserve-environment
Preserve the current environment, except for:
...
Desta forma, os arquivos init do shell do usuário alvo são executados, assim como eles seriam para um shell de login, mas qualquer variável LC_xxx
pode ser testada e não inicializada se eles já contiverem um valor válido.
EDITAR: Apenas uma nota, eu consegui aplicar esse sistema inteiro adicionando um script em /etc/profile.d/ssh_lc_vars.sh
que funcionava com as variáveis LC_xxx exportadas. Eu também tive que fazer um trabalho extra com as variáveis de ambiente não inicializadas que não são tratadas com su -ml userxxx
. Abaixo está mais um exemplo, pois não posso incluir o script inteiro. Se alguém puder melhorar, melhor ainda.
...
# clean up client-side variable for junk
lc_sanitize()
{
arg="$1"
# first, strip underscores
clean="${arg//_/}"
# next, replace spaces with underscores
clean="${clean// /_}"
# now, clean out anything that's not alphanumeric, underscore, hypen or dot
ret="${clean//[^a-zA-Z0-9_\.-]/}"
# return santized value to caller
echo "$ret"
}
# LC_MY_LANG comes from an ssh client environment. If empty,
# this isn't a remote ssh user, but set it locally so this user
# can connect elsewhere where this script runs
if [ -z "$LC_MY_LANG" ]; then
# force an LC_xxx setting for the environment
LC_MY_LANG="en-US.utf-8"
else
# otherwise, use the LC_xxxx variable from the ssh environment
# 2017-01-30 - when using "su --preserve-environment userxxx --login" be sure to fixup needed variables
# shorthand: su -ml user111
export USER='whoami'
export LOGNAME=${USER}
export HOME=$( getent passwd "$USER" | cut -d: -f6 )
cd ${HOME}
# sanitize variable which was set client-side and log it
u_sanitized=$(lc_sanitize "$LC_MY_LANG")
echo "Notice: LC_MY_LANG sanitized to $u_sanitized from $SSH_CLIENT as user $USER" | logger -p auth.info
fi
# mark variable read-only so user cannot change it then export it
readonly LC_MY_LANG
# set terminal to LC_MY_LANG
export LC_LANG=${LC_MY_LANG}
export LC_MY_LANG
...