文件属性、权限、用户、用户组
文件目录属性
Linux中的文件或目录,都有一个 所有者owner 和 所属组group;
所有者是指文件的拥有者,所属组是指这个文件属于哪一个用户组(一个用户组下面会有若干个用户);
假设:t0文件的所有者为owner0,t1的所有者为owner1,owner1有可能不能查看t0,owner0也有可能不能查看t1(之所以说可能,是因为owner0和owner1有可能属于同一个用户组,而恰好这个用户组对这两个文件都有查看权限)
需求:使一个文件能同时被owner0和owner1查看时;“所属组”就派上用场了。
先创建一个组owners,让owner0和owner1同属于这个组,然后建立一个文件test2,且其所属组为owners,这样owner0和owner1就都可以访问test2文件。
上图中,一共9列(用空格划分列)
第1列
第1位:文件的类型,d 表示目录,- 表示普通文件,l 表示链接
第2~位:每3位为一组,每组按顺序表示:所有者、所属组、其他非本用户组的权限,其中,r读、w写、x执行、-无权限;
最后一位:“.”,老版本CentOS 5是没有这个点的,这主要是因为新版本的ls命令添加了SELinux或者acl的属性。如果文件或者目录使用了SELinux context的属性,这里会是一个点“.”;如果使用了acl的属性,这里会是一个加号“+”。
第2列
文件占用的节点(inode),如果是目录,这个数值与该目录下得子目录数量有关
第3列
文件所有者
第4列
文件所属组
第5列
文件的大小
第6、7、8列
文件最后修改事件(mtime),按月、日以及具体时间
第9列
文件名
命令chgrp
change group 的缩写,更改 文件或目录 的 所属组
格式:
chgrp [组名] [文件名]
groupadd newgroup1 添加一个newgroup1用户组 touch test1 ls -l test1 -rw-r--r-- 1 root root 0 12月 30 07:43 test1 新建的文件所属组为root chgrp newgroup1 test1 修改test1的所属组为 newgroup1 ls -l test1 -rw-r--r-- 1 root newgroup1 0 12月 30 07:43 test1
更改目录本身且目录中的子级目录和文件:加 -R 即可;
命令 chown
change owner的简写,更改 文件或目录 的 所有者
格式
chown [-R] 账号名 文件名或目录
chown [-R] 账户名:组名 文件名或目录
-R 用于目录,作用是 联级更改;
mkdir dir1 useradd user1 // 创建用户user1 touch dir1/test3 // 在dir1目录下创建test3文件 chown user1 dir1 ls -ld dir1 // dir1目录的所有者已经由root改为user1 drwxr-xr-x 2 user1 root 19 12月 30 07:46 dir1 ls -l dir1 // 但是dir1目录下的test3文件的所有者依旧是root -rw-r--r-- 1 root root 0 12月 30 07:46 test3 chown -R user1:testgroup dir1 // 把dir1目录和里面的文件和目录的所有人user1所属组testgroup ls -l dir1 -rw-r--r-- 1 user1 testgroup 0 12月 30 07:46 test1
命令 chmod(重要)
change mode的简写,改变用户对文件/目录的读、写和执行权限
格式为
chmod [-R] xyz 文件名(这里的xyz表示数字)
-R选项,表示级联更改
为了方便更改文件的权限,Linux使用数字代替rwx,具体规则为:用4表示r,用2表示w,用1表示x,用0表示-。
例如,rwxrwx---用数字表示就是770,其具体算法为:rwx=4+2+1=7,rwx=4+2+1=7,---=0+0+0=0。
在Linux系统中,一个目录的默认权限为755,而一个文件的默认权限为644。
假设你创建了一个目录,但你不想让其他人看到该目录的内容,则只需将其权限设置成rwxr-----(即740)即可。
chmod命令还支持使用rwx的方式来设置权限,即使用u、g和o来分别表示所有者、所属组和其他用户的属性,用a代表all(即全部):
chmod u=rwx,og=rx dir3/test3
ls -l dir3/test3
-rwxr-xr-x 1 user1 testgroup 0 12月 30 07:46 dir3/test3
还可以针对u、g、o和a,增加或者减少它们的某个权限(读、写或执行):
chmod u-x dir3/test3 ls -l dir3 -rw-r-xr-x 1 user1 testgroup 0 12月 30 07:46 test3 chmod a-x dir3/test3 ls -l dir3/test3 -rw-r--r-- 1 user1 testgroup 0 12月 30 07:46 dir3/test3 chmod u+x dir3/test3 ls -l dir3/test3 -rwxr--r-- 1 user1 testgroup 0 12月 30 07:46 dir3/test3
/etc/passwd 文件
上图中head前面的符号|,我们称之为管道符,它的作用是把前面命令的输出结果再输入给后面的命令。
/etc/passwd可以分割成7个字段:
第1个字段
用户名,用户账号的字符串。
第2个字段
账号的口令。这里为什么是x呢?早期的Unix系统口令确实存放在这里,但基于安全因素,后来就将其存放到/etc/shadow中了,这里只用一个x代替。
第3个字段
代表用户标识号,也称为uid。系统就是通过这个数字识别用户身份的。这里的0就是root,也就是说我们可以修改test用户的uid为0,那么系统会认为root和test为同一个账户。uid的取值范围是0~65 535(但实际上已经可以支持到4 294 967 294)。0是超级用户(root)的标识号,CentOS 7和CentOS 8的普通用户标识号从1000开始。如果我们自定义建立一个普通用户,那么会看到该账户的标识号是大于或等于1000的。
第4个字段
表示组标识号,也称为gid。这个字段对应着/etc/group中的一条记录,其实/etc/group和/etc/passwd基本类似。
第5个字段
注释说明,没有实际意义。通常记录该用户的一些属性,例如姓名、电话、地址等。我们可以使用chfn
命令来更改这些信息。
第6个字段
用户的家目录,当用户登录时,就处在这个目录下。root的家目录是/root,普通用户的家目录则为/home/username,用户家目录是可以自定义的。比如,建立一个普通用户test1,要想让test1的家目录在/data目录下,只要将/etc/passwd文件中对应该用户那行中的本字段修改为/data
即可。
第7个字段
用户的shell。用户登录后,要启动一个进程,用来将用户下达的指令传给内核,这就是shell。Linux的shell有sh、csh、ksh、tcsh、bash等多种,而Red Hat、CentOS的shell就是bash。查看/etc/passwd文件,该字段中除了/bin/bash,还有很多/sbin/nologin,这表示不允许该账号登录。如果想建立一个不允许登录的账号,可以把该字段改成/sbin/nologin,默认是 /bin/bash。
/etc/shadow 文件
# cat /etc/shadow |head -n 3 root:$6$Wu/W4eryssf9B3xQ$jgNuM24oQ9boSTUPaeJ/79GFjLUX912bSDu3ak40qJIxNj4/SpaK.JXguDYowM00mt3/
5tvNIoBJ7RNcpH2K.1:18257:0:99999:7::: bin:*:18078:0:99999:7::: daemon:*:18078:0:99999:7:::
/etc/passwd 分割成9个字段
第1个字段
用户名,与/etc/passwd对应
第2个字段
用户密码,是该账号的真正密码。虽然这个密码已经加密,但是有些黑客还是能够解密的。所以将该文件属性设置为000
,但root账户还是可以访问或更改的。
第3个字段
上次更改密码的日期,这个数字以1970年1月1日和上次更改密码的日期为基准计算而来。例如,上次更改密码的日期为2020年1月1日,则这个值就是365×(2020-1970)+(2020-1970)/4+1=18263。如果是闰年,则有366天。
第4个字段
要过多少天才可以更改密码,默认是0,即不受限制。
第5个字段
密码多少天后到期,即在多少天内必须更改密码。例如,这里设置成30,则30天内必须更改一次密码;否则,将不能登录系统。默认是99999,可以理解为永远不需要改。
第6个字段
密码到期前的警告期限。若这个值设置成7,则表示当7天后密码过期时,系统就发出警告,提醒用户他的密码将在7天后到期。
第7个字段
账号失效期限。如果这个值设置为3,则表示密码已经到期,然而用户并没有在到期前修改密码,那么再过3天,这个账号便失效,即锁定。
第8个字段
账号的生命周期。跟第3个字段一样,这个周期是按距离1970年1月1日多少天算的。它表示的含义是账号在这个日期前可以使用,到期后将作废。
第9个字段
保留用的,没有什么意义。
命令 groupadd
新增用户组
格式
groupadd [-g GID] groupname
# groupadd grptest1 # tail -n1 /etc/group grptest1:x:1002:
如果不加-g选项,则按照系统默认的gid创建组。跟uid一样,gid也是从1000开始的,如下操作自定义gid:
# groupadd -g 1008 grptest2 # tail -n2 /etc/group grptest1:x:1002: grptest2:x:1008:
删除组 groupdel
# groupdel grptest2 # tail -n2 /etc/group slocate:x:21: grptest1:x:1002:
注意:当组里面有一个或以上账户,那么就无法删除该组;
命令 useradd
新增用户
格式为
useradd [-u UID] [-g GID] [-d HOME] [-M] [-s]
- -u:表示自定义UID。
- -g:表示使新增用户属于某个已经存在的组,后面可以跟组id,也可以跟组名。
- -d:表示自定义用户的家目录。
- -M:表示不建立家目录。
- -s:表示自定义shell。
新建一个用户 test10:
# useradd test10 # tail -n1 /etc/passwd test10:x:1001:1001::/home/test10:/bin/bash # tail -n1 /etc/group test10:x:1001:
如果useradd不加任何选项,直接跟用户名,则会创建一个跟用户名同名的组。
那么,如何自定义uid、gid或者所属的组呢?
# useradd -u1005 -g 1006 -M -s /sbin/nologin user11
删除用户 userdel
格式
userdel [-r] username
-r选项:当删除用户时,一并删除该用户的家目录。