È possibile ridefinire la tilde ('~', directory home)?


13

È possibile ridefinire la home directory? ad esempio, al /ext1/usernameposto di /home/username, cioè l'espansione del ~un'altra directory (al contrario di cambiare la directory home effettivo in cui si trovano i file home degli utenti).

(Questa domanda è per lo più accademica, in quanto sembra una cattiva pratica farlo. Inoltre non ho scelta in merito all'utilizzo csh, nonostante abbia letto la Top 10.)


11
Intendi cambiare la home directory effettiva o intendi far espandere la shell ~a qualcosa di diverso dalla home directory effettiva?
derobert

Intendevo espandere il file ~in un'altra directory (non, se capisco correttamente la tua alternativa, cambiando dove si trovano tutte le home directory degli utenti). Non mi rendevo conto che ~era interpretato come una forma breve di $HOME, come ha descritto @michas nella sua risposta.
Andrew Cheong,

2
Non tutte le home directory degli utenti, puoi cambiarne solo una, come mostra slm nella sua risposta.
derobert il

Risposte:


28

La tilde ~è interpretata dalla tua conchiglia. La tua shell interpreterà ~come una forma abbreviata di $HOME.

Prova (echo ~; HOME=foo; echo ~). Questo dovrebbe prima stampare la tua vera directory home e poi "pippo", come hai impostato $HOME.

Il valore predefinito di $HOMEderiva dalla configurazione del sistema. Utilizzare getent passwdper elencare tutti gli utenti noti e le loro home directory. A seconda della configurazione del sistema, tali voci potrebbero provenire /etc/passwdo qualsiasi servizio di directory remoto.

Se vuoi solo ridefinire temporaneamente la tua home directory, basta impostarne un'altra $HOME.

Se si desidera modificarlo in modo permanente, è necessario modificare la voce passwd, ad esempio modificando manualmente /etc/passwd.


Grazie @michas. Non riesco a credere di aver perso quella variabile. (A proposito, si scopre che cshla variabile pertinente è $home(minuscola), e non puoi - setenv HOME /ext1/acheongpuoi solo set home=/ext1/acheong, e ha funzionato per me.)
Andrew Cheong

2
Per cambiarlo permanentemente, puoi anche usareusermod -d
user606723

1
Utilizzare vipw(o qualunque altra GUI fornita dal proprio sistema operativo) anziché modificarlo /etc/passwddirettamente. La modifica diretta rischia di corrompere il file, che può essere difficile da recuperare.
Keith Thompson,

11

Il valore utilizzato ~è determinato dal valore ottenuto dal database amministrativo ( getent passwd), in genere nel /etc/passwdfile, per la home directory di ciascun utente ivi definita.

$ 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 sesta colonna in questo file è da dove cd ~proviene il valore usato quando qualcuno digita .

nsswitch

Puoi vedere quale sistema userebbe per la home directory dell'utente usando il comando 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

Il "database" che fornisce questi è controllato tramite il risolutore di sistemi, definito in /etc/nsswitch.conf.

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

File sopra significa /etc/passwd, ma il "database" potrebbe provenire da LDAP, NIS o altre posizioni sulla rete, ad esempio.

Spostamento / Ridefinizione?

Eseguire questa operazione è un po 'complicato dopo la creazione degli account. Se stai creando account da zero, è banale ridefinire la posizione di un utente della sua home directory. Quando si esegue il useraddcomando è possibile specificare il percorso da utilizzare per la home directory di un utente.

Esempio

$ useradd -d /ext1/acheong ...

estratto dalla pagina man

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

Per account esistenti?

Questo diventa più un'operazione chirurgica poiché spesso il percorso della home directory di un utente viene incluso staticamente nei file di configurazione, rendendolo più complicato.

Esempio

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

Questi saranno sia bisogno di essere fissato, o dovrete fornire un collegamento da /home/samnella nuova posizione, /ext1/sam.

Spostarsi quando "database" non lo è /etc/passwd

Se il sistema sta ottenendo le home directory da LDAP, NIS, ecc., Dovrai eseguire il trasferimento in tali sistemi e coordinarti con lo spostamento dei file da /home/sama /ext1/sam.

Riferimenti


Ovviamente, la modifica che richiederà lo spostamento dei file dell'utente. E probabilmente lasciando un link simbolico nel vecchio posto (poiché altrimenti molte cose si romperanno ...)
derobert

@derobert - sì, dopo averlo fatto un paio di volte, provo ad evitarlo come la peste.
slm

@slm - Grazie per una risposta così dettagliata (e un po 'di storia). Temo di voler fare qualcosa di molto più semplice, ed ero ignaro dell'esistenza di una variabile di ambiente che rappresenta la home directory della sessione. Sono sicuro che in futuro la tua risposta aiuterà un altro lettore. Grazie ancora.
Andrew Cheong,

1

Se il motivo è distribuire gli utenti su più file system, è possibile utilizzare anche automounter. E anche permetterti di avere una directory "base" diversa per i tuoi utenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.