LDAPを用いた複数の環境でログインシェルを変更したかった。現在自分の環境ではLDAPを利用している。ログイン情報をLDAPサーバに集約できるので非常に便利。LDAPではログイン時にユーザ名、パスワード(ハッシュ)などの情報を各ホストに提供するのだけれど、その中にはログインシェルも含まれる。自分はzshをメインのシェルとしているのだけれど、LDAPのログインシェルの情報をzshに変更するだけでは問題がある。一つ目はフルパス表記での問題だ。ログインシェルは通常フルパスで表記される。~/zshrcといった環境ファイルを読み込ませ、その段階でパスがセットされるからだ。ログインシェルの情報を取得して起動させる段階ではパスが通っていないことが想定される。このフルパス表記がOS毎に違ってくる可能性がある、ということが問題の核だ。このシェルの実体、バイナリの実体が配置される場所は大まかに以下のようになる。aptなどのパッケージ管理ツールでインストールした場合の/usr/bin/、デフォルトで配置される/bin/、ソースからインストールされた/usr/local/binである。/bin/tcshなどに配置されるが、後から手動でインストールされたバイナリは/usr/local/binに配置される。zshやbash(FreeBSDではbashがデフォルトで入ってこない)は/usr/local/binに置かれている訳だ。/usr/local/binのいずれかに統一してしまう、若しくはシンボリックリンクを統一された場所に配置する、という解決方法が考えられる。これらの作業をそれぞれのホストでいちいち実行するのは億劫だ。二つ目の問題はデフォルトでインストールされるシェルが少ないことだ。Xと数種類のOSを利用している。その中でデフォルトでインストールされるシェル、となると実は結構少ない。FreeBSDではcsh若しくはtcshをデフォルトシェルにする事が多い。対してLinuxではbashがデフォルトシェルとなることがおおい。残念な事にはFreeBSD/Linuxに於いては(t)csh/bashがお互いにデフォルトでインストールされていない。いうことはbashならbashをLDAPのデフォルトシェルにしてしまって、bashの環境ファイルである.bashrcなどでzshを呼び出す、という事ができない。以上の点を踏まえながら試行錯誤していった結果、「UNIX/Linuxの両方に入っているシェルを使ってログイン時にzshにしてしまう」という方法にたどり着いた。ちなみにそのUNIX/Linuxの各種OSの最大公約数と言うべきシェルはsh。shellを意味し、bashの前身となったシェルだ。過去にはバックスペースすら無かった気もするけれど、カーソルキーで入力位置を変更できない、コマンド履歴が使えないというシェルの基本的な機能のみしか持っていない素朴なシェルだ。(とは言え、過去のbashも同様でデフォルトではコマンド履歴なども使えなかった気がしてbashとshのデフォルト状態での違いがあまり無いような状態だったんだけれど、最近のbashは使いやすいシェルっぽくなってる)さてLDAPではこのshをデフォルトシェルにし、shが立ち上がった後にzshを呼び出すようにしてみる。“.profile”ファイルである。”.login”かと思ったんだけれどこれはshだと実行されないしcsh系だった気がする。sh系ではダメということ。この.profileファイルには直接shに実行して欲しいことを記述する。/bin/zshshらしい記述で条件式を書き、それぞれのバイナリが存在し実行可能であればexecしてやる。execでシェルを呼び出せばログインシェルが切り替わった動作になるのでCtrl+Dなどでシェルを抜けたときにzshを支えているshも一緒にexitしてくれる。ログインシェルがzshになったようにみえてshを意識することが無い。以上で思っていたようなzshなどのパスが違う環境でログインシェルを統一する、ということが可能になった。posts:多ホスト環境でログインシェルを切り替えたいCentOSでSSHのログインがとても遅かった件LinuxのOSの起動時にデーモンを自動で立てる方法。Macのsambaをマウントする時、濁点と半濁点が化けるTeamSpeak3で管理者ログインする方法ファイルの所有者にwが付いてるときにグループにもwを出す方法ディレクトリのパーミッションだけ変更する方法CentOSでNISを利用するTeamSpeak3のserveradminのパスワードを忘れてしまった場合の対処法centosでのネットワークインタフェースの再起動この投稿へのコメントコメントはありません。コメントをキャンセルこの投稿へのトラックバックトラックバックはありません。キャンセル投稿を送信できませんでした。メールアドレスを確認してください。メール送信チェックに失敗しました。このブログではメールでの投稿共有はできません。%d人のブロガーが「いいね」をつけました。