HOMEを手に入れる話
世の中にはいろいろな不幸がある。今回の不幸はユーザが作れないLinuxサーバの運用を任されたことだ。
まあ、こんな不幸は滅多に遭遇することでもないとは思うけど、今後また同じ不幸に遭遇した時のために書いておく。
こんな情報いるのか?という疑問もあるけど、不幸にもぶち当たった人のヒントになるかもしれない。ホント、みんな useradd
に感謝したほうがいい。
ホームディレクトリ
useradd
ができない環境では自分のユーザを作成できず、共通のユーザで操作することになるため、.toprc
のようないわゆるドットファイルを用意することができない。
今まで触ってきた環境があまりにもぬるま湯過ぎたのか、この事態に対処する方法がすぐには思いつかず、構築されたサーバと運用ルールを呪ったものだが、幸い他の作業をする時間があったため Linuxのホームディレクトリについて調べることにした。
まあ、いわゆるホームディレクトリについて書かれている。マルチユーザで使う時にユーザが自由にファイルを作成できるディレクトリというなんともオアシスのような世界について記述されている。
しかし現実の世界に自由はない。そもそもマルチユーザなんて世界じゃないし。
そうそう、ホームディレクトリはログインした時のワーキングディレクトリで /etc/passwd
に記述されている。
そしてホームディレクトリは環境変数 $HOME
に格納され、多くのプログラムがこれを参照する仕組みになっている。
$HOME
を設定するのはログインシェルで具体的には sshd
から呼び出される bash
みたいなものになるが、sshで接続した直後に環境変数$HOME
を設定できれば実質的なホームディレクトリが手に入る。
sshdのAcceptEnv
sshd
の設定にローカルから送られた環境変数を引き継ぐ AcceptEnv
という設定がある。
ただ、この設定は sshd
の設定で、反映には sshd
を再起動する必要があるし、
クライアント側でも SendEnv
を書く必要があるとはいえ、AcceptEnv HOME
ってのはかなりヤバい気がする。
sshでシェル起動時に環境変数を渡す
まあこっちのほうが現実的か。ログインシェルを変更する用途にも使えて便利だし。
こっちの方法は、 ssh
で bash
のようなシェルをログインモードで起動するようコマンドを渡し、その際に環境変数を上書きするという方法。
ssh -t remote_addr HOME=/tmp /usr/bin/bash -i -l
ssh
のオプション -t
は tty の割り当て。コマンドを渡す場合にはデフォルトでは tty
が生成されないため。
bash
のオプション -l
はログインシェル、-i
はインタラクティブモード。これらを指定するとよく見る入力待ちの端末が出来上がる。
ただ、ログイン直後のカレントディレクトリは /tmp
になっていない。
ログイン後 cd
するのもいいが、/tmp/.bashrc
の最後に cd
と書いておけばいいだけではある。
あと、ssh-keygen
のように一部のプログラムは $HOME
を参照しない。まあ、こいつらは数が少ないので大抵は無視できる。
終わりに
長々と書いたけど、こういう不幸にはあまり遭遇したくない。
シェル周りのオプションを調べたり、sshのことをこんなに調べるなんてことは今までなかったから面白くはあったけど普通こんなことしないし。
単に top
打ったときの動作をいい感じにしたりするのにこんなことしないといけない環境を若い子には触らせたくないね。
あ、そうそう。実はもう一つの不幸に遭遇していて、そっちは timestamp_timeout=0
を設定された環境を任されたことだけど、これは解消したからよしとする(よくはない)。