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. KubeEdge EdgeMesh设计原理

    EdgeMesh主要用来做边缘侧微服务的互访. ServiceMesh service mesh是一个服务网格的概念.在传统的架构里面都是通过像Dubbo来进行服务治理,服务治理的程序和我们应用程序强 ...

  2. 机器学习--如何理解Accuracy, Precision, Recall, F1 score

    当我们在谈论一个模型好坏的时候,我们常常会听到准确率(Accuracy)这个词,我们也会听到"如何才能使模型的Accurcy更高".那么是不是准确率最高的模型就一定是最好的模型? 这篇博文会向大家解释 ...

  3. sql 如何删除(代替)字段内某一部分内容

    方法一(此方法既可用于删除某一列字段中的某部分字符,也可用于替换某一列字段中的某部分字符) update Table_Name set Column_Name=replace(Column_Name, ...

  4. 1W字|40 图|硬核 ES 实战

    前言 上篇我们讲到了 Elasticsearch 全文检索的原理<别只会搜日志了,求你懂点检索原理吧>,通过在本地搭建一套 ES 服务,以多个案例来分析了 ES 的原理以及基础使用.这次我 ...

  5. JVM学习笔记(三):JVM基本参数

    1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第三章 本文是第三章的一些笔记整理. 2 GC日志:-Xlog:gc 要打印GC日志的话,可以加上-Xlog: ...

  6. 安装电脑思考到了Java设计模式:建造者模式

    目录 定义 意图 主要解决问题 何时使用 优缺点 结构 组装电脑的例子 定义 建造者模式是对象的创建型模式,可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表 ...

  7. 详解Linux指令与文件的搜寻

    我们在管理Linux服务器时通常会进行搜索文件及目录操作,下面我们就开始了解一下linux目录结构的相关知识. 博主再奉上一套零基础入门Linux视频,带你从入门到精通 https://www.bil ...

  8. OpenCV 之 空间刚体变换

    刚体就是 "刚性物体",它在运动过程中,内部各质点间的相对位置不会改变,也即 每两个质点间的距离 保持不变 假设刚体内任意两个质点,坐标分别为 $(x_1, y_1, z_1)$ ...

  9. 如何高效的遍历Map?你常用的不一定是最快的

    微信公众号:大黄奔跑 关注我,可了解更多有趣的面试相关问题. 写在之前 如文章标题所言,遍历Map是开发过程中比较常见的行为,实现的方式也有多种方式,本文带领大家一起看看更加高效的遍历 Map. 『茴 ...

  10. 1086 Tree Traversals Again

    An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...