É possível redefinir o til ('~', diretório inicial)?

13

É possível redefinir o diretório inicial? por exemplo, para em /ext1/usernamevez de /home/username, ou seja, expandindo ~para outro diretório (em vez de alterar o diretório inicial real onde os arquivos pessoais dos usuários estão localizados).

(Esta questão é principalmente acadêmica, pois parece uma prática ruim fazê-lo. Também não tenho escolha quanto a usá-lo csh, apesar de ter lido o Top 10.)

Andrew Cheong
fonte
11
Você quer dizer alterar o diretório inicial real ou fazer o shell se expandir ~para algo diferente do diretório inicial real?
derobert
Eu pretendia expandir o ~diretório para outro diretório (não, se eu entendi sua alternativa corretamente, mudar onde os diretórios pessoais de todos os usuários devem estar localizados). Eu não sabia que isso ~era interpretado como uma forma curta de $HOME, como @michas descreveu em sua resposta.
Andrew Cheong
2
Nem todos os diretórios pessoais dos usuários, você pode alterar apenas um, como mostra slm em sua resposta.
derobert

Respostas:

28

O til ~é interpretado pelo seu shell. Seu shell interpretará ~como uma forma abreviada de $HOME.

Tente (echo ~; HOME=foo; echo ~). Isso deve primeiro imprimir seu diretório pessoal real e depois "foo", conforme você definir $HOME.

O valor padrão de $HOMEvem da sua configuração do sistema. Use getent passwdpara listar todos os usuários conhecidos e seus diretórios pessoais. Dependendo da configuração do sistema, essas entradas podem ser provenientes /etc/passwdou qualquer serviço de diretório remoto.

Se você deseja redefinir temporariamente seu diretório pessoal, basta definir outro $HOME.

Se você quiser alterá-lo permanentemente, precisará alterar a entrada da senha, por exemplo, editando manualmente /etc/passwd.

michas
fonte
Obrigado, @michas. Não acredito que perdi essa variável. (BTW, acaba cshna variável relevante é $home(em minúsculas), e você não pode setenv HOME /ext1/acheong-Você pode única set home=/ext1/acheong, e que funcionou para mim.)
Andrew Cheong
2
Para alterá-lo permanentemente, você também pode usar #usermod -d
user606723
1
Use vipw(ou qualquer GUI fornecida pelo seu sistema operacional) em vez de editar /etc/passwddiretamente. A edição direta corre o risco de corromper o arquivo, o que pode ser difícil de recuperar.
perfil completo de Keith Thompson
11

O valor usado ~é determinado a partir do valor obtido no banco de dados administrativo ( getent passwd), geralmente no /etc/passwdarquivo, para o diretório inicial de cada usuário definido lá.

$ 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

A sexta coluna deste arquivo é a origem do valor usado quando alguém digita cd ~.

nsswitch

Você pode ver o que um sistema usaria para o diretório inicial do usuário usando o 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

O "banco de dados" que os fornece é controlado através do resolvedor de sistemas, definido em /etc/nsswitch.conf.

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

Os arquivos acima significam /etc/passwd, mas o "banco de dados" pode vir de LDAP, NIS ou outros locais na rede, por exemplo.

Mover / Redefinir?

Executar esta operação é um pouco complicado depois que as contas foram criadas. Se você estiver criando contas do zero, é trivial redefinir a localização de um usuário no diretório inicial. Ao executar o useraddcomando, você pode especificar o local a ser usado para o diretório inicial de um usuário.

Exemplo

$ useradd -d /ext1/acheong ...

trecho da página do manual

-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 contas existentes?

Isso se torna mais uma operação cirúrgica, pois muitas vezes o caminho do diretório inicial de um usuário é incluído estaticamente nos arquivos de configuração, tornando-o mais complicado.

Exemplo

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

Eles precisam ser corrigidos ou você precisará fornecer um link /home/sampara o novo local /ext1/sam.

Movendo quando "banco de dados" não é /etc/passwd

Se o sistema estiver obtendo os diretórios pessoais do LDAP, NIS etc., será necessário realizar a realocação nesses sistemas e coordenar a movimentação dos arquivos de /home/sampara /ext1/sam.

Referências

slm
fonte
Obviamente, mudar isso exigirá a movimentação dos arquivos do usuário. E, provavelmente, deixando um link simbólico no antigo lugar (caso contrário um monte de coisas vai quebrar ...)
derobert
@derobert - sim, tendo feito isso algumas vezes, tento evitá-lo como uma praga.
slm
@ SLM - Obrigado por uma resposta tão detalhada (e um pouco da história). Receio estar procurando fazer algo muito mais simples - e ignorava a existência de uma variável de ambiente representando o diretório inicial da sessão. Tenho certeza de que sua resposta ajudará outro leitor no futuro, no entanto. Obrigado novamente.
Andrew Cheong
1

Se o motivo é espalhar os usuários por vários sistemas de arquivos, você também pode usar o automounter. E ainda permite que você tenha um diretório "base" diferente para seus usuários.

sleepyweasel
fonte