criar diretórios pessoais depois de criar usuários


68

Criei alguns usuários com:

$ useradd john

e esqueci de especificar o parâmetro -mpara criar o diretório inicial e ter os arquivos de esqueleto copiados para cada usuário. agora eu quero fazer isso e não quero recriar todos os usuários (deve haver uma maneira mais fácil). então, existe alguma maneira de criar os diretórios do usuário e copiar os arquivos do esqueleto?

Pensei em criar os diretórios, apresentando-os ao usuário correspondente, copiando todos os arquivos de esqueleto e apresentando-os ao usuário correspondente. mas se houver um comando como useradd -messe não criar o usuário novamente, mas criar os diretórios, seria melhor.


Isso aconteceu com uma grande lista de usuários?
— 9789 David Rickman

Eu tinha cerca de 10 usuários com esse problema.
— CD1

Não posso deixar de sentir que Rahul tem a melhor resposta para sua pergunta. Talvez você deva revisitar sua resposta aceita?

Respostas:


17

Isso pode parecer uma ideia tola, mas se os usuários não estiverem fazendo nada, você poderá:

cat /etc/passwd | cut -f 1 -d : >/tmp/users.list

Em seguida, edite /tmp/users.list para conter apenas os usuários que você deseja. Então faça:


for i in `cat /tmp/users.list`
do
    userdel $i
    useradd -m $i
done

No entanto, muitas distribuições baseadas no Redhat criarão um novo diretório inicial quando você fizer login pela primeira vez, desde que especificado em / etc / passwd onde o diretório deve estar.

Para testar isso, faça um "su -" e veja se faz "a coisa certa". Caso contrário, o script acima funcionará muito bem, eu acho.


11
sim, funcionou, embora tenha criado novos UIDs e GIDs (mas isso não foi um problema). mas eu esqueci de cópia de segurança as senhas de / etc / shadow, agora os usuários terão que definir suas senhas novamente = /
— cd1

Se ele os criou recentemente, ele poderá fazer: cat / etc / passwd | egrep '^ \: [0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list Isso deve apenas pegar o UID de usuários válidos, e não de usuários do sistema.
— 9789 David Rickman

E as senhas, elas permanecem as mesmas? Eu não temo!
— math

for i in $(awk -F: '{print $1 }' /etc/passwd)
— Rahul Patil

por que usar grep ou cortar com gato e cachimbo, por que não diretamente dessa maneira? cortar -f 1 -d: </ etc / passwd> passwtmp
— c4f4t0r

97

Você também pode usar mkhomedir_helper

Usage: /sbin/mkhomedir_helper <username> [<umask> [<skeldir>]]

13
Esta é a única resposta que realmente responde à pergunta sem um script de 10 linhas.
— Brendan Byrd

Esta e a resposta do pam são as melhores aqui, obrigado. Nunca mexa com esses arquivos manualmente, se puder evitá-los.
— H4unt3r

11
dka @ dev-04: / $ / sbin / mkhomedir_helper dka dka @ dev-04: / $ cd bash: cd: / home / CAD: Nenhum tal lima ou diretório
— Dimitri Kopriwa

@DimitriKopriwa você já tentou como root, por exemplo sudo /sbin/mkhomedir_helper dka? o /homediretório pertence ao rootusuário e, portanto, eu imaginaria que um teria que ser root para criar um subdiretório.
— Jonathan

15

Você precisará criar o diretório de usuários manualmente. Isso requer três etapas:

  1. Crie um diretório em conformidade com /etc/passwd, normalmente já haverá uma entrada / home / login.
  2. Copie os arquivos iniciais de / etc / skel
  3. E, finalmente, defina as permissões corretas:

    • mkdir /home/YOU
    • cd /home/YOU
    • cp -r /etc/skel/. .
    • chown -R YOU.YOURGROUP .
    • chmod -R go=u,go-w .
    • chmod go= .

BTW: Eu sempre sinto falta da -mopção para useradd também. Pelo menos os sistemas baseados no Debian devem ter um addusercomando, que eu recomendo sobre o useradd. Se você perdeu a -mopção, vale a pena considerar delusere recriar o usuário com as opções apropriadas.

Editar: Adicionado -rpara copiar também diretórios.


Fez isso: nomedeusuárioh = nomedeusuario; mkdir / home / $ nome de usuárioh; cp / etc / skel / * /etc/skel/.* / home / $ nome de usuárioh; chown -R $ nome de usuárioh: $ nome de usuárioh / home / $ nome de usuárioh; chmod -R 755 / home / $ nome de usuárioh;
— Aki

Pessoalmente, eu não gosto do chmod 755, pois ele permite que os usuários espionem as residências de outros usuários. Eu acho que cada usuário deve conceder explicitamente acesso a outros. Como public_htmlprecisa de pelo menos xum conjunto de bits, eu recomendaria chmod 0711em cada home public_htmle diretórios semelhantes como padrão.
— math

Além disso, use cp -r para skel, pois ele não copiará diretórios (.ssh).
— Aki

No meu sistema (Arch Linux no ARM), cp -r /etc/skel/.*retorne ao / etc / e copie todos os dados daqui (/etc/skel/.* corresponde a / etc / skel / .. espero). A solução de superuser.com/a/61619/22153 parece funcionar: cp -r / etc / skel / home / user (/ home / user não deve existir antes de executar o comando)
— zpon

Eu acho que você shell globbing expande *com .(ponto). Então ..é correspondido. Estou certo? Muitos shells desativam isso por padrão, devido a esse comportamento. Qual shell você usa?
— math

14
mkdir -p /home/john
chown john:john /home/john
usermod -d /home/john john

Isso deve fazer o truque que acredito


2
ele diz: usermod: no changes. e o diretório não é criado. também não funciona com a -mopção
— Cd1

11
Tudo bem. Eu descobri por que isso não funcionava, o useradd costumava colocar apenas $ HOME_DIR em / home, a menos que você especificasse o contrário. Agora parece colocá-lo automaticamente em / home / $ USER. Uma maneira barata pode ser usermod -d / home / john2 -m john e executar usermod -d / home / john -m.
— David Rickman

Deixa pra lá que também não funciona.
— 9789 David Rickman

11
Bem, pelo menos você aprendeu algo novo.
— 9789 David Rickman

11
Você esqueceu de copiar o conteúdo do / etc / skel / + chown recursivo para esses novos arquivos. O usermod não funcionaria, já que aqui o diretório foi registrado, mas não criado, o usermod não fará nada.
— Aki

9

Você pode usar algo como pam_mkhomedir para impedir que isso seja um problema com qualquer usuário no futuro. pam_mkhomedir é um módulo PAM que cria automaticamente o diretório inicial de um usuário no login, se não existir, e o preenche com arquivos de / etc / skel (ou qualquer diretório skel que você especificar).

Essa também é uma abordagem bem escalável, porque continuará resolvendo esse problema se você mudar o repositório do usuário para um serviço de diretório como LDAP no futuro.


4

No meu caso, o volume inicial estava corrompido e eu decidi reconstruí-lo do zero, já que não havia muitos dados envolvidos, mas quero manter as informações de login dos usuários, então recriei os diretórios pessoais manualmente com este script:

#!/bin/bash
cat /etc/passwd | while IFS=: read n x i g c d r
do
  # my system has uid started at 1000, but has nfsnobody at 65534:
  if [[ "$i" -ge 1000 && "$i" -le 65000 && ! -x "$d" ]]
  then
    cp -av /etc/skel "$d"
    chown -R "$i:$g" "$d"
    # may needed in SELinux system:
    restorecon -R "$d"
    # add your chmod as your need:
    chmod -R o-rw "$d"
  fi
done

2

Se você editar /etc/login.defspara conter

CREATE_HOME yes

os diretórios pessoais serão criados automaticamente para futuros usuários, a menos que você instrua o sistema a não fazê-lo.

Outra opção é usar o PAM para logins e usar o módulo pam_mkhomedir para criar automaticamente o homedir no primeiro logon.


0

Meu primeiro passo depois de fazer um useraddé su - <user>.

Cria os diretórios pessoais, copia esqueletos, etc. - pelo menos na caixa do CentOS 4, faço isso com mais frequência.


0

Entre com o usuário john e escreva a partir de um shell:

xdg-user-dirs-update

É isso aí! Não use sudo ou su, você não precisa de acesso root para criar alguns diretórios. Em uma conta raiz, você pode usar:

sudo -u john xdg-user-dirs-update

Dessa forma, você executará o comando como john, que poderá ser útil se você cometer um erro com mais de um usuário.


-1

É exatamente isso que o mkhomedir_helper $USERNAMEcomando faz.


11
Nenhum valor é agregado repetindo o que outra resposta já explicou há dois anos.
— kasperd

-2

Você pode simplesmente editar / etc / passwd. O segundo ao último campo é o diretório inicial do usuário.

greeblesnort:x:1000:1000:greeblesnort,,,:/home/greeblesnort:/bin/bash

Os usuários já foram criados. Os diretórios pessoais não foram criados porque ele esqueceu uma opção.
— David Rickman

Não pretendia alterar o diretório inicial do usuário, criei o diretório e copiei os arquivos de esqueleto para ele com as permissões apropriadas após a adição do usuário.
— CD1

-2
usermod -d /home/john john

ou

usermod --home /home/john john

e leia

man usermod

;)


2
A questão é mais complexa do que apenas isso - e já tem respostas melhores.
— Esa Jokinen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.