É possível atribuir a funcionalidade do diretório que normalmente é atribuído /home
(em distribuições como Debian e Ubuntu) a outro diretório (inteiramente)? Por exemplo, se você pudesse fazer isso e alterasse para /xyz
todos os seus novos diretórios de usuários de propriedade humana seriam instalados /xyz
(por exemplo, o caminho da área de trabalho de Sally seria /xyz/Sally/Desktop
em vez de /home/Sally/Desktop
e /home
não precisaria existir).
Estou trabalhando em um programa portátil que salva caminhos e os carrega. Se for usado em um computador diferente com um diretório inicial que não está em /home
(e, conseqüentemente, não há /home
, mas sim outro caminho com sua funcionalidade), então eu desejarei que ele ajuste o caminho para ter o local adequado do diretório inicial em para o novo computador quando o caminho for carregado.
Responder1
Os diretórios home não precisam ser inseridos /home
e seu programa estará errado se estiver conectando quaisquer suposições como a de que todos os diretórios home compartilham um pai comum ou que esse pai é nomeado /home
.
/home
nem sequer é uma convenção universal.
/home
foi uma ideia concebida um pouco depois da invenção do Unix. Nos primeiros Unices, outros diretórios eram usados. Isso ainda pode ser visto hoje em sistemas operacionais como o FreeBSD (e seus derivados), onde /home
há um link simbólico e os diretórios de usuários realmente residem em /usr/home
.
Da mesma forma, o Solaris coloca diretórios pessoais "reais" /export/home
para que /home
possam estar cheios de montagens NFS automáticas e similares.
/home
não é o pai de muitos diretórios iniciais comuns.
Existem muitos diretórios iniciais que não residem no /home
.
- O mais óbvio é
/root
o diretório inicial do superusuário, movido de seu local antigo para/
que os arquivos pessoais e "pontos" do root não sobrecarreguem o diretório raiz, mas mantidos no volume raiz para que o superusuário possa efetuar login mesmo quando a montagem de outros volumes de disco está falhando. - Vários softwares daemons possuem diretórios iniciais em outros locais, para as contas dedicadas nas quais esses daemons são executados.
- As várias contas daemon do qmail usam,
/var/qmail
por exemplo, ou/var/qmail/alias
. Este último é até comumente tratado como~alias
e éprojetadopara ser um diretório inicial, com~alias/.qmail
arquivos como nos diretórios iniciais de outros usuários (reais). - Vários softwares de servidor HTTP(S) e FTP(s) possuem convenções (oficiais ou não oficiais). Por exemplo: diretórios iniciais para hosts virtuais que possuem contas de sistema dedicadas podem ser
/var/www
ou/var/www/$VHOST
. - Outros softwares podem ser encontrados em vários sistemas operacionais usando diretórios iniciais para contas de usuários não pessoais, como
/var/unbound
,/var/db/mysql
e/var/db/tor
. - Várias contas de usuário não pessoais convencionais têm diretórios iniciais, como
/sbin
,/var/adm
,/var/spool/lpd
,/var/spool/mail
,/var/spool/news
,/var/spool/uucp
e assim por diante.
- As várias contas daemon do qmail usam,
- No OpenBSD, a conta do operador do sistema tem o diretório inicial
/operator
e várias contas de usuários não pessoais têm/var/empty
como diretórios pessoais.
Os diretórios iniciais não precisam permanecer no formato /home
.
Os diretórios iniciais podem ser movidos após a criação da conta usando as opções -d
( --home
) e -m
( --move-home
) do usermod
comando em sistemas operacionais Linux.
O OpenBSD usermod
tem as mesmas opções. (Não faça o mesmo com o pw usermod
comando no FreeBSD, TrueOS/PC-BSD, et al.. A -m -d
combinação tem um significado sutilmente diferente.)
Os diretórios iniciais não precisam ser criados no formato /home
.
Até mesmo o diretório pai convencional usado ao criar contas pode ser alterado, e não necessariamente /home
.
Nos sistemas operacionais Linux e OpenBSD, a opção useradd
do comando -b
( --base-dir
) especifica o pai no qual os diretórios iniciais são criados, se não forem explicitamente nomeados com -d
( --home
). OpadrãoO diretório base é a base_dir
variável no /etc/usermgmt.conf
OpenBSD e a HOME
variável em /etc/default/useradd
muitos Linux. Um administrador de sistema pode alterar isso quando quiser.
No FreeBSD, TrueOS/PC-BSD, et al. há uma -b
opção semelhante ao pw useradd
comando e um padrão para isso modificável por meio da home
variável em /etc/pw.conf
.
Lidando com isso
Seu programa não deve estabelecer nenhuma expectativa sobre a localização dos diretórios pessoais ou de seus pais.
- Se você quiser saber o diretório inicial do usuário conectado no momento, use a
HOME
variável de ambiente. É configurado por programas comologin
ouuserenv
quandosystemd
a conta conectada é alterada. Se não houver nenhumaHOME
variável de ambiente, é uma opção de design válida simplesmente abortar, alegando que as variáveis de ambiente da sessão de login precisam estar presentes para que seu programa seja executado. Caso contrário, você poderá obter o UID efetivo/real (conforme apropriado) do processo e consultar o banco de dados de senhas. - Se você deseja saber o diretório inicial de um usuário específico, consulte o banco de dados de senhas com as funções da biblioteca
getpwnam()
/getpwnam_r()
ougetpwuid()
/getpwiud_r()
e retire opw_dir
campo. (Observe queeste campo pode ser NULL ou pode apontar para uma string de comprimento zero.) - Se você deseja denotar simbolicamente o diretório inicial de um usuário de uma forma que seja independente de sua localização real, você pode adotar a convenção de uma expansão til semelhante a um shell:
~JdeBP
. Muitos programas fazem isso, devim
amailx
.
Leitura adicional
- Diferença entre “/exportar/home” e “/home”
- Jonathan de Boyne Pollard.
userenv
. páginas de manual do conjunto de ferramentas nosh. - Jonathan de Boyne Pollard (2016). "Declarações falsas sobre ambientes daemon". Errata para systemd doco. Respostas dadas com frequência.
Responder2
se você deseja alterar o local do diretório inicial do usuário para algum outro local, consulte esta resposta
https://stackoverflow.com/questions/20797819/command-to-change-the-default-home-directory-of-a-user