Est-il possible de redéfinir le tilde ('~', répertoire personnel)?

13

Est-il possible de redéfinir le répertoire personnel? par exemple, au /ext1/usernamelieu de /home/username, c'est-à-dire en développant le ~dans un autre répertoire (par opposition à la modification du répertoire personnel où se trouvent les fichiers personnels des utilisateurs).

(Cette question est principalement académique, car cela semble être une mauvaise pratique de le faire. Je n'ai pas non plus le choix en matière d'utilisation csh, malgré avoir lu le Top 10.)

Andrew Cheong
la source
11
Voulez-vous dire changer le répertoire personnel réel, ou voulez-vous faire que le shell se développe ~à autre chose que le répertoire personnel?
derobert
Je voulais dire étendre le ~à un autre répertoire (pas, si je comprends bien votre alternative, changer où se trouvent les répertoires personnels de tous les utilisateurs). Je ne savais pas que cela ~était interprété comme une forme courte de $HOME, comme @michas l'a décrit dans sa réponse.
Andrew Cheong
2
Pas tous les répertoires personnels des utilisateurs, vous pouvez en changer un seul, comme le montre slm dans sa réponse.
derobert

Réponses:

28

Le tilde ~est interprété par votre shell. Votre shell interprétera ~comme une forme abrégée de $HOME.

Essayez (echo ~; HOME=foo; echo ~). Cela devrait d'abord imprimer votre vrai répertoire personnel et ensuite "foo", comme vous l'avez défini $HOME.

La valeur par défaut de $HOMEvient de votre configuration système. Utilisez getent passwdpour répertorier tous les utilisateurs connus et leurs répertoires personnels. Selon la configuration de votre système, ces entrées peuvent provenir de /etc/passwdtout service d'annuaire distant.

Si vous souhaitez uniquement redéfinir temporairement votre répertoire personnel, définissez-en simplement un autre $HOME.

Si vous souhaitez le modifier de façon permanente, vous devez modifier l'entrée passwd, par exemple en la modifiant manuellement /etc/passwd.

michas
la source
Merci, @michas. Je ne peux pas croire que j'ai manqué cette variable. (BTW, il s'avère que cshla variable pertinente est $home(en minuscules), et vous ne pouvez pas - setenv HOME /ext1/acheongvous pouvez seulement set home=/ext1/acheong, et cela a fonctionné pour moi.)
Andrew Cheong
2
Pour le changer définitivement, vous pouvez également utiliserusermod -d
user606723
1
Utilisez vipw(ou toute interface graphique fournie par votre système d'exploitation) plutôt que de modifier /etc/passwddirectement. L'édition directe risque de corrompre le fichier, ce qui peut être difficile à récupérer.
Keith Thompson
11

La valeur utilisée ~est déterminée à partir de la valeur que vous obtenez de la base de données administrative ( getent passwd), généralement dans le /etc/passwdfichier, pour le répertoire personnel de chaque utilisateur qui y est défini.

$ 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

La 6e colonne de ce fichier est celle d'où vient la valeur utilisée lorsque quelqu'un tape cd ~.

nsswitch

Vous pouvez voir ce qu'un système utiliserait pour le répertoire personnel de l'utilisateur à l'aide de la commande 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

La "base de données" qui les fournit est contrôlée par le biais de votre résolveur de systèmes, défini dans /etc/nsswitch.conf.

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

Les fichiers ci-dessus signifient /etc/passwd, mais la "base de données" pourrait provenir de LDAP, NIS ou d'autres emplacements sur le réseau, par exemple.

Vous déménagez / redéfinissez?

Pour effectuer cette opération est un peu délicat après la création des comptes. Si vous créez des comptes à partir de zéro, il est trivial de redéfinir l'emplacement d'un utilisateur dans son répertoire personnel. Lors de l'exécution de la useraddcommande, vous pouvez spécifier l'emplacement à utiliser pour le répertoire personnel d'un utilisateur.

Exemple

$ useradd -d /ext1/acheong ...

extrait de la page de manuel

-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.

Pour les comptes existants?

Cela devient plus une opération chirurgicale car souvent le chemin du répertoire personnel d'un utilisateur est inclus statiquement dans les fichiers de configuration, ce qui le rend plus délicat.

Exemple

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

Ceux - ci devront soit être fixé, ou vous aurez à fournir un lien de /home/samvers le nouvel emplacement, /ext1/sam.

Déplacement lorsque la "base de données" n'est pas /etc/passwd

Si le système obtient les répertoires personnels de LDAP, NIS, etc., vous devrez effectuer la relocalisation dans ces systèmes et coordonner le déplacement des fichiers de /home/samvers /ext1/sam.

Les références

slm
la source
Bien sûr, changer cela nécessitera le déplacement des fichiers de l'utilisateur. Et probablement en laissant un lien symbolique à l'ancien endroit (car sinon beaucoup de choses vont se casser ...)
derobert
@derobert - oui, après l'avoir fait plusieurs fois, j'essaye de l'éviter comme la peste.
slm
@slm - Merci pour une réponse aussi détaillée (et un peu d'histoire). J'ai bien peur de chercher à faire quelque chose de beaucoup plus simple - et j'ignorais l'existence d'une variable d'environnement représentant le répertoire personnel de la session. Je suis sûr que votre réponse aidera un autre lecteur à l'avenir, cependant. Merci encore.
Andrew Cheong
1

Si la raison est de répartir les utilisateurs sur plusieurs systèmes de fichiers, vous pouvez également utiliser le automounter. Et même vous permettre d'avoir un répertoire "de base" différent pour vos utilisateurs.

somnolence
la source