由于实验室几个老师的学生要共同使用一台服务器,所以需要规范一下服务器的使用,并且给各位学生配置相关的用户和权限,之前一直都是自己用,所以借此机会学习和总结一下Linux服务器的用户管理与权限管理。
用户与用户组
根用户——root用户
在Ubuntu下,终端提示符里$表示普通管理员,#表示系统管理员(也就是root用户),root用户默认是没有密码的,启用root用户,就需要给root用户设置密码,命令如下:
$ sudo passwd root
系统会先验证当前普通管理员的密码,然后要求输入两次root用户的密码,之后就可以进入root用户了,关于用户和权限的管理,最好是在root用户下操作。进入root用户下的命令如下:
$ su root
输入密码后就进入root用户了。
用户组创建与删除
很多时候在创建新用户的时候,希望把一些用户归为一个组,以便后续的管理,例如我就打算把学生的账号都放到StudentGroup里面去,在Ubuntu中,一个用户是可以同时在几个组里面的,会指定一个主要组。
- 1.查看用户所在组情况
可以通过id
命令查看当前用户或通过id user1
来查看用户user1的用户组情况,例如:
id user1
uid=1001(user1) gid=1001(userGroup) groups=1001(userGroup),4(adm),27(sudo)
上面的命令可以看到,id user1
命令的结果为显示用户名及id(uid),显示用户所在主组(gid),显示用户所在的组列表(groups),这里例子中,用户user1所在的主组为userGroup,同时也在adm,sudo用户组中。
- 2.创建用户组
创建用户组的命令是groupadd
,普通管理员需要加sudo来执行,root用户不用。具体命令语法如下:
$ sudo groupadd [options] GroupName
其中的选项可以通过命令groupadd --help
来查看,一般用的不多,就不细说了,需要的自己看。
- 3.删除用户组
删除用户组的命令语法如下:
$ sudo groupdel GroupName
- 4.修改用户组信息
修改用户组的命令语法如下:
$ sudo groupmod [options] GroupNameOld
其中的选项可以通过命令groupmod --help
来查看,常用的主要是以下两个:
-g NewID:为GroupNameOld用户组指定新的组id
-n NewGroupName:为GroupNameOld用户组指定新的组名称
例如下面一条命令:
$ sudo groupmod -g 10001 -n group2 group1
即为将用户组group1改名为group2,同时组id设置为10001。
- 4.用户组管理
用户组管理的命令是gpasswd
,通常用来给用户组添加或移除用户,其基本语法如下:
gpasswd [option] GroupName
可以通过gpasswd --help
来查看选项列表,其中常用的选项有:
-a
:添加用户到该用户组,例如下面命令:
gpasswd -a user1 Group2 #将用户user1添加到用户组Group2中;
-d
:从用户组移除用户,例如下面命令:
gpasswd -d user1 Group1 #将用户user1从用户组Group1中移除;
少部分Ubuntu发行版中没有gpasswd命令,但是其功能可以用更为常用的usermod
来完成(详见下面的用户管理)。
创建新用户
创建新用户可以用两个命令,一个是adduser
,一个是useradd
,这两个命令一个是通过系统提示配置密码等信息由系统以默认目录配置创建用户(adduser
,会把用户主目录建立在\home目录下,仅配置密码和一些用户信息,其他的配置如权限用户组等都是默认的);一个是用户自己通过参数配置来添加用户(useradd
,可以自行输入参数来确定用户的主目录、用户组等配置)
为了避免搞混这两个命令,我是这么记的:
(系统)添加用户——System add user,add在前,user在后,由系统自动完成,system省略了,所以是adduser;
用户添加(用户)——User add user,用户添加用户,可以自定义参数配置,省略后面的users,所以是useradd。
- 使用
adduser
:
在普通管理员权限下,需要加sudo来执行命令:
$ sudo adduser UserName
在root用户下,可以不加sudo直接执行。
之后,系统会提示输入并二次确认用户名的密码,设置完成后,会默认建立一个新的用户组以及在\home目录下创建新的用户目录\home\abc\。最后会要求为新用户设置信息(全名、电话等),一路回车不用管这些都可以。
- 使用
useradd
:
useradd
命令的基本语法是:
useradd [options] UserName
可以使用useradd --help
来查看系统给出的帮助文档。常用的选项如下(注意严格区分大小写):
-d DirPath:指定DirPath为新用户的主目录;
-m:不需要带值,与-d合用,表示当上述DirPath目录不存在时,创建目录DirPath;
-g GroupName:指定新用户主要所在的用户组(指定的组不存在时会报错,需要先创建用户组;
-G GroupName1 GroupName2:指定新用户所在的用户组(可以列出多个);
-s ShellPath:指定用户的登录shell为文件ShellPath。
例如下面这一条命令:
useradd -d /media/StudentGroup/stu1/ -m -g StudentGroup -G adm,root stu1
创建用户stu1,主用户组为StudentGroup(需要提前创建好),同时也属于用户组adm和root,主目录为/media/StudentGroup/stu1/。这样创建好的用户是没有密码的,可以在root用户下给它设置密码(passwd stu1
命令,详见后面的用户修改部分)。
这里要注意一点,这样操作的时候,需要先手动创建目录/media/StudentGroup/或者确保这个目录存在,因为这条命令中的创建目录是不支持多级目录同时创建的,好像mkdir这个命令也是?
修改用户
1.配置相关
修改用户的配置需要在root用户下或者管理员权限,命令的基本语法如下:
usermod [options] UserName
具体的选项可以参考usermod --help
,常用的选项和useradd
类似,这里需要注意的有两个:
- 一个是
-m
选项,在修改用户配置的时候,同样需要和-d
选项合用,此时的-m
选项就不是创建用户主目录了,而是移动旧用户主目录的内容到-d
所指定的新用户主目录中去。 - 另一个是
-G
选项,如果要将用户添加到一个或几个组里去,-G
后面的用户组列表应当包含之前用户所在的组列表和新的组列表,否则,用户将从之前的组列表中移除,要查看用户在哪些组里面,可以通过命令cat /etc/group | grep UserName
查看(UserName是要查看的用户名)。
有时候用户所在组比较多,只用-G
选项会比较麻烦,需要把之前所在的组都列出来,这时候可以添加-a
选项(append)和-G
选项合用,表示附加一个组,用的时候如下列命令所示:
usermod -a -G newGroup user1 #将user1添加到newGroup组中,即向user1原有的组列表中添加newGroup
如果要在用户的组列表中删除一个,可以参考上面说的的用户组管理命令gpasswd
在组内删除对应用户组即可达到目的,同样的也可以通过gpasswd
达到一次或多次使用usermod -a -G
的作用
2.口令相关
口令相关的修改命令基本语法如下:
passwd [options] UserName
如果只是当前用户修改自己的口令,则可以只用passwd
,如果是root用户或者其他管理员用户修改其他用户的口令配置,则需要管理员权限sudo或者root用户本身。跟上面的命令一样,可以用passwd --help
来查看选项详情。常用的选项如下:
不使用任何选项:直接修改口令
-l:锁定口令,即禁用用户,用户可以通过ssh登录,但是不能修改口令
-u:解锁口令,即解除禁用
-d:清除口令,使账户不需要密码
3.切换组
有时候一个用户同时属于多个用户组的时候,默认是会使用主用户组的权限配置,如果需要切换当前用户当前使用的用户组,例如,用户stu1同时在用户组StudentGroup和adm中,默认是StudentGroup,在stu1下,使用如下命令可以切换到adm组中:
newgrp adm
与用户账号有关的系统文件(查看用户/用户组)
1. /etc/passwd——用户账户文件
每个用户都在文件/etc/passwd中有一个对应的记录行,它记录了这个用户的一些基本属性。这个文件对所有用户可读,查看命令为:
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
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
stu1:x:1001:1001::/media/StudentGroup/stu1/:
stu2:x:1002:1001:I_love_this_test:/media/StudentGroup/stu2/:/bin/bash
可以看出,一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
2. /etc/group——用户组文件
每个用户组会对应文件/etc/group中的一行记录,查看方式如下:
cat /etc/group
此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有:
组名:口令:组标识号:组内用户列表
**3. /etc/shadow
/etc/shadow中的记录与/etc/passwd中的记录一一对应,并且只有超级管理员才有权限查看,记录着每个用户更为隐私的信息。
它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用":"隔开。这些字段是:
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志。
文件/目录权限管理
在Linux系统中,一切皆文件,就是目录(或文件夹)、文档、程序等所有的都统一为文件,文件的权限控制包括读、写、执行三种,同时还有所属权的概念。
查看权限
文件/目录的权限查看命令为:ls -l
,该命令会列出当前目录下所有文件(包括子目录)的详情,结果如下图所示:
第一行是列出了当前目录下所有文件数量(包括子目录中所有文件),然后紧接着每一行都是当前目录下的一个文件。每一行中各部分含义如下:
权限 | incode | 所属用户 | 所属用户组 | 文件大小 | 修改时间 | 名称 |
---|---|---|---|---|---|---|
drwxrwxrwx | 0 | user | group | 512 | 月日时间 | name |
其中第一个字段如drwxrwxrwx
或drwxr-xr-x
这种就表示该文件的权限,这个字段的值一共有10位字符,每一位的含义如下:
位置 | 含义 | 取值说明 |
---|---|---|
第1位 | 是否为目录 | d表示该文件为目录,-表示该文件不是目录 |
2~4位 | 所属用户对该文件的权限 | 2,3,4位分别对应读、写、执行权限,如果对应位置为“-”符号表示不具备该权限,为对应字母r、w、x则表示具备该权限 |
5~7位 | 所属用户组对该文件的权限 | 5,6,7位分别对应读、写、执行权限,如果对应位置为“-”符号表示不具备该权限,为对应字母r、w、x则表示具备该权限 |
8~10位 | 其他用户对该文件的权限 | 8,9,10位分别对应读、写、执行权限,如果对应位置为“-”符号表示不具备该权限,为对应字母r、w、x则表示具备该权限 |
举个例子,如下图所示结果:
-rwxr-xr-- 0 user1 Group1 512 May 23 14:23 AFile
这个结果表示的是文件AFile的信息,其权限为:
- 文件属于用户user1,该用户对该文件有读、写、执行权限;
- 文件属于用户组Group1,该用户组对AFile具有读、执行权限,没有写权限(不能修改);
- 其他用户对文件AFile仅有只读权限,没有写(修改)和执行权限。
注意:这里针对目录(即文件夹),可执行权限表示能否进入该目录,可读权限代表能否查看该目录内容。
修改/设置权限
修改权限的命令为chmod
,基本语法如下:
chmod 权限操作 文件名
其中权限操作有两种写法:
- 字符操作
以[用户标识][操作符][权限内容]
为语法规则,具体如下:- 用户标识:
-
u
——表示文件所属用户(user) -
g
——表示所属用户组(group) -
o
——表示其他用户(other) -
a
——表示以上三个所有(all);
-
- 操作符:
-
+
——增加权限 -
-
——删除权限 -
=
——将权限设置为;
-
- 权限内容:(权限内容可以多项一起)
-
r
——读权限 - ``w
——写权限
-
x
——执行权限
-
- 用户标识:
举几个例子:(这里省略了可能需要的管理员权限,如果需要就在下列命令前加
sudo
)
’chmod u+w aFile
:给aFile的所属用户增加对aFile的写权限
chmod g-w aFile
:使aFile的所属用户组对aFile不能写
chmod a+rwx aFile
:给所有用户对aFile增加读、写、执行权限
chmod u=rw
:将aFile的所属用户对aFile的权限设置为读、写(这里没有x所以相当于rw-,即使修改之前所属用户有执行权限,执行该命令后执行权限会被删除)。
- 数值操作
数值操作是一种更加简便的用法,熟练用户用的更多。其含义是把表示权限的九位(第一位表示是否为目录的不算)视作9个二进制位(事实上系统正是这样理解的),分别对应9个权限位,取值为1表示具备该权限,取值为0则表示不具备该权限。
然后这9个二进制位中每三位可以转化为一个八进制位,这样,恰好可以将所属用户、所属用户组、其他用户三类的权限分别用一个八进制数字来表示,对于每类用户(每个八进制位)的每种独立权限可表示如下:
r--
——100
——4
-w-
——010
——2
--x
——001
——1
---
——000
——0
然后各种组合权限如此类推,也可以简单的计算为以上权限对应数值的加和,例如:
rw-
——110
——6
=4+2
这种方法修改的时候需同时列出三类用户的权限值,例如下列命令:
chmod 777 aFile
这条命令就是将aFile的权限修改为所有用户对它具有所有权限。
再比如下面这条命令:
chmod 754 aFile
这条命令是将aFile权限设置为:所属用户对aFile具有全部权限,所属用户组有可读可执行权限但不可写,其他用户仅有可读权限。
修改文件所属权
上面提到的文件权限的修改都是针对文件属性中文件的拥有者(所属用户)以及所属用户组的,如果需要修改文件的所属权(即拥有者用户及所属用户组)则需要使用命令chown
(change owner?),具体用法如下示例:
#遇到权限不足的情况自行添加sudo,没sudo权限就联系管理员吧
chown user1 aFile #修改aFile的所属用户为user1;
chown user1: aFile #修改aFile的所属用户为user1,所属用户组为user1所在的主组;
chown :Group1 aFile #修改aFile的所属用户组为Group1,所属用户不变;
chown user1:Group2 aFile #修改aFile的所属用户为user1,所属用户组为Group2;
以上就是Ubuntu中关于用户和权限管理的基本用法,对于大多数用户来讲已经足够了,也基本满足了实验室现在对Linux服务器的管理,当然还有更加高阶一些的功能和用途,例如修改系统配置文件,修改系统默认的用户组和管理权限以及多用户登录和环境变量切换这些,下次再专门整理关于多用户远程登录的内容。
欢迎访问博主的个人主页——静叶思的随笔