Sshをリモートシステムに使用する場合、LC_ALL="en_US.UTF-8"
を(ssh_configのsendEnv
を介して)エクスポートします。私がsu - user123
になると、この変数はログインシェルによってリセットされます。リモートシステムで別のユーザーとしてログインシェルを実行するときに、この変数(および他のLC_xxx
変数)を保持する方法はありますか?
シェルまたはターゲットユーザーの~/.bashrc
のエントリを実行した後、手動で変数をエクスポートできることを理解していますが、可能であればssh
から送信された元の値を保持したい。ありがとう。
[〜#〜] edit [〜#〜]:ユーザーの環境の特定の部分を初期化する必要があるため、su -
を使用しています。 LC_xxx
のみを保持したい
su
には環境を維持するためのオプションがあることがわかりました。
-m, -p, --preserve-environment
Preserve the current environment, except for:
...
この方法では、ログインシェルの場合と同様に、ターゲットユーザーのシェル初期化ファイルが実行されますが、LC_xxx
変数は、有効な値がすでに含まれている場合はテストして初期化できません。
編集:ただのメモ、エクスポートされたLC_xxx変数を処理するスクリプトを/etc/profile.d/ssh_lc_vars.sh
に追加することで、システム全体に適用できました。また、su -ml userxxx
で処理されない初期化されていない環境変数を使用して、追加の作業を行う必要がありました。スクリプト全体を含めることはできないので、以下に例を示します。誰かがそれを改善することができれば、さらに良いです。
...
# 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
...
Suの-
パラメータをスキップします。
-, -l, --login
Provide an environment similar to what the user would expect had
the user logged in directly.
以下は私にとってはうまくいきます。つまり、環境変数を設定するコマンドを実行するために使用される追加のシェルを呼び出すことになります。
# LC_ALL is set in parent Shell
> export LC_ALL=C
> env | grep LC_ALL
LC_ALL=C
# Verify that since we use `su -` the LC_ALL is not preserved
> su - user123 -c '/bin/bash'
user123@026aedc05a97:~$ env | grep LC_ALL
user123@026aedc05a97:~$ exit
# Pass the variable to the extra Shell explicitly
> su - user123 -c 'LC_ALL='$LC_ALL' /bin/bash'
# The variable is now set
user123@026aedc05a97:~$ env | grep LC_ALL
LC_ALL=C
user123@026aedc05a97:~$