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.

cd1
fonte
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.

dotwaffle
fonte
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>]]
Rahul Patil
fonte
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.

matemática
fonte
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

David Rickman
fonte
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.

jgoldschrafe
fonte
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
SP Arif Sahari Wibowo
fonte
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.

Jenny D diz Restabelecer Monica
fonte
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.

Warren
fonte
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.

Praça Pedro José Piquero
fonte
-1

É exatamente isso que o mkhomedir_helper $USERNAMEcomando faz.

Rory
fonte
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
Greeblesnort
fonte
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

;)

user280139
fonte
2
A questão é mais complexa do que apenas isso - e já tem respostas melhores.
Esa Jokinen