¿Es posible redefinir la tilde ('~', directorio de inicio)?

13

¿Es posible redefinir el directorio de inicio? por ejemplo, en /ext1/usernamelugar de /home/username, es decir, expandir ~a otro directorio (en lugar de cambiar el directorio de inicio real donde se encuentran los archivos de inicio de los usuarios).

(Esta pregunta es principalmente académica, ya que parece una mala práctica hacerlo. Tampoco tengo otra opción en cuanto al uso csh, a pesar de haber leído el Top 10).

Andrew Cheong
fuente
11
¿Te refieres a cambiar el directorio de inicio real, o quieres hacer que el shell se expanda ~a algo diferente al directorio de inicio real?
derobert
Me refería a expandirlo ~a otro directorio (no, si entiendo su alternativa correctamente, cambiar dónde se ubicarán los directorios principales de todos los usuarios). No me di cuenta de que ~se interpretaba como una forma breve de $HOME, como @michas describió en su respuesta.
Andrew Cheong
2
No todos los directorios de inicio de los usuarios pueden cambiar solo uno, como muestra slm en su respuesta.
derobert

Respuestas:

28

La tilde ~es interpretada por su caparazón. Su shell interpretará ~como una forma corta de $HOME.

Tratar (echo ~; HOME=foo; echo ~). Primero debe imprimir su directorio de inicio real y luego "foo", como lo configuró $HOME.

El valor predeterminado de $HOMEproviene de la configuración de su sistema. Use getent passwdpara enumerar todos los usuarios conocidos y sus directorios de inicio. Dependiendo de la configuración de su sistema, esas entradas pueden provenir de /etc/passwdcualquier servicio de directorio remoto.

Si solo desea redefinir temporalmente su directorio de inicio, simplemente configure otro $HOME.

Si desea cambiarlo permanentemente, debe cambiar la entrada passwd, por ejemplo, editando manualmente /etc/passwd.

michas
fuente
Gracias, @michas. No puedo creer que me perdí esa variable. (Por cierto, cshla variable relevante es $home(minúscula), y no setenv HOME /ext1/acheongpuedes set home=/ext1/acheong, solo puedes , y eso funcionó para mí)
Andrew Cheong,
2
Para cambiarlo permanentemente, también puede usarusermod -d
user606723
1
Use vipw(o cualquier GUI que le proporcione su sistema operativo) en lugar de editar /etc/passwddirectamente. La edición directa corre el riesgo de corromper el archivo, que puede ser difícil de recuperar.
Keith Thompson
11

El valor que se utiliza ~se determina a partir del valor que obtiene de la base de datos administrativa ( getent passwd), generalmente en el /etc/passwdarchivo, para el directorio de inicio de cada usuario que se define allí.

$ 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 sexta columna de este archivo es de donde cd ~proviene el valor utilizado cuando alguien escribe .

nsswitch

Puede ver qué usaría un sistema para el directorio de inicio del usuario con el 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

La "base de datos" que los proporciona se controla a través de su sistema de resolución, definido en /etc/nsswitch.conf.

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

Los archivos anteriores significan /etc/passwd, pero la "base de datos" podría provenir de LDAP, NIS u otras ubicaciones en la red, por ejemplo.

¿Mudarse / redefinir?

Realizar esta operación es un poco complicado después de crear las cuentas. Si está creando cuentas desde cero, es trivial redefinir la ubicación de un usuario de su directorio de inicio. Al ejecutar el useraddcomando, puede especificar la ubicación que se utilizará para el directorio de inicio de un usuario.

Ejemplo

$ useradd -d /ext1/acheong ...

extracto de la página 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.

Para cuentas existentes?

Esto se convierte más en una operación quirúrgica ya que muchas veces la ruta del directorio de inicio de un usuario se incluye estáticamente en los archivos de configuración, lo que lo hace más complicado.

Ejemplo

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

Será necesario corregirlos o deberá proporcionar un enlace desde /home/samla nueva ubicación /ext1/sam.

Moverse cuando la "base de datos" no está /etc/passwd

Si el sistema obtiene los directorios de inicio de LDAP, NIS, etc., deberá realizar la reubicación en esos sistemas y coordinar con el traslado de los archivos /home/sama /ext1/sam.

Referencias

slm
fuente
Por supuesto, cambiar eso requerirá mover los archivos del usuario. Y, probablemente, dejando un enlace simbólico en el antiguo lugar (como por lo demás un montón de cosas se rompan ...)
Derobert
@derobert: sí, habiendo hecho esto varias veces, trato de evitarlo como la peste.
slm
@slm: gracias por una respuesta tan detallada (y un poco de historia). Me temo que estaba buscando hacer algo mucho más simple, e ignoraba la existencia de una variable de entorno que representara el directorio de inicio de la sesión. Sin embargo, estoy seguro de que su respuesta ayudará a otro lector en el futuro. Gracias de nuevo.
Andrew Cheong
1

Si la razón es distribuir usuarios en múltiples sistemas de archivos, también puede usar el automounter. E incluso le permite tener un directorio "base" diferente para sus usuarios.

Sleepyweasel
fuente