Linux-UserManagement
管理员/虚拟用户/普通用户UID范围
Root用户UID = 0
虚拟用户UID范围: (CentOS7)1 ~ 999; (CentOS6) 1 ~ 499。
普通用户UID范围 >= 1000。
虚拟用户是没办法使用shell prompt的,原因如下(以CentOS7为例)
1 | awk '/nologin/{print}' /etc/passwd |
passwd文件中最后一个冒号(:)后接的shell prompt,很明显这些用户是无法使用shell登录的。
用户管理
用户创建
1 | useradd 用户名 |
When we run ‘useradd’ command in Linux terminal, it performs following major things:
- It edits /etc/passwd, /etc/shadow, /etc/group and /etc/gshadow files for the newly created User account.
- Creates and populate a home directory for the new user.
- Sets permissions and ownerships to home directory.
-The Complete Guide to “useradd” Command in Linux - 15 Practical Examples
创建虚拟用户的方法
-M
- 不创建家目录
-s
- 指定使用的shell的路径
1 | useradd violet -M -s /sbin/nologin |
创建的虚拟用户UID数值是大于等于1000。
-u
- 指定创建的用户的UID
-g
- 指定创建的用户的主组
-G
- 指定创建的用户的次要组(附加组)
-c
- 指定创建的用户的用户注释说明信息
1 | useradd violet06 -u 1009 |
1 | useradd violet06 -u 1009 -g violet05 |
1 | useradd violet06 -u 1009 -G violet05 |
1 | useradd violet06 -c "manage db" |
-p
指定创建的用户的密码(这个密码应该是加密后的密码)对useradd -p的解释_weixin_34174132的博客-CSDN博客
https://blog.csdn.net/weixin_34174132/article/details/91539386
1 | # grep 'violet' /etc/shadow |
比如"123456"密码的加密后的密码是第一个冒号和第二个冒号之间的字符串
1 | $6$QNUo3m1i$bL3EAkJn8sUXEE581lVxZ9/fbgcKyFkQQ/5edq7JtUdYO.00qen5QxtiHFFO4LbDpGy0hux4giBfg6Fr1K2Z./ |
那么useradd -p应该这样使用
1 | useradd violet06 -p '$6$QNUo3m1i$bL3EAkJn8sUXEE581lVxZ9/fbgcKyFkQQ/5edq7JtUdYO.00qen5QxtiHFFO4LbDpGy0hux4giBfg6Fr1K2Z./' |
接下来就可以输入用户名violet06,密码为123456。由此这个’-p’参数设置密码麻烦,不推荐使用,还是使用passwd命令比较好。
用户删除
1 | userdel USER |
注意:如果被删除的用户的用户主组还加入了其他用户,那么这个主组是无法删除的。举例如下:
1 | useradd violet02 |
可以从例子中看到,可以删除该用户,但该用户的主组无法删除。
上面例子中,用户的家目录未被删除。
接着上个例子创建被删除的用户
1 | useradd violet02 |
可见如果想要再次创建被删除的用户,需要在使用useradd命令时指定主组。
在删除用户时,最好指定’-r’删除:
-r
- 删除用户信息的同时,删除家目录和邮件目录(mail spool)。
在使用该选项前,请注意为备份家目录和邮件目录建立必要的备份。
用户切换
普通用户切换用户:
1 | su - 用户名 # 切换到某个用户 |
退出切换的用户:
1 | exit |
# - 表示管理员身份
$ - 表示普通用户身份
登录用户检测
whoami - 该命令可以用于打印当前登录的用户是谁
比如,
1 | whoami |
who - 该命令用于检查所有登录的用户,并将其打印出来
打印格式为: [用户名称] [终端] [登录时间]
注意[终端]的格式有两种:
- ttyn。比如tty1, tty2, …
- pts/n。比如pts/0, pts/1, …
tty和pts的区别可以参考linux - Difference between pts and tty - Unix & Linux Stack Exchange。
tty: native terminal device(本地终端设备)。比如,你就在服务器上登录了系统,没有利用任何远程方式,从物理上,服务器和你是"无距离"的。pts: pseudo terminal slave(伪终端从设备)。比如利用ssh或xterm连接的终端。你可以理解你利用XShell远程登录你的Linux
,那么在这整个XShell就是一个伪终端从设备。"伪"体现在你可以远程操作Linux,就仿佛你在服务器身边真正操作它一样。
比如
1 | who |
用户信息修改
- usermod命令
-s - 修改用户的登录方式
-g - 修改用户的主要的组信息
-G - 修改用户的附属组信息
-c - 修改用户的注释信息
用户信息查看
- id命令
用于显示用户信息。用户打印有效用户的UID, GID和组,对于不存在的用户,该命令会提示形如"id 查询的用户名: no such user"的错误信息
应用 - 查询用户UID,GID,GROUPS
1 | id violet |
应用 - 检查用户是否存在
1 | id violet100 |
- w命令
1 | w |
列明 | 简明描述 | 描述 |
---|---|---|
USER | 用户名称 | 用于显示使用当前终端的用户名称 |
TTY | 终端 | 用于显示登陆终端的类型(tty/pts) |
FROM | 登录IP | 用户登录到哪个IP地址 |
LOGIN@ | 登录时间 | 用户登录的时间 |
IDLE | 空闲时间 | 用户上次使用终端进行操作的时间 |
JCPU | 所有进程使用时长 | 与用户登录的终端相关的所有进程的使用时长 |
PCPU | 当前进程使用时长 | 用户当前使用的进程(该进程信息在WHAT列有显示)的使用时长 |
WHAT | 当前进程信息 | 用户当前使用的进程和相关选项或参数。 |
- last命令
用于显示用户上次登录信息
1 | last |
- lastlog命令
用于显示所有用户最近登录的信息
1 | lastlog |
密码设置
用户设置密码
1 | passwd 用户名 # 修改指定用户的密码 |
- passwd命令
交互式设置密码的方法:
1 | passwd USER |
为violet用户设置密码,密码需要输入两次
1 | passwd violet |
非交互式设置密码的方法:(不安全,因为通过history命令可查看到明文)
1 | echo PASSWORD | passwd --stdin USER |
比如为violet用户设置密码为123456:
1 | echo 123456 | passwd --stdin violet |
用户组管理
主组和次要组的区别
这个问题可以参考Linux Users and Groups | Linode。下面给出我参考的理解:
由于一个用户可以有多个组,肯定有一个组为主组(Primary Group),其他为次要组(Secondary Groups)。
- 主组
通过"man usermod"查看命令使用手册时,主组的英文名为Initial login group,大部分老外也会称主组为Primary group。
先看看主组。主组就是默认组,对每一个新创建的用户来说,如果你不使用’-G’或’-g’指定用户归属哪个组,该用户会归属于与用户名称同名的组,而这个组就是默认组。如何查看一个用户的主组呢?
1 | id violet |
"gid=1000(violet)"表示该用户的主组id值为1000,主组的名称为violet。
- 次要组(附加组)
次要组的英文名称为Supplementary groups或Secondary groups。
1 | id violet |
"groups=1000(violet),1007(flower)"中"groups"表示这个用户(violet)所属的组有哪一些。可以看到该用户属于两个组,一个violet组,一个flower组,通过"gid=1000(violet)"确定主组为violet,那么flower则为次要组。
- 那么一个用户的默认组有什么用呢?
- 当用户登录Linux时,都会有一个与之关联的用户组,这个组就是默认组。
- 除此之外,如果用户创建文件或目录,那么这个文件或目录都会关联上所属人(owner)和与用户主组的信息,比如
1 | ll -d /root |
root目录和root目录下的test目录的所属人就是root用户,并且其默认组为root组。
- 而且,通过id命令也可以看到主组的信息:
1 | id root |
"gid=0(root)"可以看出主组为root
再用id命令举个例子
1 | id violet |
在这个例子中,"gid=1007(flower)"可得知violet用户的主组是flower,它的次要组有games, violet,它所属的组有flower, games, vioelt。
用户加入一个组
Reference: Usermod Command in Linux | Linuxize.
-a -G
- 为用户增添一个组。添加成功后可以在/etc/group中查看组内用户的信息。
语法格式如下
1 | GROUP:当group有多个时,应该有逗号进行分割,而不是空格。 |
violet用户加入games组的实例如下
1 | id violet |
games:x:20:violet
表示games组中gid=20,该组中用户有violet。
用户退出一个组
-d
- 在用户组中删除指定用户
语法格式如下
1 | gpasswd -d USER GROUP |
用户退出一个组的正确步骤:
- 利用id检查退出的组是否为主组,若退出的组为主组,需要先修改主组为次要组,否则进行下一步
- 使用"gpasswd -d USER GROUP"退出组。
violet用户退出games组(其中games为主组)的实例
1 | id violet |
特别注意: 用户无法删除从主组中退出,若要删除主组,需要先将主组降为次要组后,再使用gpasswd退出组,否则就会出现错误提示。虽然/etc/group显示用户退出了主组,实际上用户violet创建文件所属的组扔为原来的主组。例子如下
1 | id violet |
看到/etc/group中violet的组信息并不是games:x:20:violet
,可见violet已经退出了主组。但是在violet用户的Shell prompt上创建文件时,文件所属的组还是原来的games主组:
1 | [violet ~]$ touch test.txt |
正确的用法
1 | [root@localhost ~]# id violet |
修改用户的主组
修改主组
-g
- 强制改变用户的主组
语法格式如下
1 | usermod -g GROUP USER |
由于该命名是强制改变用户的主组,因此改变用户的主组,先确定用户是否加入了指定的组。
举例,若要修改violet用户的主组为flower组,但是violet用户并没加入flower组,先让violet用户加入flower组:
1 | id violet |
可以看到若violet用户所属的组中并没有flower的话,添加了主组为flower后,其所属的组也多了个flower。
添加用户备注信息
-c
- 添加用户备注信息,这个备注是关于GECOS (the full name of the user)的信息,备注信息会添加到/etc/passwd
1 | usermod -c "GECOS Comment" USER |
-d
- 改变用户的家目录,原来家目录的内容不会移动到新的家目录
-m
- 配合’-d’使用,改变家目录的同时,原家目录内容也会迁移到新的家目录。
1 | By default, the command doesn’t move the content of the user’s home directory to the new one. |
-s
- 改变用户默认的shellThe default shell is the shell that is run after you log in to the system. By default, on most Linux systems, the default shell is set to Bash Shell.
You can find out what shells are available on your system by displaying the
/etc/shells
file’s content.
1 | SHELL:其他shell的绝对路径 |
-u
- 改变用户UID
1 | usrmod -u UID USER |
-l
- 改变用户名称
1 | NEW_USER: 新用户名称 |
-e
- 改变用户到期时间,当当前时间到了到期时间时,用户会被关闭。到期时间存储在/etc/shadow
1 | usermod -e DATE USER |
查询用户到期时间
1 | chage -l USER |
-L
- 锁定用户。The commands will insert an exclamation point (
!
) mark in front of the encrypted password. When the password field in the/etc/shadow
file contains an exclamation point, the user will not be able to login to the system using password authentication. Other login methods, like key-based authentication or switching to the user are still allowed. If you want to lock the account and disable all login methods, you also need to set the expiration date to 1.
1 | usermod -L USER |
-U
- 解锁用户
1 | usermod -U USER |
用户授权
背景:普通用户在运行命令时,可能会出现"Permission denied"的情况,这时候需要申请root授权。
普通用户获得权限的方式
- su切换root用户
- 让root用户通过chmod修改要目标文件或目录的权限
- sudo
- 设置特殊权限位
su - root和su root的区别?
"su - root"是切换到root账号使用,使用的是root用户的环境变量;
"su root"则是取得root的特权,以root的身份执行程序,但保留原来用户环境。
说明:有些命令即使你使用"su root"切换到root用户,仍无法执行,所以切换到root用户时,建议使用"su - root"。
与普通用户violet有关的环境变量,例子如下:
env命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令。
1 | [violet@localhost ~]$ env | grep 'violet' |
取得root权限时:
1 | [violet@localhost ~]$ su root |
切换到root用户时:
1 | [violet@localhost ~]$ su - root |
可以看到"su - root"切换到root用户后,PATH路径下有一个/root/bin
sudo配置
1 | sudo -l # 查看当前用户的特权信息 |
sudo配置文件编辑
visudo - 相等于"vi /etc/sudoers"。但是使用visudo有一个语法检查的功能。
1 | visudo -c # 提示编辑的文件是否符合语法规则 |
在root用户下输入visudo
1 | visudo |
进入vim跳转到93行(键盘按下"93GG"即可跳转)
授权用户权限的格式如下:
1 | [用户名] [网络中的主机]=[执行命令的目标用户] [执行的命令范围] |
- 授予用户指定命令的执行权限
1 | violet ALL=(ALL) /bin/ls, /bin/touch |
上述例子授予violet用户ls和touch命令root权限。
这样violet普通用户可以通过sudo ls命令查看处于权限限制下目录的文件列表,例子如下
1 | [violet@localhost ~]$ ls /root |
- 授予大量命令,并排除指定命令
1 | violet ALL=(ALL) /bin/*, ! /bin/vi |
或者
1 | violet ALL=(ALL) /usr/bin/*, /usr/sbin/*, !/bin/vi, !/usr/sbin/visudo |
批量授予给普通用户大量命令时,切记不能让普通用户拥有修改sudo配置文件的权利!
- 授予用户使用命令不需要密码
1 | violet ALL=(ALL) NOPASSWD: ALL |
ALL表示violet用户可以执行所有需要root权限的命令时,都不需要密码,这样的做法很危险。
1 | violet ALL=(ALL) NOPASSWD: /usr/bin/*, /usr/sbin/*, !/bin/vi, !/usr/sbin/visudo |
violet用户可以执行上述"bin和sbin"目录的文件时,都不需要密码.