摘要:Linux
,useradd
,passwd
,/etc/passwd
,/etc/shadow
,/etc/sudoers
,~/.profile
,~/.bashrc
Linux用户和用户组管理
(1)Linux多用户多任务
Linux/Unix是一个多用户多任务
的操作系统;多用户通过SSH客户端工具等远程工具等远程登录服务器来进行,只要具有相关用户的权限,任何人都是可以上去操作访问服务器,每个用户可以同时开启很多的服务任务和进程。
(2)Linux系统用户角色划分
用户在系统中是分角色的,在Linux系统中,由于角色的不同,权限和所完成的任务也不同,用户的角色是通过UID
(用户ID)和GID
(组ID)识别的;特别是UID,一个UID是唯一标识
一个系统用户的账号,用户角色分为超级用户
,程序用户
,普通用户
,三种的UID范围如下
- 超级用户,UID:0,root,其UID和GID均为0。在每台unix/linux操作系统中都是唯一且真实存在的,通过它可以登录系统,可以操作系统中任何文件和命令,拥有最高的管理权限。在生产环境,一般禁止root账号远程登录SSH连接服务器,以加强系统安全
- 程序用户:UID:1~499,这类用户是安装系统后默认就会存在的,且默认情况不能登录系统,它们是系统正常运行必不可少的
- 普通用户:UID:500~65535,这类用户一般是由具备系统管理员root的权限的运维人员添加的
(3)用户和用户组
-
用户
:每一个用户都有一个唯一的用户名
和用户口令
,在登录系统后,只有正确输入了用户名和密码,才能登录系统和相应的目录,当该用户需要超级用户权限时,可以通过sudo
命令方式来执行仅有root权限才允许执行的权限。sudo权限要尽量的小,能不用root就不用root -
用户组
:linux系统中的用户组(group)就是具有相同特性的用户(user)集合
;有时我们需要让多个用户具有相同的权限,只需要把授权的用户都加入到同一个用户组里,然后通过修改该文件或目录的对应的用户组的权限,让用户组具有符合需求的操作权限,这样用户组下的所有用户对该文件或目录就会具有相同的权限,这就是用户组的用途
(4)用户和用户组的对应关系
用户和用户组的对应关系有:一对一
、一对多
、多对一
和多对多
- 一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。比如,root。
- 一对多:即一个用户可以存在多个组中,这个用户就具有这些组。
- 多对一:即多个用户可以存在一个组中,这些用户这些组的共同权限。
- 多对多:即多用户可以存在于多个组中。并且几个用户可以归属相同的组;其实多对多的关系是前面三条的扩展
(5)用户及用户组配置文件介绍
Linux系统中下的账户文件主要有/etc/passwd
、/etc/shadow
、/etc/group
、/etc/gshadow
四个文件
- /etc/passwd:用户管理文件,记录用户账户的基本信息
- /etc/shadow:用户管理文件,将/etc/passwd 文件中的
加密口令
移动到/etc/shadow中,而后者只对超级用户root可读,增加系统安全性 - /etc/group:用户组管理文件,
- /etc/gshadow:用户组密码管理文件,将/etc/group 文件中的
加密口令
移动到/etc/gshadow中,而后者只对超级用户root可读,增加系统安全性
以/etc/passwd为例看一下文件内容,观察/etc/passwd权限为所有用户可读,root用户可写
(base) root@VM-16-11-ubuntu:~# ll /etc/passwd
-rw-r--r-- 1 root root 1806 Oct 30 11:57 /etc/passwd
/etc/passwd文件中每行定义一个用户账号,有多少行就表示多少个账号,在一行中内容之间又通过:
号划分了7个字段,这7个字段分别定义了账号的不同属性,passwd文件实际内容如下
(base) root@VM-16-11-ubuntu:~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
lighthouse:x:1000:1000::/home/lighthouse:/bin/bash
xiaogp:x:1001:1001::/home/xiaogp:/bin/bash
mysql:x:113:116:MySQL Server,,,:/nonexistent:/bin/false
各字段含义如下
字段1(xiaogp):帐号名,这是用户登陆时使用的账户名称,在系统中是唯一的,不能重名
字段2(x):密码占位符x;早期的unix系统中,该字段是存放账户和密码的,由于安全原因,后来把这个密码字段内容移到/etc/shadow中了
字段3(1001):UID,范围是0-65535
字段4(1001):GID;范围是0-65535;当添加用户时,默认情况下会同时建立一个与用户同名
且UID和GID相同
的组
字段5(空):用户说明;这个字段是对这个账户的说明
字段6(/home/xiaogp):宿主目录;用户登陆后首先进入的目录,一般与/home/用户名
这样的目录
字段7(/bin/bash):登录的Shell, 当前用户登陆后所使用的shell,在centos/rhel系统中,默认的shell是bash
再看一下用户密码管理文件/etc/shadow,该文件的权限为root可读可写,其他非shadow用户组的用户没有可读权限
(base) root@VM-16-11-ubuntu:~# ll /etc/shadow
-rw-r----- 1 root shadow 1164 Oct 31 13:10 /etc/shadow
再看下内容,同样根据:
分割
(base) root@VM-16-11-ubuntu:~# cat /etc/shadow
root:!:17751:0:99999:7:::
daemon:*:17737:0:99999:7:::
bin:*:17737:0:99999:7:::
lighthouse:!:18929:0:99999:7:::
xiaogp:$6$fBSvKJTY$Rft1wTRJAzEOARW87el2vl8UX5XCHLv5yfPDfkk4jRPceY3vHJBrh1DlvKi2L9.48PU3gNkVMUyq4pbqXzgWK1:18929:0:99999:7:::
mysql:!:18930:0:99999:7:::
各字段含义如下
字段1(xiaogp):帐号名称
字段2($6$fBSvKJTY$Rft1wTRJAzEOARW87el2vl8UX5XCHLv5yfPDfkk4jRPceY3vHJBrh1DlvKi2L9.48PU3gNkVMUyq4pbqXzgWK1):加密的密码
字段3(18929):最近更改密码的时间;从1970/1/1到上次修改密码的天数
字段4(0):禁止修改密码的天数;从1970/1/1开始,多少天之内不能修改密码,默认值为0
字段5(99999):用户必须更改口令的天数;密码的最长有效天数,默认值为99999
字段6(7):警告更改密码的期限;密码过期之前警告天数,默认值为7;在用户密码过期前多少天提醒用户更改密码
字段7(空):不活动时间;密码过期之后账户宽限时间 3+5;在用户密码过期之后到禁用账户的天数
字段8(空):帐号失效时间,默认值为空;从1970/1/1日起,到用户被禁用的天数
字段9(空):保留字段(未使用)
查看用户和用户组
当前用户直接在/bin/bash的Shell的开头展示,显示为用户名@主机名
,比如现在ubuntu用户
(base) ubuntu@VM-16-11-ubuntu:~$
还可以使用whoami
打印出当前登录是哪个用户
(base) ubuntu@VM-16-11-ubuntu:~$ whoami
ubuntu
可以使用w
命令打印出当前服务器登录的用户和远程主机IP,登录时间等信息
(base) ubuntu@VM-16-11-ubuntu:~$ w
15:17:41 up 2 days, 1:23, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xiaogp pts/0 114.243.170.211 12:10 2:06m 0.10s 0.01s sshd: xiaogp [priv]
xiaogp pts/1 114.243.170.211 13:51 1:26m 0.02s 0.02s -bash
xiaogp pts/2 114.243.170.211 14:37 2.00s 0.09s 0.00s sshd: xiaogp [priv]
ubuntu pts/3 114.243.170.211 15:15 1:57 0.01s 0.01s -bash
在知道用户之后可以查看当前用户所在的用户组,使用groups
或者id
命令
(base) ubuntu@VM-16-11-ubuntu:~$ groups `whoami`
ubuntu : ubuntu adm cdrom sudo dip plugdev lpadmin sambashare
冒号后面的就是所属的用户组
(base) ubuntu@VM-16-11-ubuntu:~$ id ubuntu
uid=500(ubuntu) gid=500(ubuntu) groups=500(ubuntu),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),114(sambashare)
groups后面就是所属的用户组
再看root用户可见root所属root组,是一对一的关系
(base) ubuntu@VM-16-11-ubuntu:~$ id root
uid=0(root) gid=0(root) groups=0(root)
添加/删除用户和用户组
添加用户使用useradd
命令,可以使用从那时-s
指定shell,-p
指定登录密码,-g
指定用户组列表,默认会生成一个同名和group,必须以root权限操作
(base) ubuntu@VM-16-11-ubuntu:~$ useradd test -s /bin/bash
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.
切换到root用户
(base) ubuntu@VM-16-11-ubuntu:~$ sudo -s
(base) root@VM-16-11-ubuntu:~# useradd -s /bin/bash -m test
-
-s
:指定用户登录的shell,如果不指定可能没有用户名@主机名的shell -
-m
:新建用户同时在/home下创建用户同名的根目录,如果不指定则没有根目录
设置密码,在新建了用户之后直接使用passwd
设置,必须设置了密码之后才能用其他普通用户登录,否则只能在root下进入
(base) root@VM-16-11-ubuntu:~# passwd test
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
(base) root@VM-16-11-ubuntu:~#
切换到test用户,登录的目录是test的根目录/home/test
(base) root@VM-16-11-ubuntu:~# exit
exit
(base) ubuntu@VM-16-11-ubuntu:~$ su - test
Password:
test@VM-16-11-ubuntu:~$
test@VM-16-11-ubuntu:~$ pwd
/home/test
看下/etc/passwd下多了用户test,uid,gid都是1002
test@VM-16-11-ubuntu:~$ less /etc/passwd |grep test
test:x:1002:1002::/home/test:/bin/bash
看下test用户的用户信息,test输出test组
test@VM-16-11-ubuntu:~$ id test
uid=1002(test) gid=1002(test) groups=1002(test)
如果忘记了test用户的密码,可以在root下直接使用passwd覆盖之前的密码
test@VM-16-11-ubuntu:~$ exit
logout
(base) ubuntu@VM-16-11-ubuntu:~$ sudo -s
(base) root@VM-16-11-ubuntu:~# passwd test
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
(base) root@VM-16-11-ubuntu:~# exit
exit
(base) ubuntu@VM-16-11-ubuntu:~$ su - test
Password:
test@VM-16-11-ubuntu:~$
下一步删除该用户,使用userdel
命令
(base) root@VM-16-11-ubuntu:/home# userdel test
加上-r
可以彻底删除,此时用户根目录及文件将被删除,再次查看/etc/passwd已经没有test这一行
从新用户切换到root
下面用新用户test切换到root权限下,发现test不在sudoers文件中,不被允许sudo
test@VM-16-11-ubuntu:~$ sudo -s
[sudo] password for test:
test is not in the sudoers file. This incident will be reported.
下面来介绍以下/etc/sudoers
这个文件,当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限,确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认,若密码输入成功,则开始执行sudo后续的命令,先简单地看一下/etc/sudoers是个啥
test@VM-16-11-ubuntu:~$ ll /etc/sudoers
-r--r----- 1 root root 860 Oct 30 09:06 /etc/sudoers
尼玛还是个root文件,果断切换root看之,直接看最后两行是现有的两个普通的用户
lighthouse ALL=(ALL) NOPASSWD: ALL
ubuntu ALL=(ALL:ALL) NOPASSWD: ALL
再加一行使得test用户在所有计算机上
test ALL=(ALL:ALL) ALL
第一列::test指定要操作的用户
第二列:ALL代表所有计算机
第三列:ALL:ALL代表所有用户
第四列:ALL代表所有操作
合在一起就是允许test用户在所有计算机上以所有用户身份运行所有命令,如果加入NOPASSWD
则切入root不需要输入密码,再次sudo到root,输入密码成功
test@VM-16-11-ubuntu:~$ sudo -s
[sudo] password for test:
root@VM-16-11-ubuntu:~#
新用户的环境变量配置
test用户在根目录/home/test下生成~/.profile
和~/.bashrc
(base) test@VM-16-11-ubuntu:~$ ll
total 32
drwxr-xr-x 2 test test 4096 Oct 31 21:38 ./
drwxr-xr-x 6 root root 4096 Oct 31 20:08 ../
-rw------- 1 test test 827 Oct 31 21:38 .bash_history
-rw-r--r-- 1 test test 220 Apr 5 2018 .bash_logout
-rw-r--r-- 1 test test 3555 Oct 31 21:37 .bashrc
-rw------- 1 test test 31 Oct 31 21:36 .lesshst
-rw-r--r-- 1 test test 807 Apr 5 2018 .profile
在刚登录Linux时,首先启动/etc/profile 文件,然后再启动用户目录下的 /.bash_profile、/.bash_login或 /.profile文件中的其中一个,执行的顺序为:/.bash_profile、~/.bash_login、 ~/.profile,看下.profile文件
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
其中这段会调用根目录下的.bashrc的文件,因此要修改test用户的环境变量直接复制其他一个永不的即可
root@VM-16-11-ubuntu:~# cp /home/ubuntu/.bashrc /home/test/
网友评论