Linux useradd 命令介绍

作者: Alan Formy-duval 译者: LCTT Brooke Lau

| 2020-01-06 22:58

使用 useradd 命令来添加用户(并且根据需要修改账号)。

任何计算机系统中,添加用户都是最重要的事之一;本文着重介绍如何在 Linux 系统中添加用户。

正式开始之前,我先提三个概念。首先,跟大多数操作系统一样,Linux 用户也需要一个账号才能登录。本文只介绍本地账号,不涉及网络账号,如 LDAP。其次,每个账号都有一个名字(username)和一个对应的数字(用户 ID)。最后,每个用户通常都在一个组内,每个组都有一个名字和一个组 ID。

你可能已经想到了,Linux 提供了添加用户的命令行工具,就是 useradd 命令。有些版本也叫 adduser。为了方便使用,很多发行版上这个命令是一个指向 useradd 命令的符号链接。

  1. $ file `which adduser`
  2. /usr/sbin/adduser: symbolic link to useradd

来看一下 useradd

注意:本文描述的默认环境是 Red Hat Enterprise Linux 8.0。你可能会发现本文描述的这些文件和某些默认值与某些 Linux 发行版或其他 Unix 操作系统(FreeBSD 或 Solaris)偶尔会有差异。

默认处理

useradd 的基本用法相当简单:提供一个用户名就可以添加一个用户。

  1. $ sudo useradd sonny

在本例中,useradd 命令创建了一个名为 sonny 的账号。此命令同时创建了一个同名的组,sonny 被放进了这个组,这个组也是 sonny 账号的主组。命令执行时,根据配置文件 /etc/default/useradd 和 /etc/login.defs 中的不同设置,也会有其他的参数,如语言和 shell。对于一个私人系统或微小的单服务商业环境,这些参数已经足够了。

上面两个文件控制 useradd 的处理,用户的信息保存在 /etc 目录下的一些其他文件中,关于这些信息的讲解会贯穿全文。

文件 描述 域 (加粗的表示由 useradd 命令设置)
passwd 存储用户账号信息 用户名:未使用:UID:GID:备注:家目录:shell
shadow 存储用户账号的安全信息 用户名:加密密码:上次修改时间:最短使用天数:最长使用天数间:修改前警示天数:过期后宽限时间:未使用
group 存储组信息 组名:未使用:GID:成员列表

自定义处理

当管理员需要更好地控制账号时,可以使用命令行来自定义,如指定一个用户的 ID。

用户和组 ID

默认情况下,useradd 试图使用相同的用户 ID(UID)和主组 ID(GID),但也不完全是。虽然 UID 与 GID 相同不是必须的,但如果相同,会更方便管理员管理。

下面的场景就是一个 GID 与 UID 不同的例子。现在我添加另一账号,名为 Timmy。通过使用 getent 命令来比较 sonny 和 timmy 两个账号,显示两个用户和对应的主组。

  1. $ getent passwd sonny timmy
  2. sonny:x:1001:1002:Sonny:/home/sonny:/bin/bash
  3. timmy:x:1002:1003::/home/timmy:/bin/bash
  4. $ getent group sonny timmy
  5. sonny:x:1002:
  6. timmy:x:1003:

不幸的是,两者的 UID 和 GID 都不相同。因为默认的处理是,创建用户时,把下一个可用的 UID 赋给用户,然后把同一个数字作为主组 ID 赋给它。然而,当要使用的组 ID 已经被使用时,就再把下一个可用的 GID 赋给它。为了弄清细节,我猜想 1001 这个 GID 已经被使用了,用一个命令确认了一下。

  1. $ getent group 1001
  2. book:x:1001:alan

book 的 ID 是 1001,因此新创建的用户的 GID 都有偏移量 1。这就是为什么系统管理员在用户创建过程中需要多设置一些值的一个实例。为了解决这个问题,我必须先确定下一个可用的 UID 和 GID 是否相同。确定下一个可用值时,可以使用 getent group 和 getent passwd 命令,通过 -u 参数传递要确认的值。

  1. $ sudo useradd -u 1004 bobby
  2. $ getent passwd bobby; getent group bobby
  3. bobby:x:1004:1004::/home/bobby:/bin/bash
  4. bobby:x:1004:

另一个需要指定 ID 的场景是,通过 NFS 访问远程系统上的文件时。对于一个给定的用户,当 NFS 所有客户端和服务系统的 ID 都一样时,管理员更容易控制。在我的文章 使用 autofs 挂载 NFS 中有详细介绍。

更多自定义

一些其他的指定用户信息的参数也用得比较频繁。这里是一些你会经常用到的参数的概括例子。

注释

注释选项是通过 -c 参数指定的一个解释文本字段,可以提供一段简短的描述或其他信息。

  1. $ sudo useradd -c "Bailey is cool" bailey
  2. $ getent passwd bailey
  3. bailey:x:1011:1011:Bailey is cool:/home/bailey:/bin/bash

一个用户可以被指定一个主组和多个次组。-g 参数指定主组名称或 GID。如果不指定,useradd 会以用户名创建一个主组(前面演示过)。-G(大写)参数用一个逗号分隔的组列表来指定此用户所属的组,这些组就是次组。

  1. $ sudo useradd -G tgroup,fgroup,libvirt milly
  2. $ id milly
  3. uid=1012(milly) gid=1012(milly) groups=1012(milly),981(libvirt),4000(fgroup),3000(tgroup)

家目录

useradd 的默认处理是,在 /home 目录下创建用户的家目录。然而,下面的参数可以改写家目录的基础目录。-b 设置另一个可以创建家目录的基础目录。例如指定 /home2 而不是 /home

  1. $ sudo useradd -b /home2 vicky
  2. $ getent passwd vicky
  3. vicky:x:1013:1013::/home2/vicky:/bin/bash

-d 参数可以指定一个与用户名不同的家目录。

  1. $ sudo useradd -d /home/ben jerry
  2. $ getent passwd jerry
  3. jerry:x:1014:1014::/home/ben:/bin/bash

目录模板

指定 -k 参数会在创建新用户时,复制 /etc/skel 目录下的所有文件到用户的家目录中。这些文件通常是 shell 配置文件,当然也可以是系统管理员想在新建用户时使用的任何文件。

Shell

-s 参数可以指定 shell。如果不指定,则使用默认的 shell。例如,下面的例子中 ,配置文件中定义的 shell 是 bash,但 wally 这个用户指定的是 zsh

  1. SHELL=/bin/bash
  2. $ sudo useradd -s /usr/bin/zsh wally
  3. $ getent passwd wally
  4. wally:x:1004:1004::/home/wally:/usr/bin/zsh

安全

安全是用户管理的重中之重,因此 useradd 命令也提供了很多关于安全的选项。可以使用 -e 参数,以 YYYY-MM-DD 的格式指定一个用户的过期时间。

  1. $ sudo useradd -e 20191231 sammy
  2. $ sudo getent shadow sammy
  3. sammy:!!:18171:0:99999:7::20191231:

当密码过期时,账号也会自动失效。-f 参数指定密码过期后经过几天账号失效。如果设为 0,则立即失效。

  1. $ sudo useradd -f 30 willy
  2. $ sudo getent shadow willy
  3. willy:!!:18171:0:99999:7:30::

实例

生产环境中,创建一个用户账号时会用到多个参数。例如,我要创建一个 Perry 账号,可能会用下面的命令:

  1. $ sudo useradd -u 1020 -c "Perry Example" \
  2. -G tgroup -b /home2 \
  3. -s /usr/bin/zsh \
  4. -e 20201201 -f 5 perry

查看前面的内容来理解每个选项。用下面的命令确认结果:

  1. $ getent passwd perry; getent group perry; getent shadow perry; id perry
  2. perry:x:1020:1020:Perry Example:/home2/perry:/usr/bin/zsh
  3. perry:x:1020:
  4. perry:!!:18171:0:99999:7:5:20201201:
  5. uid=1020(perry) gid=1020(perry) groups=1020(perry),3000(tgroup)

一点小建议

useradd 命令是所有 Unix(不仅仅是 Linux)系统管理员都必知必会的命令。由于用户创建不能出错,需要第一次就正确,所以理解它的每一个选项很重要。这意味着你需要有一套深思熟虑的命名约定,包括为整个企业环境而不仅仅是一个单系统预留一个专用的 UID/GID 范围,尤其是你为一个成长中的组织工作时。

在linux中创建新用户的两个命令:useradd和adduser之区别

useradd 用户名

  • -d  指定用户家目录
  • -s  指定用户登陆shell
  • -u  指定用户uid
  • -g  指定用户所属主组
  • -G  指定用户所属附属组
  1. 使用useradd时,如果后面不添加任何参数选项,例如: #sudo useradd test创建出来的用户将是默认“三无”用户:一无Home Directory,二无密码,三无系统Shell。
  2. 使用adduser时,创建用户的过程更像是一种人机对话,系统会提示你输入各种信息,然后会根据这些信息帮你创建新用户。
  3. 所以,adduser更适合初级使用者,因为不用去记那些繁琐的参数选项,只要跟着系统的提示一步一步进行下去就行,缺点就是整个创建过程比较复杂而漫长;而useradd比较适合有些高阶经验的使用者,往往一行命令加参数就能解决很多问题,所以创建起来十分方便。

例1:

1
# useradd -d /usr/leo -m leo

此命令创建了一个用户leo-d和-m选项用来为登录名leo产生一个主目录/usr/leo(/usr为默认的用户主目录所在的父目录)。

例2:

1
# useradd -d /home/leo -s /usr/bin/bash -g leo -G admin,root leo

此命令新建了一个用户leo/bin/sh,他属于group用户组,同时又属于admin和root用户组,其中group用户组是其主组。
这里可能新建组:groupadd group 及 groupadd admin
增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件,如/etc/shadow,/etc/group等。
Linux提供了集成的系统管理工具userconf,他能用来对用户账号进行统一管理。

注: 用户帐户本身在 /etc/passwd 中定义。Linux 系统包含一个 /etc/passwd 的同伴文件,叫做 /etc/shadow。该文件不像 /etc/passwd,只有对于 root 用户来说是可读的,并且包含加密的密码信息

Linux useradd 命令介绍的更多相关文章

  1. linux useradd 命令基本用法

    在 Linux 中 useradd 是个很基本的命令,但是使用起来却很不直观.以至于在 Ubuntu 中居然添加了一个 adduser 命令来简化添加用户的操作.本文主要描述笔者在学习使用 usera ...

  2. Linux基础命令介绍七:网络传输与安全 wget curl rsync iptables

    本篇接着介绍网络相关命令:wget 文件下载工具.curl 网络数据传输工具.rsync 文件传输工具等. 本篇接着介绍网络相关命令 1.wget 文件下载工具 wget [option]... [U ...

  3. Linux —— Vi 命令介绍

    简介 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器. 这里只是简单地介绍一下它的用法和一小部分指令. 由于对Unix及Linux系统的任何版本,vi编辑 ...

  4. Linux netstat命令介绍

    关注Linux的系统状态,主要从两个角度出发,一个角度是系统正在运行什么服务(ps命令):另外一个就是有什么连接或服务可用(netstat命令).netstat还可以显示ps无法显示的.从inetd或 ...

  5. Linux重启命令介绍

    下面介绍在 Linux 操作系统中重启和关闭相关的命令:shutdown.reboot.init.halt.poweroff.systemctl,你可以根据需要来选择适合的 Linux 命令关闭或重新 ...

  6. linux常用命令介绍

    参考博客: https://www.cnblogs.com/caozy/p/9261224.html 学前理论 linux主要特征 :一切且文件(目录.硬盘等都是文件):硬件都在/dev 目录,如硬盘 ...

  7. linux ps命令介绍

    来源<鸟哥的linux私房菜> ps:将某个时间点的程序运作情况撷取下来 [root@linux ~]# ps aux [root@linux ~]# ps -lA [root@linux ...

  8. Linux 常用命令介绍

    介绍常用命令,在忘记时便于即使查询 复制.移动.删除     cp.mv.rm.pwd 1. CP 介绍 用法:CP [-adfilprsu]  源文件  目标文件 参数:参数说明: -a:是指arc ...

  9. Linux常用命令介绍(满足日常操作)

    大家好,今天来给大家分享一些Linux的常用命令,希望对大家有用 命令行的基本格式:   命令字 [选项] [参数]     其中,命令字.选项.参数之间用空格分开,多余的空格将被忽略.[ ]括起来的 ...

随机推荐

  1. 基于gitlab的项目管理流程

    框架 背景 个人是不太愿意使用用户体验差的软件来做项目管理,行业内,要找到这么一款软件,又要符合自己的需求,着实不容易.要免费,易用性要好,要安全,要有数据统计.而程序员的世界,SVN 之后,可能没有 ...

  2. redhat7.6 更换 centos7 YUM

    使用yum 遇到如下错误. This system is not registered to Red Hat Subscription Management. You can use subscrip ...

  3. JAVAEE_Servlet_07_设置网站欢迎页面

    Web站点的欢迎页面的设置 * 欢迎页面怎么设置? - 假设在WebContent下创建login.html,想让login.html作为站点的欢迎页面. - 打开web.xml文件,添加<we ...

  4. 探秘神奇的运动路径动画 Motion Path

    CSS 中有一个非常有意思的模块 -- CSS Motion Path Module Level 1,翻译过来也就是运动路径.本文将对 motion path 一探究竟,通过本文,你可以了解到: 什么 ...

  5. Fiddler高级用法

    Fiddler高级用法 1. 简单用法 Fiddler作为一个基于http协议的抓包工具,一直在业界有广泛使用.很多测试或者前端在使用Fiddler时,仅仅用于查看前端和服务端之间的请求信息.包括我作 ...

  6. Ubuntu Linux 学习篇 配置DHCP服务器

    isc-dhcp-server 动态主机配置协议是一个局域网的网络协议.指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码.首先, DHCP服务器必须是 ...

  7. Github + Picgo + Typora 让笔记远走高飞

    Github设置 登录 2.新建仓库 设置token 打开设置 然后点击,按钮生成Generate token Picgo设置 下载PicGo 参考视频 PicGo设置 设置Server 图床设置 上 ...

  8. (一)安装mysql

    数据库 数据库的相关概念 DB:数据库(database):存储数据的"仓库".它保存了一系列有组织的数据. DBMS:数据库管理系统(Database Management Sy ...

  9. docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群

    题目要求 (1)将springboot应用程序打成jar包:Hot.jar (2)利用dockerfile将Hot.jar构建成镜像 (3)构建 Swarm 集群 (4)在 Swarm 集群中使用 c ...

  10. JavaWeb——MySQL基础

    内容索引 数据库的基本概念 MySQL数据库软件 安装 卸载 配置 SQL 数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB 2. 什么数据库? * 用于存储和管理数据的仓 ...