なんかかきたい

プログラミングなどの個人的なメモやサークル「ゆきいろパラソル」の情報を載せてます

HOMEを手に入れる話

世の中にはいろいろな不幸がある。今回の不幸はユーザが作れないLinuxサーバの運用を任されたことだ。

まあ、こんな不幸は滅多に遭遇することでもないとは思うけど、今後また同じ不幸に遭遇した時のために書いておく。

こんな情報いるのか?という疑問もあるけど、不幸にもぶち当たった人のヒントになるかもしれない。ホント、みんな useradd に感謝したほうがいい。

ホームディレクト

useradd ができない環境では自分のユーザを作成できず、共通のユーザで操作することになるため、.toprc のようないわゆるドットファイルを用意することができない。

今まで触ってきた環境があまりにもぬるま湯過ぎたのか、この事態に対処する方法がすぐには思いつかず、構築されたサーバと運用ルールを呪ったものだが、幸い他の作業をする時間があったため Linuxのホームディレクトリについて調べることにした。

ホームディレクトリ - Wikipedia

まあ、いわゆるホームディレクトリについて書かれている。マルチユーザで使う時にユーザが自由にファイルを作成できるディレクトリというなんともオアシスのような世界について記述されている。

しかし現実の世界に自由はない。そもそもマルチユーザなんて世界じゃないし。

そうそう、ホームディレクトリはログインした時のワーキングディレクトリで /etc/passwd に記述されている。

そしてホームディレクトリは環境変数 $HOME に格納され、多くのプログラムがこれを参照する仕組みになっている。

$HOME を設定するのはログインシェルで具体的には sshd から呼び出される bash みたいなものになるが、sshで接続した直後に環境変数$HOMEを設定できれば実質的なホームディレクトリが手に入る。

sshdのAcceptEnv

sshd の設定にローカルから送られた環境変数を引き継ぐ AcceptEnv という設定がある。

ただ、この設定は sshd の設定で、反映には sshd を再起動する必要があるし、 クライアント側でも SendEnv を書く必要があるとはいえ、AcceptEnv HOME ってのはかなりヤバい気がする。

sshでシェル起動時に環境変数を渡す

まあこっちのほうが現実的か。ログインシェルを変更する用途にも使えて便利だし。

こっちの方法は、 sshbash のようなシェルをログインモードで起動するようコマンドを渡し、その際に環境変数を上書きするという方法。

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 を設定された環境を任されたことだけど、これは解消したからよしとする(よくはない)。