チルダ( '〜'、ホームディレクトリ)を再定義することはできますか?


13

ホームディレクトリを再定義することは可能ですか?たとえば、の/ext1/username代わりに/home/username、つまり~別のディレクトリに展開します(ユーザーのホームファイルが置かれている実際のホームディレクトリを変更するのではなく)。

(この質問はたいていアカデミックです。そうするのは悪い習慣のようです。cshトップ10を読んだにもかかわらず、を使用することに関しても選択肢がありません。)


11
あなたが意味するか変更実際のホームディレクトリを、またはあなたはシェルが拡大作る意味ですか~実際のホームディレクトリ以外に?
デロバート

~別のディレクトリに拡張することを意味しました(代替案を正しく理解していなければ、すべてのユーザーのホームディレクトリの場所を変更しません)。@michasが彼の答えで説明したように、それ~がの短い形式として解釈されることに気づきませんでした$HOME
アンドリューチョン

2
いないすべてのユーザのホームディレクトリ、あなたは彼の答えでSLMが示すように、一つだけを変更することができます。
デロバート

回答:


28

チルダ~はシェルによって解釈されます。シェルは~の短い形式として解釈され$HOMEます。

試してください(echo ~; HOME=foo; echo ~)。これにより、最初に実際のホームディレクトリが出力され、その後、「foo」が設定されます$HOME

のデフォルト値$HOMEは、システム構成から取得されます。getent passwd既知のすべてのユーザーとそのホームディレクトリを一覧表示するために使用します。システム構成に応じて、これらのエントリは/etc/passwdリモートディレクトリサービスから取得される場合があります。

ホームディレクトリを一時的に再定義するだけの場合は、別のを設定するだけです$HOME

永続的に変更したい場合は、たとえば手動で編集して、passwdエントリを変更する必要があります/etc/passwd


ありがとう、@ michas。私がその変数を見逃したとは信じられません。(ちなみに、csh関連する変数は$home(小文字)であることがsetenv HOME /ext1/acheongわかります。できません—できるのset home=/ext1/acheongは私だけです。)
Andrew Cheong

2
永続的に変更するには、次を使用することもできますusermod -d
user606723

1
直接vipw編集/etc/passwdするのではなく、使用する(またはOSが提供するGUI)。直接編集すると、ファイルが破損するリスクがあり、回復が困難になる場合があります。
キーストンプソン

11

に使用される値 ~、管理データベース(getent passwd)から取得した値(通常は/etc/passwdファイル内)から、そこに定義されている各ユーザーのホームディレクトリに対して決定されます。

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

このファイルの6番目の列は、誰かcd ~が入力したときに使用される値です。

nsswitch

次のコマンドを使用して、システムがユーザーのホームディレクトリに使用するものを確認できます。 getent passwd

$ getent passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

これらを提供する「データベース」は、システムリゾルバによって制御されます。 /etc/nsswitch.confます。

$ grep passwd /etc/nsswitch.conf 
#passwd:    db files nisplus nis
passwd:     files

上記のファイルはを意味し/etc/passwdますが、「データベース」は、LDAP、NIS、またはネットワーク上の他の場所などから取得できます。

移動/再定義しますか?

アカウントを作成した後、この操作を実行するには少し注意が必要です。アカウントをゼロから作成している場合、ユーザーのホームディレクトリの場所を再定義するのは簡単です。実行するときuseraddコマンドをに、ユーザーのホームディレクトリに使用する場所を指定できます。

$ useradd -d /ext1/acheong ...

マニュアルページからの抜粋

-d, --home HOME_DIR
   The new user will be created using HOME_DIR as the value for the users 
   login directory. The default is to append the LOGIN name to BASE_DIR and 
   use that as the login directory name. The directory HOME_DIR does not 
   have to exist but will not be created if it is missing.

既存のアカウントの場合?

多くの場合、ユーザーのホームディレクトリのパスが構成ファイルに静的に含まれて、より複雑になるため、これは外科手術になります。

$ grep home /home/sam/.*
/home/sam/.gtkrc-1.2-gnome2:include "/home/sam/.gtkrc.mine"

これらを修正するか/home/sam、新しい場所へのリンクを提供する必要があります。/ext1/sam

「データベース」がそうでない場合の移動 /etc/passwd

システムがLDAP、NISなどからホームディレクトリを取得している場合、それらのシステムで再配置を実行し、ファイルをから/home/samに移動する調整を行う必要があります/ext1/sam

参照資料


もちろん、これを変更するには、ユーザーのファイルを移動する必要があります。そしておそらく古い場所にシンボリックリンクを残します(そうでなければ多くのことが壊れるでしょう...)
derobert

@derobert-ええ、これを数回やったので、ペストのように避けようとしています。
slm

@slm-このような詳細な回答(および歴史の一部)に感謝します。もっと簡単なことをしようとしていたのではないかと心配しています。また、セッションのホームディレクトリを表す環境変数の存在についても無知でした。しかし、あなたの答えは将来、別の読者に役立つと確信しています。再度、感謝します。
アンドリューチョン

1

理由が複数のファイルシステムにユーザーを分散させることである場合、を使用することもできますautomounter。さらに、ユーザー用に別の「ベース」ディレクトリを持つこともできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.