Erstellen Sie Basisverzeichnisse, nachdem Sie Benutzer erstellt haben

68

Ich habe einige Benutzer erstellt mit:

$ useradd john

und ich habe vergessen, den Parameter anzugeben, um das Basisverzeichnis -mzu erstellen und die Skelettdateien auf jeden Benutzer zu kopieren. Jetzt möchte ich das tun und ich möchte nicht alle Benutzer neu erstellen (es muss einen einfacheren Weg geben). Gibt es also eine Möglichkeit, die Benutzerverzeichnisse zu erstellen und die Skelettdateien zu kopieren?

Ich dachte darüber nach, die Verzeichnisse zu erstellen, sie dem entsprechenden Benutzer anzuzeigen, alle Skelettdateien zu kopieren und sie dem entsprechenden Benutzer anzuzeigen. Aber wenn es einen solchen Befehl useradd -mgibt, der den Benutzer nicht erneut erstellt, sondern die Verzeichnisse erstellt, ist es besser.

cd1
quelle
Ist dies bei einer großen Benutzerliste passiert?
David Rickman
Ich hatte ungefähr 10 Benutzer mit diesem Problem.
CD1
Ich kann nicht anders, als zu glauben, Rahul hätte die beste Antwort auf Ihre Frage. Vielleicht sollten Sie Ihre akzeptierte Antwort noch einmal überprüfen?

Antworten:

17

Das mag sich nach einer dummen Idee anhören, aber wenn die Benutzer tatsächlich nichts tun, können Sie Folgendes tun:

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

Bearbeiten Sie dann /tmp/users.list so, dass nur die gewünschten Benutzer enthalten sind. Dann mach:


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

Bei vielen Redhat-basierten Distributionen wird jedoch beim ersten Anmelden ein neues Ausgangsverzeichnis erstellt, sofern dieses in / etc / passwd angegeben ist, in dem sich das Verzeichnis befinden soll.

Um das zu testen, machen Sie ein "su -" und prüfen Sie, ob es "das Richtige" tut. Wenn dies nicht der Fall ist, funktioniert das obige Skript meiner Meinung nach recht gut.

Dotwaffle
quelle
1
Ja, es hat funktioniert, obwohl es neue UIDs und GIDs erstellt hat (aber das war kein Problem). aber ich habe vergessen, die passwörter aus / etc / shadow zu sichern, jetzt müssen die
benutzer
Wenn er sie kürzlich erstellt hat, könnte er dies möglicherweise tun: cat / etc / passwd | egrep '^ \: [0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list Das sollte nur die UID von gültigen Benutzern und nicht von Systembenutzern erfassen.
David Rickman
Was ist mit Passwörtern, bleiben sie gleich? Ich fürchte mich nicht!
Mathe
for i in $(awk -F: '{print $1 }' /etc/passwd)
Rahul Patil
warum grep verwenden oder mit cat und mit pipe schneiden, warum nicht direkt auf diese weise? cut -f 1 -d: </ etc / passwd> passwtmp
c4f4t0r
97

Auch können Sie verwenden mkhomedir_helper

Usage: /sbin/mkhomedir_helper <username> [<umask> [<skeldir>]]
Rahul Patil
quelle
13
Dies ist die einzige Antwort, die die Frage tatsächlich ohne ein 10-zeiliges Skript beantwortet.
Brendan Byrd
Dies und die Pam-Antwort sind die besten hier, danke. Verwirren Sie diese Dateien niemals von Hand, wenn Sie dies vermeiden können.
h4unt3r
1
dka @ dev-04: / $ / sbin / mkhomedir_helper dka dka @ dev-04: / $ cd bash: cd: / home / dka: Keine solche Datei oder Verzeichnis
Dimitri Kopriwa
@DimitriKopriwa hast du es zB als root probiert sudo /sbin/mkhomedir_helper dka? Das /homeVerzeichnis gehört dem rootBenutzer, und so würde ich mir vorstellen, dass man root sein muss, um ein Unterverzeichnis davon zu erstellen.
Jonathan
15

Sie müssen das Benutzerverzeichnis manuell erstellen. Dies erfordert drei Schritte:

  1. Erstellen Sie ein Verzeichnis gemäß /etc/passwd, normalerweise gibt es bereits einen / home / login-Eintrag.
  2. Kopieren Sie die ursprünglichen Dateien aus / etc / skel
  3. Und schließlich die richtigen Berechtigungen festlegen:

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

Übrigens: Ich vermisse immer auch die -mOption für useradd. Zumindest Debian-basierte Systeme sollten einen adduserBefehl haben, den ich gegenüber useradd empfehle. Wenn Sie die -mOption verpasst haben, ist es möglicherweise auch empfehlenswert, sie zu prüfen deluserund den Benutzer mit den richtigen Optionen neu zu erstellen.

Bearbeiten: -rZum Kopieren von Verzeichnissen hinzugefügt .

Mathematik
quelle
Hat das getan: usernameh = meinbenutzername; mkdir / home / $ usernameh; cp / etc / skel / * /etc/skel/.* / home / $ usernameh; chown -R $ usernameh: $ usernameh / home / $ usernameh; chmod -R 755 / home / $ usernameh;
Aki
Persönlich mag ich das 755 chmod nicht, da es Benutzern erlaubt, in die Häuser anderer Benutzer zu spionieren. Ich denke, jeder Benutzer sollte anderen explizit Zugriff gewähren. Da public_htmlmuss zumindest xetwas eingestellt werden, würde ich chmod 0711bei jedem Haus public_htmlähnliche Verzeichnisse als Standard empfehlen .
Mathe
Verwenden Sie auch cp -r für skel, da sonst keine Verzeichnisse (.ssh) kopiert werden.
Aki
Auf meinem System (Arch Linux on ARM) cp -r /etc/skel/.*kehren Sie in / etc / zurück und kopieren Sie alle Daten von hier (/etc/skel/.* entspricht / etc / skel / .. Ich gehe davon aus). Die Lösung von superuser.com/a/61619/22153 scheint zu funktionieren: cp -r / etc / skel / home / user (/ home / user darf nicht existieren, bevor der Befehl ausgeführt wird)
zpon
Ich vermute, Sie Shell Globbing erweitert *mit .(Punkt). So ..ist abgestimmt. Habe ich recht? Viele Shells deaktivieren dies aufgrund dieses Verhaltens standardmäßig. Welche Shell benutzt du?
Mathe
14
mkdir -p /home/john
chown john:john /home/john
usermod -d /home/john john

Das sollte der Trick sein, glaube ich

David Rickman
quelle
2
heißt es: usermod: no changes. und das Verzeichnis wird nicht erstellt. es funktioniert auch nicht mit der -mOption.
CD1
1
In Ordung. Ich habe herausgefunden, warum das nicht funktioniert hat. Useradd hat bisher nur $ HOME_DIR in / home abgelegt, sofern Sie nichts anderes angegeben haben. Es scheint nun, dass es stattdessen automatisch in / home / $ USER abgelegt wird. Ein billiger Weg könnte sein, usermod -d / home / john2 -m john auszuführen und dann usermod -d / home / john -m.
David Rickman
Egal, das funktioniert auch nicht.
David Rickman
1
Na wenigstens hast du was neues gelernt.
David Rickman
1
Sie haben vergessen, den Inhalt von / etc / skel / + chown rekursiv für diese neuen Dateien zu kopieren. usermod würde nicht funktionieren, da hier das Verzeichnis registriert, aber nicht erstellt wurde, usermod wird nichts tun.
Aki
9

Sie können so etwas wie pam_mkhomedir verwenden , um zu verhindern, dass dies bei zukünftigen Benutzern zu Problemen führt . pam_mkhomedir ist ein PAM-Modul, das bei der Anmeldung automatisch ein Benutzerverzeichnis erstellt, falls es nicht vorhanden ist, und es mit Dateien aus / etc / skel (oder dem von Ihnen angegebenen Verzeichnis) auffüllt.

Dies ist auch ein gut skalierbarer Ansatz, da er dieses Problem weiterhin löst, wenn Sie Ihr Benutzer-Repository in Zukunft auf einen Verzeichnisdienst wie LDAP umstellen.

jgoldschrafe
quelle
4

In meinem Fall war das Home-Volume beschädigt, und ich habe mich entschlossen, es von Grund auf neu zu erstellen, da nicht viele Daten erforderlich sind, ich aber die Anmeldeinformationen der Benutzer beibehalten möchte. Daher habe ich die Home-Verzeichnisse manuell mit diesem Skript neu erstellt:

#!/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
quelle
2

Wenn Sie bearbeiten /etc/login.defs, um zu enthalten

CREATE_HOME yes

Dann werden automatisch Basisverzeichnisse für zukünftige Benutzer erstellt, sofern Sie das System nicht dazu auffordern.

Eine andere Möglichkeit besteht darin, PAM für Anmeldungen zu verwenden und das Modul pam_mkhomedir zu verwenden, um das Homedir bei der ersten Anmeldung automatisch zu erstellen.

Jenny D
quelle
0

Mein erster Schritt nach a useraddist zu su - <user>.

Erstellt die Home-Verzeichnisse, kopiert Skelette usw. - zumindest auf der CentOS 4-Box mache ich das am häufigsten.

Labyrinth
quelle
0

Loggen Sie sich mit dem Benutzer john ein und schreiben Sie aus einer Shell:

xdg-user-dirs-update

Das ist es! Verwenden Sie nicht sudo oder su, Sie benötigen keinen Root-Zugriff, um einige Verzeichnisse zu erstellen. Von einem Root-Konto aus können Sie Folgendes verwenden:

sudo -u john xdg-user-dirs-update

Auf diese Weise führen Sie den Befehl als john aus. Dies kann nützlich sein, wenn Sie den Fehler mit mehr als einem Benutzer gemacht haben.

Pedro José Piquero Plaza
quelle
-1

Genau das macht der mkhomedir_helper $USERNAMEBefehl.

Rory
quelle
1
Durch die Wiederholung einer anderen Antwort, die bereits vor zwei Jahren erläutert wurde, wird kein Mehrwert erzielt.
Kasperd
-2

Sie könnten einfach / etc / passwd bearbeiten. Das vorletzte Feld ist das Basisverzeichnis des Benutzers.

greeblesnort:x:1000:1000:greeblesnort,,,:/home/greeblesnort:/bin/bash
Greeblesnort
quelle
Sie Benutzer wurden bereits erstellt. Die Home-Verzeichnisse wurden nicht erstellt, weil er einen Schalter vergessen hat.
David Rickman
Ich wollte nicht das Basisverzeichnis des Benutzers ändern, sondern das Verzeichnis erstellen und die Skelettdateien mit den entsprechenden Berechtigungen darauf kopieren, nachdem der Benutzer hinzugefügt wurde.
CD1
-2
usermod -d /home/john john

oder

usermod --home /home/john john

und lese

man usermod

;)

user280139
quelle
2
Die Frage ist komplexer als nur das - und hat bereits bessere Antworten.
Esa Jokinen