100个Linux命令(2)-用户管理

本文介绍Linux基础中与用户相关原理以及命令的使用。

理论篇

基本概念

用户和用户组都是Linux系统中的一种资源。

每个用户都用用户名、用户ID、所属组及其默认shell,可能包括密码、家目录、附属组和注释信息等。

每个组也都有用户组名、用户组ID。在Linux中,约定俗成的将同一用户的UID和GID保持一致。组分为主组和附加组,用户一定会属于一个主组,也可以同时加入多个附加组。

在Linux中,用户分为3中:超级管理员、系统用户、普通用户

(1)超级管理员

超级管理员是最高权限者,uid=0,默认超级管理员用户名为root。因为uid默认具有唯一性,所以超级管理员默认只能有一个。家目录为/root

(2)系统用户

系统用户是具有某些权限但不需要登录操作系统的用户。uid 范围从201到999。出于安全考虑,系统用户一般不用来登录,所以系统用户的默认 shell 一般是/sbin/nologin,并且大多数情况下它们没有家目录。

(3)普通用户

普通用户是权限受到限制的用户,默认只能执行/bin、/usr/bin、/usr/local/bin和自身家目录下的命令。uid 范围从500开始。普通用户对自身加目录下的所有文件拥有所有权限。家目录为/home下以用户名命名的文件夹。

超级管理员的命令提示符是"#",其他为"$"

相关文件

1.用户文件/etc/passwd

/etc/passwd文件记录操作系统中用户的信息,文件中有多少行系统就有多少个用户。

每一行表示一个用户,每一行格式都是6个冒号共7列属性,其中某些列属性可以留空。

/etc/passwd 文件
  • 用户名:注意两个特殊用户:root 和 nobody
  • 密码占位符:密码信息和用户信息分离后,用户密码占位符
  • UID
  • GID
  • 用户注释信息
  • 用户家目录:root 用户的家目录是/root
  • 用户默认 shell:虽然功能是设置默认 shell,但也可以是任意一个可执行程序或脚本,如/sbin/nologin、/sbin/shutdown

2.用户密码文件/etc/shadow

/etc/shadow文件中存放的是用户的密码信息,该文件除了超级管理员,任何人都不能直接读取和修改文件。用户之所以能修改自己的密码,是因为 passwd 程序的 suid 属性,使得修改密码时临时提升为 root 权限。

每一行表示一个用户密码属性,有8个冒号共9个属性

/etc/shadow 文件
  • 用户名
  • 加密后的密码
    • 该列为空,即"::",表示该用户没有密码
    • 该列为"!",表示该用户被锁定,无法登录,但其他登录方式可能不被限制,如 ssh key 方式、su 方式
    • 该列为"*",即":*:",表示该用户被锁,和"!"相同
    • 该列为"$id$salt$hashed",表示该用户密码正常。
      • $id$的id表示密码的加密算法
        • $1$表示使用MD5算法
        • $2a$表示使用Blowfish算法
        • $2y$是另一算法长度的Blowfish
        • $5$表示SHA-256算法
        • $6$表示SHA-512算法,$5$和$6$这两种算法的破解难度远高于MD5
      • $salt$是加密时使用的salt
      • $hashed是真正的密码部分。
  • 当前密码的使用天数:才1970年1月1日到上次修改密码的天数
  • 密码最少使用天数:省略或"0"表示不设置期限
  • 密码最大使用天数:超过了它不一定密码就失效,可能下一个字段设置了过期后的宽限天数。设置为空时将永不过期,后面设置的提醒和警告将失效。root等一些用户的已经默认设置为了99999,表示永不过期。如果值设置小于最短使用期限,用户将不能修改密码
  • 密码过期前多少天就开始提醒用户密码将要过期:空或0将不提醒
  • 密码过期后的宽限天数:在宽限时间内用户无法使用原密码登录,必须改密码或者联系管理员。设置为空表示没有强制的宽限时间,可以过期后的任意时间内修改密码
  • 帐号过期时间:从1970年1月1日开始计算天数。设置为空帐号将永不过期,不能设置为0。不同于密码过期,密码过期后账户还有效,改密码后还能登录;帐号过期后帐号失效,修改密码重设密码都无法使用该帐号
  • 保留字段

3.组文件 /etc/group 和 /etc/gshadow

/etc/group 包含了组的信息,每行一个组,3个冒号共4列信息,分别是组名、密码占位符、gid、该组的 user 列表

/etc/gshadow 包含了组密码信息

4.骨架目录/etc/skel

骨架目录的作用是当新建用户时,会将此目录的文件复制到新建用户的家目录中。默认只有三个环境配置文件,可以修改这里面的内容,或者添加文件在骨架目录中,以后新建的用户就会自动获得到这些环境和文件。

/etc/skel 文件

5.用户账号限制文件 /etc/login.defs

该文件的配置对 root 用户无效。如果/etc/shadow 文件中也有相同的配置,则以 shadow文件为准。

该文件可以设置关于密码的最大有效期、两次密码最小间隔、useradd 命令创建用户自动选择 uid 和 gid 的范围、家目录的 umask 值(默认022)、用户和组密码的默认加密算法等。

/etc/login.defs 中的设置控制的是 shadow-utils包中的组件,组件中的工具执行操作时会读取该文件中的配置。

shadow-utils 包含的二进制程序

6./etc/default/useradd

创建用户时使用的默认配置。useradd -D修改的就是此文件

/etc/default/useradd 文件
  • GROUP:在 useradd 使用-N 或者 /etc/login.defs 中 USERGROUPS_ENAB=no 时表示创建用户时不创建同用户名的主组,此时新建的用户将默认以此组为主组
  • HOME:用户的家目录位置
  • INACTIVE:是否启用账号过期设置(注意不是密码过期),-1表示不启用
  • SHEEL:新建用户默认的 shell
  • SKEL:指定骨架目录
  • CREATE_MAIL_SPOOL:是否创建用户 mail 缓冲

(7)/etc/sudoers

该文件主要配置 sudo 命令时指定的用户和对应的权限。主要包括别名的配置和 sudo 权限的配置

安全策略配置格式为:用户名 主机名=(可切换到的用户身份) 权限和命令

  • 用户名:允许使用 sudo 的用户名,也可以用用户组,只需在组名前加个百分号%表示;
  • 主机名:表示该用户可以在哪些主机上运行sudo,可以用 hostname 也可以用 ip 地址指定,ALL 表示从任何终端(任何主机)使用 sudo;
  • 可切换到的用户身份:即指定执行命令的用户,也可以用组,(ALL)表示允许以任何用户执行 sudo 命令
  • 权限和命令:允许执行和不允许执行的命令和特殊权限,多个命令间用逗号分隔,命令可以带其选项以及参数。命令要写绝对路径。不允许执行的命令需要在命令加上"!"。可以使用标签,如 NOPASSWD 标签表示切换或以指定用户执行该标签后的命令时不需要输入密码。一行写不下是可以使用'\'续行。 ALL 表示允许 sudo 权限执行款芳儿命令。

标签的使用方法:NOPASSWD:/usr/sbin/useradd,PASSWD:/usr/sbin/userdel

上面表示 useradd 命令不需要输入密码,而 userdell 需要输入密码

示例

  1. 授权给单个用户:manson ALL=(ALL) ALl
  2. 用户 text 只能在本机以 root 账户执行/bin/chown、/bin/chmod:test dev1=(root) /bin/chown,/bin/chmod
  3. 授权给组:%sudo ALL=(ALL) ALL

命令篇

22.useradd && adduser

useradd用于添加用户,adduseruseradd的软链接。默认会自动创建一个和用户名相同的用户组,由/etc/login.defs 中的USERGRUOP_ENAB 变量控制。创建普通用户时,不加任何和家目录相关的选项时,是否创建家目录是由/etc/login.defs 中的CREATE_HOME 变量控制的。

一般用法:useradd options login_name

选项

-b:指定家目录的 basedir,默认为/home 目录

-d:指定用户家目录,默认为/home/user_name

-m:创建家目录时,若家目录不存在则自动创建,若不指定该选项且/etc/login.defs 中CREATE_HOME 未启用时将不不会创建家目录

-M:显式指定不要创建家目录,会覆盖/etc/login.defs 中 CREATE_HOME 设置

-g:指定用户主组,要求组已存在

-r:创建一个系统用户。默认不会创建用户家目录,除非使用-m 选项

-s:指定用户默认的登录 shell,默认使用/etc/default/useradd 中的 SHELL变量设置

-u:指定用户 uid,默认 uid 必须唯一,除非使用-o 选项

-o:允许创建一个重复 uid 用户,只有和-u 选项同时使用才生效

-D:修改 useradd 创建用户时的默认选项,即修改/etc/default/useradd 文件

  • -b,--base-dir BASE_DIR
  • -e,--expiredate EXPIRE_DATE
  • -f,--inactive INACTIVE
  • -g,--gid GROUP
  • -s,--shell SHELL
  • 不加以上5个选项,会列出默认属性

23.newusers

newusers用于批量创建或修改已有用户信息。创建用户会读取 /etc/default/login.defs 的配置项。

一般用法:

newusers [options] [file]

file 文件定义了需要新建或修改用户的信息,一行代表一个用户,格式如下:

pw\_name:pw\_passwd:pw\_uid:pw\_gid:pw\_gecos:pw\_dir:pw\_shell

  • pw_name:用户名,不存在则新建,否则修改已存在的用户信息
  • pw_passwd:用户密码,该项使用明文密码,在修改或创建用户时会按照指定的算法自动对其进行加密转换
  • pw_uid:指定 uid,留空则自动选择 uid。如果该项为已存在的用户名,则使用该存在用户的 UID。
  • pw_gid:用户主组的 gid 或组名。若给定组不存在,则自动创建组。留空则创建同用户名相同的组,gid 自动选择。
  • pw_gecos:注释信息
  • pw_dir:指定用户家目录,若不存在则自动创建,留空则不创建。newusers 不会递归创建父目录
  • pw_shell:指定用户的默认 shell

选项

-c:指定加密算法,可选 DES、MD5、NONE、SHA256、SHA512

-r:创建一个系统用户

newusers首先尝试创建或修改所有指定的用户,然后将信息写入到user和group的文件中。如果尝试创建或修改用户过程中发生错误,则所有动作都将回滚,但如果在写入过程中发生错误,则写入成功的不会回滚,这将可能导致文件的不一致性。要检查用户、组文件的一致性,可以使用showdow-utils包提供的grpck和pwck命令。

24.groupadd

groupadd用于创建一个新组。

一般用法:groupadd options group

选项

-f:如果要创建的组已经存在,默认会错误退出,使用该选项则强制创建且以正确状态退出,只不过gid可能会不受控制

-g:指定gid,默认gid必须唯一,除非使用了-o选项

-K:修改/etc/login.defs中关于组相关的配置项。配置方式为KEY=VALUE,例如-K GID_MIN=100 -K GID_MAX=499

-o:允许创建一个非唯一gid的组

-r:创建系统组

25.passwd

passwd用于修改密码。默认 passwd 命令不允许为用户创建空密码。

passwd 命令修改密码前会通过 pam 认证用户,pam 配置文件中与此相关的设置项如下:

  • passwd password requisite pam_cracklib.so retry=3
  • passwd password required pam_unix.so use_authtok

一般用法:passwd options username

选项

-l:锁定指定用户的密码,在/etc/shadow 的密码列加上前缀"!"或"!!"。这种锁定不是完全锁定,使用ssh公钥还是能登录。要完全锁定,使用chage -E 0来设置帐户过期

-u:解锁-l锁定的密码,解锁的方式是将/etc/shadow的密码列的前缀"!"或"!!"移除掉。但不能移除只有"!"或"!!"的项

--stdin:从标准输入中读取密码

-d:删除用户密码,将/etc/shadow的密码列设置为空

-f:指定强制操作

-e:强制密码过期,下次登录将强制要求修改密码

-n:密码最小使用天数

-x:最大密码使用天数

-w:过期前几天开始提示用户密码将要过期

-i:设置密码过期后多少天,用户才过期。用户过期将被禁用,修改密码也无法登陆

26.chpasswd

以批处理模式从标准输入中获取提供的用户和密码来修改用户密码,可以一次修改多个用户密码。也就是说不用交互。适用于一次性创建了多个用户时为他们提供密码。

一般用法:chpasswd -e -c "user:passwd"

选项

-c:指定加密算法,可选的算法有DES,MD5,NONE,SHA256和SHA512

-e:passwd默认使用的是明文密码,如果要使用密文,则使用-e选项。参见man chpasswd

user:passwd为用户密码对,其中默认passwd是明文密码,可以指定多对,每行一个用户密码对。前提是用户是已存在的。

chpasswd会读取/etc/login.defs中的相关配置,修改成功后会将密码信息写入到密码文件中。

该命令的修改密码的处理方式是先在内存中修改,如果所有用户的密码都能设置成功,然后才写入到磁盘密码文件中。在内存中修改过程中出错,则所有修改都回滚,但若在写入密码文件过程中出错,则成功的不会回滚。

用法示例:

# 修改单个用户密码
echo "user1:123456" | chpasswd -c SHA512
# 修改多个用户密码
echo  -e 'usertest:123456\nusertest2:123456' | chpasswd
# 使用文件修改多个用户密码
cat /tmp/passwdfile
zhangsan:123456
lisi:123456
chapasswd -c SHA512 </tmp/passwdfile

27.chage

chage命令主要修改或查看和密码时间相关的内容。

选项

-l:列出指定用户密码相关信息

-E:指定账户(不是密码)过期时间,所以是强锁定,如果指定为0,则立即过期,即直接锁定该用户

28.userdell & groupdel

userdel命令用于删除用户。

userdel [options] login_name
-r:递归删除家目录,默认不删除家目录。
-f:强制删除用户,即使这个用户正处于登录状态。同时也会强制删除家目录。

一般不直接删除家目录,即不用-r,可以使用vim /etc/passwd将不需要的用户直接注释掉。

groupdel命令删除组。如果要删除的组是某用户的主组,需要先删除主组中的用户。

29.usermod

usermod用于修改用户账户属性信息。在执行此命令时,待修改的用户需要没有正在执行的进程。

usermod [options] login
选项说明:
-l:修改用户名,仅仅只是改用户名,其他的一切都不会改动(uid、家目录等)
-u:新的uid,新的uid必须唯一,除非同时使用了-o选项
-g:修改用户主组,可以是以gid或组名。对于那些以旧组为所属组的文件(除原家目录),需要重新手动修改其所属组
-m:移动家目录内容到新的位置,该选项只在和-d选项一起使用时才生效
-d:修改用户的家目录位置,若不存在则自动创建。默认旧的家目录不会删除
    如果同时指定了-m选项,则旧的家目录中的内容会移到新家目录
    如果当前用户家目录不存在或没有家目录,则也不会创建新的家目录
-o:允许用户使用非唯一的UID
-s:修改用的shell,留空则选择默认shell
-c:修改用户注释信息

-a:将用户以追加的方式加入到辅助组中,只能和-G选项一起使用
-G:将用户加入指定的辅助组中,若此处未列出某组,而此前该用户又是该组成员,则会删除该组中此成员

-L:锁定用户的密码,将在/etc/shadow的密码列加上前缀"!"或"!!"
-U:解锁用户的密码,解锁的方式是移除shadow文件密码列的前缀"!"或"!!"
-e:帐户过期时间,时间格式为"YYYY-MM-DD",如果给一个空的参数,则立即禁用该帐户
-f:密码过期后多少天,帐户才过期被禁用,0表示密码过期帐户立即禁用,-1表示禁用该功能

30.vipw和vigr

vipw和vigr是编辑用户和组文件的工具,vipw可以修改/etc/passwd和/etc/shadow,vigr可以修改/etc/group和/etc/gshadow,用这两个工具比较安全,在修改的时候会检查文件的一致性。

删除用户出错时,提示用户正在被进程占用。可以使用vi编辑/etc/paswd和/etc/shadow文件将该用户对应的行删除掉。也可以使用vipw和vipw -s来分别编辑/etc/paswd和/etc/shadow文件。它们的作用是一样的。

手动创建用户

手动创建用户需要全程使用管理员权限。

(1)添加用户组

在/etc/group 中添加用户所属组的相关信息。如果用户还有附加组则在附加组中加入该用户作为成员

(2)添加用户信息

在/etc/passwd 和/etc/shadow 中添加用户相关信息,此时家目录和密码还不存在,所以/etc/shadow的密码位使用"!!"代替

(3)创建家目录

mkdir /home/user_name
cp -r /etc/skel /home/user_home

(4)修改用户家目录以及子目录的所有者和属组

chown -R user_name:user_name /home/user_name

(5)修改用户家目录以及子目录的权限

chmod -R 700 /home/user_name

目前用户已经创建完成,只是没有密码,所以只能 su,不能登录

(6)生成密码

  • 使用 openssl passwd 生成密码,仅支持 MD5算法,缺点是容易破解
openssl passwd -1 -salt '123456' '123456' # -1指的是使用 MD5 算法
  • 使用 passwd 命令创建密码

一下是手动创建用户的过程

shell> mkdir /tmp/12;cp /etc/group /etc/passwd /etc/shadow /tmp/12/    # 备份这些文件
shell> echo "userX:x:666" >> /etc/group
shell> echo "userX:x:666:666::/home/userX:/bin/bash" >> /etc/passwd
shell> echo 'userX:!!:17121:0:99999::::' >> /etc/shadow
shell> cp -r /etc/skel /home/userX
shell> chown -R userX:userX /home/userX
shell> chmod -R go= /home/userX
shell> passwd --stdin userX <<< '123456'

如果是使用openssl passwd创建的密码。那么使用下面的方法将这部分密码替换到/etc/shadow中。

shell> field=$(tail -1 /etc/shadow | cut -d":" -f2)
shell> password=$(openssl passwd -1 -salt 'abcdefg' 123456)
shell> sed -i '$s%'$field'%'$password'%' /etc/shadow

31.finger 命令

finger命令用于查看用户信息

finger 命令

32.id 命令

id用于显示用户的 UID 和 GID

选项

-u:只获取 UID

-n:得到用户名而不是 uid

-z:无任何空白字符输出模式,默认格式下不可用

id命令

33.users 命令

user用于查看当前正在登录的用户名

34.last 命令

last用于查看最近登录的用户列表,实际上 last 查看的是/var/log/wtmp 文件

选项

-n:列出最近指定次数登录的用户

last 命令

35.lastb 命令

查看谁尝试登陆过但没有登录成功的。即能够审核和查看谁曾经不断的登录,可能那就是黑客。

选项

-n:只列出最近的n个尝试对象。

36.who 和 w 命令

用于查看登录的用户,以及登录用的的操作,w 查看的信息比 who 命令多

who 和 w 命令

w 第一行的信息:当前时间、已开机时长、当前在线用户、过去1、5、15分钟的平均负载。与uptime命令获取的信息完全一致。

37.lastlog 命令

lastlog用于查看登录用户的来源 IP

选项

-u:指定查看用户

lastlog 命令

38.su 命令

su用于切换用户或以指定用户运行命令。

su 默认不该改变当前目录,且仅设置 HOME 和 SHELL 这两个环境变量,如果目标用户时root,则还设置了 USER 和 LOGNAME 环境变量。

推荐使用 su 命令搭配--login 选项避免环境变量混乱

su [options...] [-] [user [args...]]
选项说明:
-c command:使用-c选项传递要指定的命令到shell上执行。使用-c执行命令会为每个su都分配新的会话环境
-, -l, --login:启动shell作为登录的shell,模拟真正的登录环境。它会做下面几件事:
                1.清除除了TERM外的所有环境变量
                2.初始化HOME,SHELL,USER,LOGNAME,PATH环境变量
                3.进入目标用户的家目录
                4.设置argv[0]为"-"以便设置shell作为登录的shell
                  使用--login的su是交互式登录。不使用--login的su是非交互式登录(除不带任何参数的su外
-m, -p, --preserve-environment:保留整个环境变量(不会重新设置HOME,SHELL,USER和LOGNAME),
                                保留环境的方法是新用户shell上执行原用户的各配置文件,如~/.bashrc。
                                当设置了--login时,将忽略该选项
-s SHELL:运行指定的shell而非默认shell,选择shell的顺序优先级如下:
                1.--shell指定的shell
                2.如果使用了--preserve-environment,选择SHELL环境变量的shell
                3.选项目标用户在passwd文件中指定的shell
                4./bin/sh

若su没有给定任何参数,将默认以root身份运行交互式的shell(交互式,所以需要输入密码),即切换到root用户,但只改变HOME和SHELL环境变量。

su - username是交互式登录,要求密码,会重置整个环境变量,它实际上是在模拟真实的登录环境。

su username是非交互登录,不会重置除HOME/SHELL外的环境变量。

在某些环境下或脚本中,可能需要临时切换身份执行命令,注意这时候的环境变量是否会改变,否则很可能报错提示命令找不到。

39.sudo和 sudoedit 命令

sudo可以让一个用户以某个身份(如root或其他用户)执行某些命令,它隐含的执行方式是切换到指定用户再执行命令,因为涉及到了用户的切换,所以环境变量是否重置是需要设置的。

sudo支持插件实现安全策略。默认的安全策略插件是sudoers,它是通过/etc/sudoers或LDAP来配置的。

安全策略是控制用户使用sudo命令时具有什么权限,但要注意,安全策略可能需要用户进行身份认证,如密码认证的机制或其他认证机制,如果开启了认证要求,则在指定时间内未完成认证时sudo会退出,默认超时时间为5分钟。

安全策略支持对认证进行缓存,使得在一定时间内该用户无需再次认证就可以执行sudo命令,默认缓存时间为5分钟,sudo -v可以更新认证缓存。

sudo支持日志审核,可以记录下成功或失败的sudo。

当sudo执行指定的command时,它会调用fork函数,并设置命令的执行环境(如某些环境变量),然后在子进程中执行command,sudo的主进程等待命令执行完毕,然后传递命令的退出状态码给安全策略并退出。

sudoedit等价于sudo -e,它是以sudo的方式执行文件编辑动作。

sudo [options] [command]
选项说明:
-b             :(background)该选项告诉sudo在后台执行指定的命令。
                   注意,如果使用该选项,将无法使用任务计划(job)来控制维护这些后台进程,
                   需要交互的命令应该考虑是否真的要后台,因为可能会失败
-l[l] [command]:当单独使用-l选项时,将列出(list)用户可执行和被禁止的命令。
                          当配合command时,且该command是被允许执行的命令,将列出命令的全路径及该命令参数。
                          如果command是不被允许执行的,则sudo直接以状态码-1退出。
                          可以指定多个字母"l"来显示更详细的格式
-n             :使得sudo变成非交互模式,但如果安全策略是要求输入密码的,则sudo将报错
-S             :(stdin)该选项使得sudo从标准输入而非终端设备上读取密码,给定的密码必须在尾部加上换行符
-s [command]   :(shell)指定要切换到的shell,如果给定command,则在此shell上执行该命令
-U user        :(other user)配合-l选项来指定要列出哪个用户的权限信息
-u user        :(user)该选项明确指定要以此处指定的用户而非root来运行command。
                     若使用uid的方式指定用户,则需要使用"#uid",但很多时候可能需要对"#"使用"\"转义,即使用"\#uid"
-E               :(environment)该选项告诉sudo在执行命令时保留自己的环境变量,保留环境变量的方式是执行环境配置文件。
                     但因为跨了用户,所以很可能某些家目录下的环境配置文件会因为无权限而执行失败,此时sudo将报错   
-k [command]   :当单独使用-k选项时,sudo将使得用户的认证缓存失效。下次执行sudo命令需要输入密码。
                           当配合command时,-k选项将忽略用户的缓存,所以sudo将要求用户输入密码,但这次输入密码不会更新认证缓存
                           但执行-k选项本身,不需要密码
-K             :(sure kill)类似于-k选项,但它会完全移除用户的认证缓存,且不会配合command,执行-K本身不需要密码
-v             :(validate)该选项使得sudo更新用户认证缓存
--             :暗示sudo命令行参数到此结束

在sudo上可以直接设置环境变量,它会传递为command的环境。设置的方式为var=value,如LD_LIBRARY_PATH=/usr/local/pkg/lib

由于sudo默认的安全策略插件是sudoers,所以当用户执行sudo时,系统会自动去寻找/etc/sudoers文件(该文件里被root配置了用户对应的权限,也即安全策略),查看sudo要使用的用户是否有对应的权限,如果有则执行,如果没有权限就失败退出sudo。

参考链接

http://www.cnblogs.com/f-ck-need-u/p/7011460.html

http://www.cnblogs.com/f-ck-need-u/p/7011669.html#auto_id_1

https://www.cnblogs.com/hazir/p/sudo_command.html

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券