Respuestas:
Si está intentando modificar su INICIO, puede hacerlo
export HOME=/home/...
ya sea en su shell, o en su archivo ~ / .profile y / o ~ / .bashrc (o el shell de inicio de sesión apropiado).
(El código anterior funcionará para bash y shells similares, que son predeterminados en Debian; de lo contrario, haría `setenv HOME $ HOME: / extra / path, creo que en shells similares a csh en otras distribuciones).
editar - Sin embargo, esta probablemente no sea la forma de hacerlo. Ver otras respuestas. No uses esta respuesta.
En Linux, el HOME
programa de inicio de sesión establece la variable de entorno:
login
la consola, telnet y rlogin sesionessshd
para conexiones SSHgdm
, kdm
o xdm
para sesiones gráficas.El programa de inicio de sesión lo organiza antes de llamar a exec en su shell (incluyéndolo en los argumentos de exec), en función del valor en / etc / passwd.
Editar la siguiente orden: usermod -d /home/whatever_dir whatever_user
.
Tenga en cuenta que este (obviamente) será el nuevo directorio de inicio. Bash lo hará cd
al iniciar sesión, así que asegúrese de que exista y que los permisos sean correctos. Además, no se olvide de .bashrc
, .profile
, .xinitrc
, etc; si no están en el directorio de inicio, no serán leídos.
De usermod
:
Usage: usermod [options] LOGIN
Options:
-c, --comment COMMENT new value of the GECOS field
-d, --home HOME_DIR new home directory for the user account
-e, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE
-f, --inactive INACTIVE set password inactive after expiration
to INACTIVE
-g, --gid GROUP force use GROUP as new primary group
-G, --groups GROUPS new list of supplementary GROUPS
-a, --append append the user to the supplemental GROUPS
mentioned by the -G option without removing
him/her from other groups
-h, --help display this help message and exit
-l, --login NEW_LOGIN new value of the login name
-L, --lock lock the user account
-m, --move-home move contents of the home directory to the
new location (use only with -d)
-o, --non-unique allow using duplicate (non-unique) UID
-p, --password PASSWORD use encrypted password for the new password
-R, --root CHROOT_DIR directory to chroot into
-s, --shell SHELL new login shell for the user account
-u, --uid UID new UID for the user account
-U, --unlock unlock the user account
Investigué un poco, y la respuesta a esto es un poco sorprendente. Tome el siguiente script de prueba y chmod +x
:
#!/bin/bash
printf 'My home is: '
echo ~ || echo 'nowhere'
Podemos ejecutarlo ./test.sh
y ver:
Mi casa es: / home / user
Echemos un vistazo debajo del capó con strace.
$ strace ./test.sh |& grep '^open[a-z]*'
openat (AT_FDCWD, "/etc/ld.so.cache", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY | O_CLOEXEC) = 3
openat ( AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
openat (AT_FDCWD, "/ usr / lib / locale / locale-archive", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/ usr / lib / x86_64-linux-gnu / gconv / gconv-modules.cache ", O_RDONLY) = 3
openat (AT_FDCWD," ./test.sh ", O_RDONLY) = 3
No veo ninguna mención de HOME, archivos rc o passwd. Probémoslo con un ambiente limpio:
env -i bash
echo $HOME #this will be blank since we cleared the env
Nada, como se esperaba. Ejecutemos el script en el entorno en blanco.
env -i bash
./test.sh
Mi casa es: / home / user
Interesante, el guión puede llegar a casa. Ahora vamos a rastrear.
strace ./test.sh |& grep '^open[a-z]*'
Ahora vemos:
openat (AT_FDCWD, "/etc/ld.so.cache", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY | O_CLOEXEC) = 3
openat ( AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
openat (AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/etc/ld.so. caché ", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD," /lib/x86_64-linux-gnu/libnss_compat.so.2 ", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD," /etc/ld.so.cache " , O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_nis.so.2 ", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libnsl.so.1", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/ etc / passwd", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "./test.sh", O_RDONLY) = 3
He marcado las líneas interesantes. Como podemos ver, parece que cuando $HOME
no está definido, el shell intentará completarlo, incluso cuando no esté en modo de inicio de sesión o interactivo.
$HOME
con$PATH
. No tiene sentido tener múltiples rutas$HOME
(el valor completo se tratará como un solo nombre de ruta) o, en la mayoría de los casos, modificar$HOME
en absoluto.