やったこと
LANGとかPATHとかbash入ってからexportしそうなやつを、ログイン前にsshコマンドのオプションとして指定してログインする。
(ログイン後に環境変数をexportとかしないで済む)
# ログイン前
[user@client ~]$ ssh -t (IP) "bash -c 'export LANG=C;export PATH=$PATH:/usr/local/foo/bin:/usr/local/bar/bin;bash';"
# ログイン後
[user@server ~]$ env |grep -e LANG -e PATH
PATH=(もともとあったの):/usr/local/foo/bin:/usr/local/bar/bin
LANG=C
# 反映されてる!!
なんか黒魔術感あるけど、サーバがたくさんあって毎度.bashrcを配布するのめんどくさかったりする時便利。
もっと簡単な方法がすごくある気がすごくするけど考えない考えない。
よくわかる?解説
あれこれ試したらできたので定かではないが、雑に言うとsshで仮想端末ありでbashを単発実行して、その実行の中で環境変数設定して、その上でさらに対話モードのbashを実行してる。
# ざっくりコマンドの意味
$ ssh -t (IP) "bash -c 'export LANG=C;export PATH=$PATH:/usr/local/foo/bin:/usr/local/bar/bin;bash';"
ssh -t (IP):仮想端末割当てログイン
bash -c '...':後ろのコマンドを単発実行
export ...;bash:環境変数指定して、bashをさらに対話モードで開く
それでは試行錯誤の流れを追ってみよう。
まず、ssh (IP) "コマンド"のよくあるのだと端末というかシェルがリモート上に行ってしまい見えない
[user@client ~]$ ssh (IP) "bash;export LANG=C"
# シェル返ってこない
そこでsshに-tつけるとシェルが返ってくる。が、LANG反映されてない。
[user@client ~]$ ssh -t (IP) "bash;export LANG=C"
[user@server ~]$
# シェル返ってくる(ログインできる)
[user@server ~]$ env |grep LANG
LANG=en_US.UTF-8
# デフォルトのまま
これは、bashが終わったらexportするからなので、するとbash起動した上でexportする必要がある。
("bash&&export LANG=C"とかでも当然だめ)
なので、bashをあれこれ試行錯誤してみる。
まず、bashから環境変数指定するため、bash -cするとこうなる。
$ bash -c 'export LANG=C;echo $LANG';
C
$ echo $LANG
ja_JP.UTF-8
# bash -cの中でだけLANGが有効になって、手元のbashには反映されてない。
ただ、これでは単発処理で終わってしまうので、対話モードの追いbash。
$ bash -c 'export LANG=C;echo $LANG;bash';
C
$ echo $LANG
C
# できた。 (本来bashして新しいシェルプロセスに入ってからexportするのを再現できてる。)
あとは全部つなげて、最初のものができあがる。
# ログイン前
[user@client ~]$ ssh -t (IP) "bash -c 'export LANG=C;export PATH=$PATH:/usr/local/foo/bin:/usr/local/bar/bin;bash';"
# ログイン後
[user@server ~]$ env |grep -e LANG -e PATH
PATH=(もともとあったの):/usr/local/foo/bin:/usr/local/bar/bin
LANG=C
# 反映されてる!!
なお、踏み台サーバにIPだけ引数にしたスクリプトでも置いておけば(カスタムsshスクリプト)、特定にログインする時便利だなと。
以上。