创建用户后创建主目录


68

我创建了一些用户:

$ useradd john

我忘记指定参数-m来创建主目录,并将骨架文件复制到每个用户。现在我想这样做,并且我不想重新创建所有用户(必须有一种更简单的方法)。因此,有什么方法可以创建用户目录并复制框架文件?

我考虑过创建目录,将目录授予相应的用户,复制所有框架文件并将其授予相应的用户。但是如果有这样的命令useradd -m不会再次创建用户,而是创建目录,那会更好。


这是否发生在大量用户身上?
David Rickman

我有大约10个用户遇到此问题。
cd1

我忍不住觉得拉胡尔对您的问题有最好的答案。也许您应该重新考虑您接受的答案?

Answers:


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,而不是系统用户的UID。
David Rickman

密码又如何呢?我怕没有!
数学

for i in $(awk -F: '{print $1 }' /etc/passwd)
Rahul Patil

为什么使用grep或cat和pipe切割,为什么不直接用这种方式呢?切-f 1 -d:</ etc / passwd> passwtmp
c4f4t0r 2013年

97

你也可以用 mkhomedir_helper

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

13
这是没有10行脚本就能真正回答问题的唯一答案。
布伦丹·伯德

这和pam的答案是最好的,谢谢。如果可以避免,切勿用手弄乱这些文件。
h4unt3r 2014年

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用户,因此我可以想象必须是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= .

顺便说一句:我也总是错过-museradd 的选项。至少基于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;
阿基(Aki)2013年

我个人不喜欢755 chmod,因为它允许用户监视其他用户的家庭。我认为每个用户都应明确授予其他用户访问权限。由于public_html至少需要x设置一些位,因此我建议chmod 0711在每个主public_html目录上使用默认目录和类似目录。
数学

另外,对skel使用cp -r,否则它将不会复制目录(.ssh)。
阿基(Aki)2013年

在我的系统(ARM上的Arch Linux)上,cp -r /etc/skel/.*递归回到/ etc /并从此处复制所有数据(/etc/skel/.*与/ etc / skel / ..匹配)。superuser.com/a/61619/22153中的解决方案似乎可以正常工作:cp -r / etc / skel / home / user(/ home / user在运行命令之前不得存在)
zpon 2014年

我猜想您的Shell Globing会*.(点)扩展。因此..是匹配的。我对吗?由于这种行为,许多外壳默认情况下都禁用了此功能。您使用哪个外壳?
数学

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。
David Rickman

没关系,这也不起作用。
大卫·里克曼

1
好吧,至少您学到了一些新东西。
大卫·里克曼

1
您忘记为这些新文件复制/ etc / skel / + chown递归的内容。usermod无效,因为此处已注册目录但未创建目录,usermod将不执行任何操作。
Aki 2013年

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

我做完a之后的第一步useraddsu - <user>

创建主目录,复制框架等-至少在CentOS 4上,我经常这样做。


0

用用户john登录并从shell编写:

xdg-user-dirs-update

而已!不要使用sudo或su,您不需要root访问权限即可创建某些目录。从根帐户,您可以使用:

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

他们的用户已经创建。未创建主目录,因为他忘记了切换。
David Rickman

我并不是要更改用户的主目录,而是要创建目录并在添加用户使用适当的权限将框架文件复制到该目录。
cd1

-2
usermod -d /home/john john

要么

usermod --home /home/john john

并阅读

man usermod

;)


2
这个问题不仅限于此,而且已经有了更好的答案。
Esa Jokinen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.