utwórz katalogi domowe po utworzeniu użytkowników

68

Utworzyłem niektórych użytkowników za pomocą:

$ useradd john

i zapomniałem podać parametr, -maby utworzyć katalog domowy i skopiować pliki szkieletu do każdego użytkownika. teraz chcę to zrobić i nie chcę ponownie tworzyć wszystkich użytkowników (musi istnieć prostszy sposób). więc czy jest jakiś sposób na utworzenie katalogów użytkowników i skopiowanie plików szkieletu?

Pomyślałem o utworzeniu katalogów, udostępnieniu ich odpowiednim użytkownikom, skopiowaniu wszystkich plików szkieletu i udostępnieniu ich odpowiednim użytkownikom. ale jeśli takie polecenie useradd -mnie utworzy ponownie użytkownika, ale utworzy katalogi, byłoby lepiej.

cd1
źródło
Czy tak się stało z dużą listą użytkowników?
David Rickman,
Miałem około 10 użytkowników z tym problemem.
cd1
Nie mogę się powstrzymać, ale czuję, że Rahul ma najlepszą odpowiedź na twoje pytanie. Może powinieneś ponownie sprawdzić zaakceptowaną odpowiedź?

Odpowiedzi:

17

Może to zabrzmieć jak głupi pomysł, ale jeśli użytkownicy tak naprawdę nic nie robią, możesz:

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

Następnie edytuj /tmp/users.list, aby zawierał tylko potrzebnych użytkowników. Następnie wykonaj:


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

Jednak wiele dystrybucji opartych na Redhat utworzy nowy katalog domowy podczas pierwszego logowania, pod warunkiem, że jest on określony w / etc / passwd, gdzie powinien znajdować się katalog.

Aby to sprawdzić, wykonaj „su -” i sprawdź, czy robi to „właściwą rzecz”. Jeśli tak się nie stanie, myślę, że powyższy skrypt będzie działał całkiem nieźle.

dotwaffle
źródło
1
tak, działało, chociaż tworzyło nowe identyfikatory UID i GID (ale to nie był problem). ale zapomniałem wykonać kopię zapasową haseł z / etc / shadow, teraz użytkownicy będą musieli ponownie ustawić swoje hasła = /
cd1
Jeśli stworzył je niedawno, mógłby to zrobić: cat / etc / passwd | egrep '^ \: [0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list Powinno to pobierać tylko UID poprawnych użytkowników, a nie użytkowników systemu.
David Rickman
Co z hasłami, czy pozostają takie same? Nie boję się!
matematyka
for i in $(awk -F: '{print $1 }' /etc/passwd)
Rahul Patil
dlaczego używać grep lub cut z kotem i fajką, dlaczego nie bezpośrednio w ten sposób? cut -f 1 -d: </ etc / passwd> passwtmp
c4f4t0r
97

Możesz także użyć mkhomedir_helper

Usage: /sbin/mkhomedir_helper <username> [<umask> [<skeldir>]]
Rahul Patil
źródło
13
To jedyna odpowiedź, która faktycznie odpowiada na pytanie bez skryptu z 10 liniami.
Brendan Byrd
To i odpowiedź pam są tutaj najlepsze, dzięki. Nigdy nie zadzieraj ręcznie tymi plikami, jeśli możesz tego uniknąć.
h4unt3r
1
dka @ dev-04: / $ / sbin / mkhomedir_helper dka dka @ dev-04: / $ cd bash: cd: / home / dka: Brak takiego pliku lub katalogu
Dimitri Kopriwa
@DimitriKopriwa czy próbowałeś go jako root np. sudo /sbin/mkhomedir_helper dka? /homekatalog należy do rootużytkownika, a tak to sobie wyobrazić, trzeba by być root, aby stworzyć jego podkatalogu.
Jonathan
15

Konieczne będzie ręczne utworzenie katalogu użytkowników. Wymaga to trzech kroków:

  1. Utwórz katalog zgodnie z /etc/passwd, zwykle będzie już wpis / home / login.
  2. Skopiuj pliki początkowe z / etc / skel
  3. I wreszcie ustaw odpowiednie uprawnienia:

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

BTW: Zawsze brakuje mi też -mopcji useradd. Przynajmniej systemy oparte na Debianie powinny mieć adduserpolecenie, które polecam ponad useradd. Jeśli przegapiłeś -mopcję, być może warto rozważyć, delusera następnie odtworzyć użytkownika z odpowiednimi opcjami.

Edycja: Dodano -rdo kopiowania również katalogów.

matematyka
źródło
Czy to: usernameh = moja nazwa użytkownika; mkdir / home / $ nazwa użytkownikah; cp / etc / skel / * /etc/skel/.* / home / $ usernameh; chown -R $ nazwa użytkownikah: $ nazwa użytkownikah / home / $ nazwa użytkownikah; chmod -R 755 / home / $ usernameh;
Aki
Osobiście nie lubię chmod 755, ponieważ pozwala użytkownikom szpiegować w domach innych użytkowników. Myślę, że każdy użytkownik powinien wyraźnie przyznać dostęp innym. Ponieważ public_htmlwymaga co najmniej xbitów, polecam chmod 0711na każdy dom public_htmli podobne katalogi jako domyślne.
matematyka
również użyj cp -r dla skel, ponieważ inaczej nie skopiuje katalogów (.ssh).
Aki
W moim systemie (Arch Linux na ARM) cp -r /etc/skel/.*wróć do / etc / i skopiuj wszystkie dane stąd (/etc/skel/.* pasuje do / etc / skel / .. Oczekuję). Wydaje się, że działa rozwiązanie superuser.com/a/61619/22153 : cp -r / etc / skel / home / user (/ home / user nie może istnieć przed uruchomieniem polecenia)
zpon
Wydaje mi się, że globowanie powłoki rozszerza się za *pomocą .(kropki). Tak ..jest dopasowane. Czy mam rację? Wiele powłok domyślnie wyłącza to z powodu takiego zachowania. Jakiej powłoki używasz?
matematyka
14
mkdir -p /home/john
chown john:john /home/john
usermod -d /home/john john

To powinno załatwić sprawę, którą uważam

David Rickman
źródło
2
mówi: usermod: no changes. a katalog nie został utworzony. nie działa również z -mopcją.
cd1
1
W porządku. Zrozumiałem, dlaczego to nie zadziałało. UserDod umieszczał tylko $ HOME_DIR w katalogu / home, chyba że podano inaczej. Teraz wydaje się teraz automatycznie umieszczać go w katalogu / home / $ USER. Tanim sposobem może być usermod -d / home / john2 -m john, a następnie uruchomić usermod -d / home / john -m.
David Rickman,
Nieważne, że to też nie działa.
David Rickman,
1
Przynajmniej nauczyłeś się czegoś nowego.
David Rickman,
1
Zapomniałeś skopiować zawartości rekurencyjnej / etc / skel / + chown dla tych nowych plików. usermod nie działałby, ponieważ tutaj katalog został zarejestrowany, ale nie został utworzony, usermod nic nie zrobi.
Aki
9

Możesz użyć czegoś takiego jak pam_mkhomedir, aby zapobiec pojawianiu się tego problemu wśród użytkowników w przyszłości. pam_mkhomedir to moduł PAM, który automatycznie tworzy katalog domowy użytkownika przy logowaniu, jeśli nie istnieje, i zapełnia go plikami z / etc / skel (lub dowolnego katalogu skel, który określisz).

Jest to również dobrze skalowalne podejście, ponieważ rozwiąże ono ten problem, jeśli w przyszłości przełączysz repozytorium użytkowników na usługę katalogową, taką jak LDAP.

jgoldschrafe
źródło
4

W moim przypadku wolumin domowy został uszkodzony i postanowiłem po prostu go odbudować od zera, ponieważ nie było w nim dużo danych, ale chcę zachować dane logowania użytkowników, więc ręcznie utworzyłem katalogi domowe za pomocą tego skryptu:

#!/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
źródło
2

Jeśli edytujesz, /etc/login.defsaby zawierać

CREATE_HOME yes

katalogi domowe zostaną automatycznie utworzone dla przyszłych użytkowników, chyba że powiesz systemowi, aby tego nie robił.

Inną opcją jest użycie PAM do logowania i użycie modułu pam_mkhomedir do automatycznego utworzenia homedir przy pierwszym logowaniu.

Jenny D.
źródło
0

Mój pierwszy krok po zrobieniu useraddto su - <user>.

Tworzy katalogi domowe, kopiuje szkielety itp. - Przynajmniej na polu CentOS 4, na którym najczęściej to robię.

królikarnia
źródło
0

Zaloguj się przy użyciu użytkownika John i napisz z powłoki:

xdg-user-dirs-update

Otóż ​​to! Nie używaj sudo ani su, nie potrzebujesz dostępu do roota, aby utworzyć katalogi. Z konta root możesz użyć:

sudo -u john xdg-user-dirs-update

W ten sposób wykonasz polecenie jako John, co może być przydatne, jeśli popełnisz błąd z więcej niż jednym użytkownikiem.

Pedro José Piquero Plaza
źródło
-1

Właśnie to mkhomedir_helper $USERNAMErobi polecenie.

Rory
źródło
1
Nie ma żadnej wartości dodanej poprzez powtórzenie tego, co inna odpowiedź wyjaśniła już dwa lata temu.
kasperd
-2

Możesz po prostu edytować / etc / passwd. Drugim do ostatniego pola jest katalog domowy użytkownika.

greeblesnort:x:1000:1000:greeblesnort,,,:/home/greeblesnort:/bin/bash
Greeblesnort
źródło
Użytkownicy zostali już utworzeni. Katalogi domowe nie zostały utworzone, ponieważ zapomniał o zmianie.
David Rickman,
Nie chciałem zmieniać katalogu domowego użytkownika, chciałem utworzyć katalog i skopiować do niego pliki szkieletu z odpowiednimi uprawnieniami po dodaniu użytkownika.
cd1
-2
usermod -d /home/john john

lub

usermod --home /home/john john

i czytać

man usermod

;)

użytkownik280139
źródło
2
Pytanie jest bardziej skomplikowane - i ma już lepsze odpowiedzi.
Esa Jokinen,