Onde está definida a variável de ambiente $ HOME?

16

Estou procurando o local onde a variável de ambiente $ HOME está definida. É após o login, na minha opinião.

Estou usando o Linux debian 2.6.32-5-686.

webnoon
fonte

Respostas:

2

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.

user76871
fonte
Você está provavelmente confundindo $HOMEcom $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.
User1686 9/09/12
@ grrawity: oops desculpe, obrigado. Infelizmente não consigo excluir minha resposta.
User76871
21

No Linux, a HOMEvariável de ambiente é configurada pelo programa de login:

  • por loginno console, telnet e rlogin sessões
  • por sshd para conexões SSH
  • por gdm, kdmou xdmpara sessões gráficas.
user1686
fonte
8

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.

bmargulies
fonte
1
Interessante isso não obteve mais votos. É a única resposta que realmente especifica onde a variável de ambiente está definida, que era a pergunta real do OP.
Mike Williamson
5

Edite isso executando: usermod -d /home/whatever_dir whatever_user .

Observe que este (obviamente) será o novo diretório inicial. O Bash fará cdisso 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
Synthead
fonte
0

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.she 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 $HOMEnão está definido, o shell tentará preenchê-lo, mesmo quando não estiver no modo de login ou interativo.

DeusXMachina
fonte