створювати домашні каталоги після створення користувачів


68

Я створив деяких користувачів за допомогою:

$ useradd john

і я забув вказати параметр -mдля створення домашнього каталогу та копіювання файлів скелета для кожного користувача. тепер я хочу це зробити, і я не хочу відтворювати всіх користувачів (повинен бути простіший спосіб). Отже, чи є спосіб створити користувацькі каталоги та скопіювати файли скелетів?

Я думав над створенням каталогів, замовчуванням їх відповідному користувачеві, копіюванням усіх файлів скелету та замовчуванням їх відповідному користувачеві. але якщо є така команда useradd -m, яка не створює користувача знову, але створює каталоги, було б краще.


Це сталося з великим списком користувачів?
Девід Рікман

У мене було близько 10 користувачів з цією проблемою.
cd1

Я не можу не допомогти, але відчуваю, що Рахул найкраще відповідає на ваше запитання. Можливо, вам слід переглянути свою прийняту відповідь?

Відповіді:


17

Це може здатися дурною ідеєю, але якщо користувачі насправді нічого не роблять, ви можете зробити:

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

Потім відредагуйте /tmp/users.list, щоб містити лише тих користувачів, яких ви хочете. Потім зробіть:


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

Однак багато дистрибутивів на основі Redhat створить вам новий домашній каталог під час першого входу, якщо він вказаний у / etc / passwd, де має бути каталог.

Щоб перевірити це, зробіть "su -" і подивіться, чи це робить "правильно". Якщо цього не відбувається, я думаю, що вищезазначений сценарій буде працювати досить непогано.


1
так, він працював, хоча створив нові UID та GID (але це не було проблемою). але я забув створити резервну копію паролів з / etc / shadow, тепер користувачам доведеться знову встановлювати свої паролі = /
cd1

Якщо він створив їх недавно, він може зробити: cat / etc / passwd | egrep '^ \: [0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list Це повинен захоплювати лише UID дійсних користувачів, а не користувачів системи.
Девід Рікман

Що з паролями, чи залишаються вони такими ж? Я не боюся!
математика

for i in $(awk -F: '{print $1 }' /etc/passwd)
Рахул Патіль

навіщо використовувати греп або різати з кішкою і з трубою, чому не прямо таким чином? cut -f 1 -d: </ etc / passwd> passwtmp
c4f4t0r

97

Також ви можете використовувати mkhomedir_helper

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

13
Це єдина відповідь, яка насправді відповідає на це питання, не маючи сценарію з 10 рядків.
Брендан Берд

Це та відповідь пам. Тут найкраще, дякую. Ніколи не возиться з тими файлами вручну, якщо ви можете цього уникнути.
h4unt3r

1
dka @ dev-04: / $ / sbin / mkhomedir_helper dka dka @ dev-04: / $ cd bash: cd: / home / dka: Такого файлу чи каталогу немає
Dimitri Kopriwa

@DimitriKopriwa Ви спробували це як root, наприклад sudo /sbin/mkhomedir_helper dka? /homeкаталог належить rootкористувачеві, і тому я припустив би , що один повинен бути коренем , щоб створити його підкаталог.
Джонатан

15

Вам потрібно буде створити каталог користувачів вручну. Для цього потрібно три кроки:

  1. Створіть каталог відповідно до /etc/passwd, зазвичай там уже буде запис / home / login.
  2. Скопіюйте початкові файли з / etc / skel
  3. І нарешті встановіть правильні дозволи:

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

BTW: Я завжди пропускаю -mваріант для useradd теж. Принаймні системи на базі Debian повинні мати adduserкоманду, яку я рекомендую над useradd. Якщо ви пропустили -mваріант, можливо, варто також розглянути, deluserа потім відтворити користувача з належними параметрами.

Редагувати: додано -rдля копіювання також каталогів.


Зробив це: usernameh = myusername; mkdir / home / $ usernameh; cp / etc / skel / * /etc/skel/.* / home / $ usernameh; chown -R $ usernameh: $ usernameh / home / $ usernameh; chmod -R 755 / home / $ usernameh;
Акі

Особисто мені не подобається 755 chmod, оскільки це дозволяє користувачам шпигувати за домом інших користувачів. Я думаю, кожен користувач повинен прямо надавати доступ іншим. Оскільки public_htmlпотрібно принаймні xвстановити біт, я б рекомендував chmod 0711для кожного будинку public_htmlта подібних каталогів за замовчуванням.
математика

також використовуйте cp -r для skel, так як інакше він не буде копіювати каталоги (.ssh).
Акі

У моїй системі (Arch Linux на ARM) cp -r /etc/skel/.*повторюється назад у / etc / і копіює звідси всі дані (/etc/skel/.* match / etc / skel / .. Я очікую). Рішення від superuser.com/a/61619/22153, здається, працює: cp -r / etc / skel / home / user (/ home / користувач не повинен існувати до запуску команди)
zpon

Я здогадуюсь, що ви обшивка оболонки розширюється за *допомогою .(крапка). Так ..відповідає. Маю рацію? Багато таких снарядів відключають це за замовчуванням через таку поведінку. Яку оболонку ви використовуєте?
математика

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

Це повинно зробити трюк, який я вважаю


2
він говорить: usermod: no changes. і каталог не створений. він не працює ні з -mопцією.
cd1

1
Добре. Я зрозумів, чому це не працює, useradd використовував лише для того, щоб ставити $ HOME_DIR у / home, якщо ви не вказали інше. Зараз, здається, замість цього автоматично помістити його в / home / $ USER. Дешевим способом може бути користувальницький -d / home / john2 -m john, а потім запустити usermod -d / home / john -m.
Девід Рікман

Не забудьте, що теж не працює.
Девід Рікман

1
Ну принаймні ви дізналися щось нове.
Девід Рікман

1
Ви забули скопіювати вміст / etc / skel / + chow рекурсивно для цих нових файлів. usermod не буде працювати, оскільки тут каталог був зареєстрований, але не створений, usermod нічого не зробить.
Акі

9

Ви можете використовувати щось на зразок pam_mkhomedir, щоб у майбутньому це не було проблемою для будь-яких користувачів. pam_mkhomedir - це модуль PAM, який автоматично створює домашній каталог користувача при вході в систему, якщо він не існує, і заповнює його файлами з / etc / skel (або будь-якого каталогу skel, який ви вказали).

Це також непогано масштабований підхід, оскільки він продовжить вирішувати цю проблему, якщо в майбутньому ви коли-небудь перейдете на сховище користувачів на службу каталогів, як LDAP.


4

У моєму випадку домашній том був пошкоджений, і я вирішив просто відновити його з нуля, оскільки не так багато даних, але я хочу зберегти інформацію про вхід користувачів, тому я відтворив домашні каталоги вручну за допомогою цього сценарію:

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

Якщо ви редагуєте, /etc/login.defsщоб містити

CREATE_HOME yes

тоді домашні каталоги будуть автоматично створені для будь-яких майбутніх користувачів, якщо ви не скажете системі цього не робити.

Інший варіант - використовувати PAM для входу в систему і використовувати модуль pam_mkhomedir для автоматичного створення homedir при першому вході.


0

Перший мій крок після виконання - useraddце su - <user>.

Створює домашні каталоги, копіює скелети тощо - принаймні у вікні CentOS 4, що я роблю це найчастіше.


0

Увійдіть з користувачем john і запишіть з оболонки:

xdg-user-dirs-update

Це воно! Не використовуйте sudo або su, вам не потрібен кореневий доступ для створення деяких каталогів. З кореневого облікового запису ви можете використовувати:

sudo -u john xdg-user-dirs-update

Таким чином, ви виконаєте команду як john, що може бути корисно, якщо ви помилилися з кількома користувачами.


-1

Це саме те, що mkhomedir_helper $USERNAMEробить команда.


1
Немає значення, повторюючи те, що ще одна відповідь була пояснена два роки тому.
kasperd

-2

Ви можете просто відредагувати / etc / passwd. Друге до останнього поля - домашній каталог користувача.

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

Вони вже були створені користувачами. Домашні каталоги не були створені, тому що він забув комутатор.
Девід Рікман

Я не мав на увазі змінити домашній каталог користувача, я мав намір створити каталог і скопіювати в нього файли скелетів з відповідними дозволами після додавання користувача.
cd1

-2
usermod -d /home/john john

або

usermod --home /home/john john

і читати

man usermod

;)


2
Питання складніше, ніж просто це - і вже має кращі відповіді.
Esa Jokinen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.