我使用以下命令创建了一些用户:


$ useradd john


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

我考虑过创建目录,将其分类为相应的用户,复制所有框架文件并将其分类为相应的内容用户。但是如果有一个像useradd -m这样的命令不会再次创建用户,而是创建目录,那就更好了。

评论

大量用户是否发生了这种情况?

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

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

#1 楼

这听起来像是一个愚蠢的主意,但是如果用户实际上没有做任何事情,则可以执行以下操作:

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-”,然后查看其是否“正确”。如果没有,我认为上述脚本会很好地工作。

评论


是的,它可以工作,尽管它创建了新的UID和GID(但这不是问题)。但是我忘了从/ etc / shadow备份密码,现在用户将不得不再次设置密码= /

– cd1
2009年9月9日15:18

如果他最近创建了它们,则可以执行以下操作:cat / etc / passwd | egrep'^ \:[0-9] {4} \:'| cut -f 1 -d:> /tmp/users.list应该只获取有效用户的UID,而不是系统用户的UID。

– David Rickman
2009年9月9日15:18

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

–数学
2012年5月12日15:57

为我在$(awk -F:'{print $ 1}'/ etc / passwd)中

–拉胡尔·帕蒂尔(Rahul Patil)
13年7月9日在6:48

为什么使用grep或cat和pipe切割,为什么不直接用这种方式呢?切-f 1 -d: passwtmp

–c4f4t0r
2013年12月12日12:01



#2 楼

您也可以使用mkhomedir_helper

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


评论


这是没有10行脚本的实际答案的唯一答案。

–布兰登·伯德(Brendan Byrd)
2014年1月6日23:58

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

– h4unt3r
2014年1月21日,下午1:02

dka @ dev-04:/ $ / sbin / mkhomedir_helper dka dka @ dev-04:/ $ cd bash:cd:/ home / dka:没有这样的文件或目录

– Dimitri Kopriwa
17年11月19日在22:19

@DimitriKopriwa您是否以root用户身份尝试过它须藤/ sbin / mkhomedir_helper dka吗? / home目录属于root用户,因此我想必须是root用户才能创建其子目录。

–乔纳森
19年4月30日在20:54



#3 楼

您将需要手动创建用户目录。这需要三个步骤:


创建符合/etc/passwd的目录,通常通常已经有一个/ home / login条目。
从/ etc / skel复制初始文件
/>
并最终设置权限:


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




BTW:我也总是错过useradd的-m选项。至少基于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;

–秋
2013年9月26日15:11

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

–数学
2013年9月27日在7:51

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

–秋
2013年9月27日在12:22

在我的系统上(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-12-18 20:10



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

–数学
15年1月20日在8:10

#4 楼

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


那应该可以实现我认为的窍门

评论


它说:usermod:没有变化。并且未创建目录。 -m选项也不起作用。

– cd1
09-09-9 14:56

好的。我弄清楚了为什么它不起作用,除非您另外指定,否则useradd以前只将$ HOME_DIR放在/ home中。现在,它似乎自动将其放在/ home / $ USER中。一种便宜的方法可能是先执行usermod -d / home / john2 -m john,然后再运行usermod -d / home / john -m。

– David Rickman
09-09-9 15:09

没关系,这也不起作用。

– David Rickman
09年9月9日15:10

好吧,至少您学到了一些新东西。

– David Rickman
09-09-9 15:38

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

–秋
2013年9月26日15:12

#5 楼

您可以使用pam_mkhomedir之类的东西来防止将来成为任何用户的问题。 pam_mkhomedir是一个PAM模块,如果不存在,它将在登录时自动创建用户的主目录,并使用/ etc / skel(或您指定的任何skel目录)中的文件填充该主目录。

这是也是一种很好的可扩展方法,因为如果将来将用户存储库切换到诸如LDAP之类的目录服务,它将继续解决此问题。

#6 楼

在我的情况下,主卷已损坏,我决定从头开始重建它,因为其中涉及的数据很少,但是我想保留用户的登录信息,因此我使用以下脚本手动创建了主目录:

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


#7 楼

如果您将/etc/login.defs编辑为包含

CREATE_HOME yes


,那么除非您告诉系统不要这样做,否则将来的任何用户都将自动创建主目录。

另一个选择是使用PAM进行登录,并使用pam_mkhomedir模块在首次登录时自动创建homedir。

#8 楼

使用用户john登录并从shell中写入:

xdg-user-dirs-update


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

sudo -u john xdg-user-dirs-update


这样,您将以john身份执行命令,如果您多次尝试犯错,将很有用。用户。

#9 楼

在执行useradd之后,我的第一步是对su - <user>进行创建。

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

#10 楼

这正是mkhomedir_helper $USERNAME命令的作用。

评论


重复两年前已经解释的另一个答案,不会增加任何价值。

–卡巴斯德
15年6月18日在9:57

#11 楼

您可以简单地编辑/ etc / passwd。最后一个字段是用户的主目录。

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


评论


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

– David Rickman
09年9月9日19:27

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

– cd1
09年9月9日在19:37

#12 楼

usermod -d /home/john john




usermod --home /home/john john


并阅读

man usermod


;)

评论


这个问题不仅限于此,而且已经有了更好的答案。

– Esa Jokinen
2015年4月6日于10:39