créer des répertoires de base après la création d'utilisateurs

68

J'ai créé des utilisateurs avec:

$ useradd john

et j’ai oublié de spécifier le paramètre -mpermettant de créer le répertoire de base et de copier les fichiers squelette vers chaque utilisateur. maintenant je veux faire cela, et je ne veux pas recréer tous les utilisateurs (il doit y avoir un moyen plus facile). oui, y a-t-il un moyen de créer les répertoires utilisateur et de copier les fichiers squelettes?

J'ai pensé créer les répertoires, les chowner à l'utilisateur correspondant, copier tous les fichiers squelettes et les chowner à l'utilisateur correspondant. mais s'il y a une telle commande useradd -mne crée pas à nouveau l'utilisateur, mais crée les répertoires, ce serait mieux.

cd1
la source
Est-ce que cela s'est produit avec une grande liste d'utilisateurs?
David Rickman
J'ai eu environ 10 utilisateurs avec ce problème.
cd1
Je ne peux pas m'empêcher de penser que Rahul a la meilleure réponse à votre question. Peut-être devriez-vous revoir votre réponse acceptée?

Réponses:

17

Cela peut sembler une idée idiote, mais si les utilisateurs ne font rien, vous pouvez le faire:

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

Ensuite, éditez /tmp/users.list pour ne contenir que les utilisateurs souhaités. Alors fais:


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

Cependant, de nombreuses distributions basées sur Redhat vous créeront un nouveau répertoire personnel lors de votre première connexion, à condition que cela soit spécifié dans / etc / passwd où le répertoire devrait se trouver.

Pour tester cela, faites un "su -" et voyez s'il fait "la bonne chose". Si ce n'est pas le cas, le script ci-dessus fonctionnera assez bien, je pense.

dotwaffle
la source
1
oui, cela a fonctionné, bien qu'il ait créé de nouveaux UID et GID (mais ce n'était pas un problème). mais j'ai oublié de sauvegarder les mots de passe à partir de / etc / shadow, maintenant les utilisateurs devront
redéfinir
S'il les a récemment créés, il pourrait peut-être faire: cat / etc / passwd | egrep '^ \: [0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list Cela devrait seulement récupérer l'UID des utilisateurs valides, et non des utilisateurs du système.
David Rickman
Qu'en est-il des mots de passe, restent-ils les mêmes? Je crains pas!
maths
for i in $(awk -F: '{print $1 }' /etc/passwd)
Rahul Patil
pourquoi utiliser grep ou couper avec le chat et avec le tuyau, pourquoi pas directement de cette façon? cut -f 1 -d: </ etc / passwd> passwtmp
c4f4t0r
98

Aussi, vous pouvez utiliser mkhomedir_helper

Usage: /sbin/mkhomedir_helper <username> [<umask> [<skeldir>]]
Rahul Patil
la source
13
C’est la seule réponse qui répond réellement à la question sans un script de 10 lignes.
Brendan Byrd
Ceci et la réponse de pam sont les meilleurs ici, merci. Ne jouez jamais avec ces fichiers à la main si vous pouvez les éviter.
h4unt3r
1
dka @ dev-04: / $ / sbin / mkhomedir_helper dka dka @ dev-04: / $ cd bash: cd: / home / dka: Aucun fichier ou répertoire de ce type
Dimitri Kopriwa
@DimitriKopriwa l'avez-vous essayé en tant que root, par exemple sudo /sbin/mkhomedir_helper dka? le /homerépertoire appartient à l' rootutilisateur, et j'imagine donc qu'il faudrait être root pour en créer un sous-répertoire.
Jonathan
15

Vous devrez créer le répertoire des utilisateurs manuellement. Cela nécessite trois étapes:

  1. Créez un répertoire conformément à /etc/passwd, généralement, il y aura déjà une entrée / home / login.
  2. Copier les fichiers initiaux à partir de / etc / skel
  3. Et enfin, définissez les autorisations appropriées:

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

BTW: je manque toujours l' -moption pour useradd aussi. Au moins les systèmes basés sur Debian devraient avoir une addusercommande, que je recommande plutôt à useradd. Si vous avez manqué une -moption, il peut également être utile d’envisager de deluserrecréer l’utilisateur avec les options appropriées.

Edit: Ajouté -rpour la copie également des répertoires.

math
la source
Est-ce que cela: usernameh = myusername; mkdir / home / $ usernameh; cp / etc / skel / * /etc/skel/.* / home / $ usernameh; chown -R $ usernameh: $ usernameh / home / $ usernameh; chmod -R 755 / home / $ usernameh;
Aki
Personnellement, je n’aime pas le 755 chmod, car il permet aux utilisateurs d’espionner la maison d’autres utilisateurs. Je pense que chaque utilisateur devrait explicitement accorder l'accès aux autres. Comme il public_htmlfaut au moins le xparamétrer un peu, je recommanderais par défaut chmod 0711à chaque maison public_htmlet répertoires similaires.
math
aussi, utilisez cp -r pour skel, sinon il ne copiera pas les répertoires (.ssh).
Aki
Sur mon système (Arch Linux sur ARM), cp -r /etc/skel/.*recurse dans / etc / et copie toutes les données à partir d’ici (/etc/skel/.* correspond à / etc / skel / .. je l’attends). La solution de superuser.com/a/61619/22153 semble fonctionner: cp -r / etc / skel / home / user (/ home / user ne doit pas exister avant d'exécuter la commande)
zpon
J'imagine que votre shell globbing se dilate *avec .(point). Ainsi ..est assorti. Ai-je raison? De nombreux shells désactivent cela par défaut, à cause d'un tel comportement. Quelle coquille utilisez-vous?
maths
14
mkdir -p /home/john
chown john:john /home/john
usermod -d /home/john john

Ça devrait faire l'affaire je crois

David Rickman
la source
2
il est dit: usermod: no changes. et le répertoire n'est pas créé. ça ne marche pas non plus avec l' -moption.
cd1
1
Bien. J'ai compris pourquoi cela ne fonctionnait pas, useradd ne mettait habituellement que $ HOME_DIR dans / home, sauf indication contraire de votre part. Il semble maintenant le mettre automatiquement dans / home / $ USER à la place. Un moyen peu onéreux pourrait être d’usermod -d / home / john2 -m john puis d’exécuter usermod -d / home / john -m.
David Rickman
Ce n'est pas grave non plus.
David Rickman
1
Au moins tu as appris quelque chose de nouveau.
David Rickman
1
Vous avez oublié de copier le contenu de / etc / skel / + chown récursif pour ces nouveaux fichiers. usermod ne fonctionnerait pas car ici le répertoire était enregistré mais pas créé, usermod ne ferait rien.
Aki
9

Vous pouvez utiliser quelque chose comme pam_mkhomedir pour éviter que cela ne pose problème à tous les utilisateurs à l'avenir. pam_mkhomedir est un module PAM qui crée automatiquement le répertoire de base d'un utilisateur lors de la connexion, s'il n'existe pas, et le remplit avec les fichiers de / etc / skel (ou le répertoire skel que vous avez spécifié).

C’est également une approche très évolutive, car elle continuera de résoudre ce problème si vous basculez ultérieurement votre référentiel utilisateur vers un service de répertoire tel que LDAP.

jgoldschrafe
la source
4

Dans mon cas, le volume personnel était corrompu et j'ai décidé de le reconstruire à partir de zéro, car peu de données sont impliquées, mais je veux conserver les informations de connexion des utilisateurs. J'ai donc recréé manuellement les répertoires personnels à l'aide de ce 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
la source
2

Si vous éditez /etc/login.defspour contenir

CREATE_HOME yes

des répertoires de départ seront alors automatiquement créés pour tous les utilisateurs futurs, à moins que vous ne disiez pas au système de le faire.

Une autre option consiste à utiliser PAM pour les connexions et à utiliser le module pam_mkhomedir pour créer automatiquement l’homedir lors de la première connexion.

Jenny D dit Réintégrer Monica
la source
0

Mon premier pas après avoir fait useraddest de su - <user>.

Crée les répertoires de base, les copies de squelettes, etc. - du moins sur la case CentOS 4, je le fais le plus souvent.

garenne
la source
0

Connectez-vous avec l'utilisateur john et écrivez à partir d'un shell:

xdg-user-dirs-update

C'est ça! N'utilisez pas sudo ou su, vous n'avez pas besoin d'un accès root pour créer des répertoires. À partir d'un compte root, vous pouvez utiliser:

sudo -u john xdg-user-dirs-update

De cette façon, vous exécuterez la commande en tant que john, ce qui peut être utile si vous avez commis l'erreur avec plus d'un utilisateur.

Pedro José Piquero Plaza
la source
-1

C'est exactement ce que fait la mkhomedir_helper $USERNAMEcommande.

Rory
la source
1
Aucune valeur n'est ajoutée en répétant ce qu'une autre réponse avait déjà expliqué il y a deux ans.
Kasperd
-2

Vous pouvez simplement éditer / etc / passwd. Le deuxième au dernier champ est le répertoire de base de l'utilisateur.

greeblesnort:x:1000:1000:greeblesnort,,,:/home/greeblesnort:/bin/bash
Greeblesnort
la source
Ils utilisateurs ont déjà été créés. Les répertoires personnels n'ont pas été créés car il a oublié un commutateur.
David Rickman
Je ne voulais pas changer le répertoire de base de l'utilisateur, mais le créer et y copier les fichiers squelettes avec les autorisations appropriées une fois que l'utilisateur a été ajouté.
cd1
-2
usermod -d /home/john john

ou

usermod --home /home/john john

et lis

man usermod

;)

utilisateur280139
la source
2
La question est plus complexe que cela - et a déjà de meilleures réponses.
Esa Jokinen