создавать домашние каталоги после создания пользователей

68

Я создал несколько пользователей с:

$ useradd john

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

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

CD1
источник
Это случилось с большим списком пользователей?
Дэвид Рикман
У меня было около 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 -» и посмотрите, правильно ли он работает. Если этого не произойдет, я думаю, что приведенный выше скрипт будет работать довольно хорошо.

dotwaffle
источник
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)
Рахул Патил
зачем использовать grep или cut с cat и pipe, а не напрямую таким образом? cut -f 1 -d: </ etc / passwd> passwtmp
c4f4t0r
98

Также вы можете использовать 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: Нет такого файла или каталога
Дмитрий Коприва,
@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= .

Кстати, я всегда пропускаю -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 on ARM) cp -r /etc/skel/.*вернитесь обратно в / etc / и скопируйте все данные отсюда (/etc/skel/.* соответствует / etc / skel / .. Я ожидаю). Решение от superuser.com/a/61619/22153, кажется, работает: cp -r / etc / skel / home / user (/ home / user не должно существовать до запуска команды)
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. Дешевый способ может быть так: usermod -d / home / john2 -m john, затем запустить usermod -d / home / john -m.
Дэвид Рикман
Не важно, что это тоже не работает.
Дэвид Рикман
1
Ну, по крайней мере, вы узнали что-то новое.
Дэвид Рикман
1
Вы забыли скопировать содержимое / etc / skel / + chown recursive для этих новых файлов. usermod не будет работать, так как здесь каталог был зарегистрирован, но не создан, usermod ничего не будет делать.
Аки
9

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

Это также хорошо масштабируемый подход, потому что он продолжит решать эту проблему, если вы когда-нибудь переключите свой репозиторий пользователей на службу каталогов, такую ​​как LDAP, в будущем.

jgoldschrafe
источник
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, вам не нужен root-доступ для создания каталогов. Из учетной записи root вы можете использовать:

sudo -u john xdg-user-dirs-update

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

Педро Хосе Пикеро Плаза
источник
-1

Это именно то, что mkhomedir_helper $USERNAMEделает команда.

Рори
источник
1
Никакая ценность не добавлена, повторяя то, что другой ответ уже объяснил два года назад.
Касперд
-2

Вы можете просто отредактировать / etc / passwd. Второе за последним поле - это домашний каталог пользователя.

greeblesnort:x:1000:1000:greeblesnort,,,:/home/greeblesnort:/bin/bash
Greeblesnort
источник
Они пользователи уже были созданы. Домашние каталоги не были созданы, потому что он забыл переключатель.
Дэвид Рикман
Я не хотел менять домашний каталог пользователя, я имел в виду создать каталог и скопировать в него файлы скелета с соответствующими разрешениями после добавления пользователя.
cd1
-2
usermod -d /home/john john

или же

usermod --home /home/john john

и читать

man usermod

;)

user280139
источник
2
Вопрос более сложный, чем просто - и уже имеет лучшие ответы.
Эса Йокинен