Respostas:
Se você estiver tentando modificar sua HOME, poderá fazer
export HOME=/home/...
no seu shell ou no seu arquivo ~ / .profile e / ou ~ / .bashrc (ou shell de login apropriado).
(O código acima funcionará para shells bash e similares, que são padrão no Debian; você faria `setenv HOME $ HOME: / extra / path Eu penso em shells do tipo csh em outras distros.)
editar - No entanto, este provavelmente não é o caminho para fazê-lo. Veja outras respostas. Não use esta resposta.
O programa de login organiza-o antes de chamar exec em seu shell (incluindo-o nos argumentos para exec), com base no valor em / etc / passwd.
Edite isso executando: usermod -d /home/whatever_dir whatever_user
.
Observe que este (obviamente) será o novo diretório inicial. O Bash fará cd
isso no login, portanto, verifique se ele existe e se as permissões estão corretas. Além disso, não se esqueça .bashrc
, .profile
,.xinitrc
, etc; se não estiverem no diretório inicial, não serão lidos.
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
Eu fiz algumas escavações, e a resposta para isso é um pouco surpreendente. Pegue o seguinte script de teste e chmod +x
:
#!/bin/bash
printf 'My home is: '
echo ~ || echo 'nowhere'
Podemos executá-lo ./test.sh
e ver:
Minha casa é: / home / user
Vamos dar uma olhada debaixo do capô com traços.
$ 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
abertura (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
abertura (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
abertura (AT_FDCWD, "/ usr / lib / local / arquivo-local", O_RDONLY | O_CLOEXEC) = 3
abertura (AT_FDCWD, "/ usr / lib / x86_64-linux-gnu / gconv / gconv-modules.cache ", O_RDONLY) = 3
abrir (AT_FDCWD," ./test.sh ", O_RDONLY) = 3
Não vejo nenhuma menção a HOME, arquivos rc ou senha. Vamos tentar com um ambiente limpo:
env -i bash
echo $HOME #this will be blank since we cleared the env
Nada, como esperado. Vamos executar o script no ambiente em branco.
env -i bash
./test.sh
Minha casa é: / home / user
Interessante, o script é capaz de chegar em casa. Agora vamos rastrear.
strace ./test.sh |& grep '^open[a-z]*'
Agora 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
abertura (AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
abertura (AT_FDCWD, "/ dev / tty", O_RDWR | O_NONBLOCK) = 3
abertura (AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY | O_CLOEXEC) = 3
abertura (AT_FDCWD, "/etc/ld.so. cache ", 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," / lib / x86_64-linux-gnu libnsl.so.1 ", O_RDONLY | O_CLOEXEC) = 3
abertura (AT_FDCWD," /etc/ld.so.cache " , O_RDONLY | O_CLOEXEC) = 3
abertura (AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_nis.so.2 ", O_RDONLY | O_CLOEXEC) = 3
openat (AT_FDCWD, "/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY | O_CLOEXEC) = 3
abertura (AT_FDCWD, "/ etc / passwd", O_RDONLY | O_CLOEXEC) = 3
abertura (AT_FDCWD, "./test.sh", O_RDONLY) = 3
Eu atrevi as linhas interessantes. Como podemos ver, parece que quando $HOME
não está definido, o shell tentará preenchê-lo, mesmo quando não estiver no modo de login ou interativo.
$HOME
com$PATH
. Não faz sentido ter vários caminhos$HOME
(o valor inteiro será tratado como um único nome de caminho) ou, na maioria dos casos, para modificar$HOME
.