bash shell命令学习之文件权限篇

本博客内容来自《Linux命令行与shell脚本编程大全》第七章

目录

1、Linux的安全性

/etc/passwd文件

/etc/shadow文件

添加新用户

删除用户

修改用户

usermod命令

passwd和chpasswd命令

chsh、chfn和chage命令

2、使用Linux组

/etc/group文件

创建新组

修改组

3、理解文件权限

使用文件权限符

默认文件权限

4、改变安全性设置

改变权限

改变所属关系

chown命令

chgrp命令


Linux沿用了Unix文件权限的方法,允许用户和组根据每个文件和目录的安全性设置来访问文件。

1、Linux的安全性

Linux安全系统的核心是用户账户。

用户权限是通过创建用户时分配的用户ID(UID)来跟踪的。

/etc/passwd文件

/etc/passwd文件是Linux系统用来存储用户登录名与其对应UID值的,如下所示:

[root@izwz9194nuv8g0cwqfqsh3z skel]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......
ntp:x:38:38::/etc/ntp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
admin:x:1000:1000::/home/admin:/bin/bash
说明:

以冒号为分割,有七个字段

登录用户名:用户密码:用户账号的UID:用户组ID:用户备注:用户HOME目录位置:用户默认shell

root用户是Linux管理员,默认UID是0。可以发现,Linux系统为各种功能都创建了不同的用户账户,但这些账户不是真的用户,而是系统账户,这样有人攻入某个服务也无法访问整个系统。Linux为系统账户预留了500以下的UID值。可以发现用户密码字段都被设置为x,出于安全考虑,用户密码字段都储存在另一个目录下/etc/shadow。

/etc/shadow文件

该文件只有root用户能访问,比上面的/etc/passwd更安全。里面保存了每个用户账户的密码记录,如下所示:

[root@izwz9194nuv8g0cwqfqsh3z skel]# cat /etc/shadow
root:$6$T7cTM/M3XjUOXG7GyLRNWz7pAOrjCrUYyCBuzTM9fRR.:17947:0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::

该记录中有9个字段:

用户名:加密密码:距离上次修改密码时间:多少天后可更改密码:多少天后必须修改密码:密码过期前几天提醒用户:密码过期几天后禁用用户账户:用户被禁日期:预留字段

添加新用户

添加新用户主要使用useradd命令,使用-D参数(default)查看添加新用户的默认值:

[root@izwz9194nuv8g0cwqfqsh3z skel]# useradd -D
GROUP=100                     ##新用户会被添加到的用户组ID
HOME=/home                   ##新用户的HOME目录会位于/home/loginname
INACTIVE=-1                    ##新用户的账号密码过期后不会被禁
EXPIRE=                           ##新用户账户不设置过期日期
SHELL=/bin/bash              ##新用户默认shell
SKEL=/etc/skel                 ##系统将该目录下内容复制到用户的HOME目录下
CREATE_MAIL_SPOOL=yes      ##创建用于接收邮件的文件

可以直接更改这些系统默认值,使用-D选项后面再加参数即可,参数主要有:

-b default_home :更改默认的用户HOME目录位置

-e date :更改默认的过期日期

-f inactive :更改默认的从密码过期到账户被禁天数

-g group:更改默认的组名称或GID

-s shell:更改默认的登录shell

如:useradd -D -s /bin/tsch即可更改

很好玩的地方在于/etc/skel目录下有几个隐藏文件,这个目录也是创建新用户HOME目录的模板:

[root@izwz9194nuv8g0cwqfqsh3z skel]# ll -a
total 20
drwxr-xr-x.  2 root root 4096 Apr 11  2018 .
drwxr-xr-x. 83 root root 4096 Feb 24 10:27 ..
-rw-r--r--   1 root root   18 Oct 31 01:07 .bash_logout
-rw-r--r--   1 root root  193 Oct 31 01:07 .bash_profile             #文件具体用法见博客
-rw-r--r--   1 root root  231 Oct 31 01:07 .bashrc

在创建新用户时使用 -m 参数可以指定创建HOME目录(默认也会创建)

[root@izwz9194nuv8g0cwqfqsh3z skel]# cd /home
[root@izwz9194nuv8g0cwqfqsh3z home]# ll
total 4
drwx------ 3 admin admin 4096 Feb 20 14:16 admin
[root@izwz9194nuv8g0cwqfqsh3z home]# useradd -m test
[root@izwz9194nuv8g0cwqfqsh3z home]# ll
total 8
drwx------ 3 admin admin 4096 Feb 20 14:16 admin
drwx------ 2 test  test  4096 Feb 24 14:38 test

其他用法主要有:

1.-d参数用于指定主目录(不使用默认路径)

[root@izwz9194nuv8g0cwqfqsh3z home]# useradd -d /home/testfile tast
[root@izwz9194nuv8g0cwqfqsh3z home]# ll
total 16
drwx------ 3 admin  admin  4096 Feb 20 14:16 admin
drwx------ 2 tast   tast   4096 Feb 24 14:45 testfile

2.-M参数 不创建用户的HOME目录

3.-n参数 创建与用户登录名同名的新组

4.-r参数 创建系统账户

5.-p passwd参数 为用户账户指定默认密码

6.-s shell 指定默认的登录shell

7.-u uid 为账户指定唯一的UID

删除用户

删除用户命令很简单,直接使用

userdel 用户名

如果想把该用户的HOME目录和邮件目录也删除,可以加上 -r 参数,但要小心,记得确保该用户HOME目录下没有其他用户的文件:

user -r 用户名

修改用户

  • usermod命令

最强大的用户账户修改工具,能用来修改/etc/passwd文件中的大部分字段,只需要用需要修改的字段对应的命令行参数即可。参数大部分与上面修改useradd默认参数(-e/-g等),此外还有一些参数:

选项:
  -c COMMENT                 修改/etc/passwd文件第五段comment
  -d HOME_DIR                修改用户的HOME目录,通常和-m选项一起使用
  -e EXPIRE_DATE           将帐户到期日期设置为EXPIRE_DATE,格式YY-MM-DD
  -f INACTIVE                    在到期后设置密码无效,0表示密码已过期就禁用帐号,-1表示禁用此功能,默认值是-1
  -g GROUP                      强制使用GROUP作为新的主要组(会改变用户的默认组
  -G GROUPS                   把用户追加到某些组中,会把用户从别的组移除但是不改变用户的默认组
  -a                                    把用户追加到某些组中,添加的时候不会把该用户从别的组移除,仅与-G选项一起使用
  -l NEW_LOGIN               修改用户账户的登录名
  -L                                    锁定账户,使用户无法登录
  -m                                  修改用户的HOME目录,通常和-d选项一起使用
  -o                                   允许使用重复(非唯一)UID
  -p  PASSWORD             使用加密密码作为新密码
  -R  CHROOT_DIR        目录到chroot
  -s  SHELL                      用户帐户的新登录shell
  -u  UID                           用户帐户的新UID
  -U                                   解除锁定,使用户能够登录
  -Z  SEUSER                   用户帐户的新SELinux用户映射

注意:以上红字提到的默认组,其在/etc/passwd的GID字段中定义

追加用户到用户组,使用 -aG 参数,例如:

[root@izwz9194nuv8g0cwqfqsh3z home]# useradd test                              ##添加用户
[root@izwz9194nuv8g0cwqfqsh3z home]# groupadd testgroup                  ##添加用户组
[root@izwz9194nuv8g0cwqfqsh3z home]# ll
total 8
drwx------ 3 admin admin 4096 Feb 20 14:16 admin
drwx------ 2 test  test  4096 Feb 24 15:06 test
[root@izwz9194nuv8g0cwqfqsh3z home]# usermod -aG testgroup test     ##追加用户到用户组
[root@izwz9194nuv8g0cwqfqsh3z home]# id test
uid=1004(test) gid=1004(test) groups=1004(test),1005(testgroup)              ##可以看到追加成功

修改test用户的HOME目录,使用-md参数:

#usermod -md /home/usertest test

  • passwd和chpasswd命令

passwd命令可以改变用户密码:

[root@izwz9194nuv8g0cwqfqsh3z testfile]# passwd test
Changing password for user test.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

系统上任何用户都可以用该命令修改自己的密码,但只有root用户有权限修改别人的密码。

-e选项能强制用户下次登录时修改密码。

chpasswd命令可以给大量用户修改密码,它能自动读取登录名和密码对(冒号分割)列表然后完成用户密码修改。可以用重定向命令来输入文件流给该命令:

#chpasswd < users.txt

  • chsh、chfn和chage命令

chsh命令用来快速修改用户登录shell:

#chsh -s /bin/csh test

chfn命令用来修改用户备注信息,fn是指Unix中的finger命令,出于安全性考虑,该命令在Linux上一般被禁用。

[root@izwz9194nuv8g0cwqfqsh3z testfile]# chfn test
Changing finger information for test.
Name []: heylin
Office []: school
Office Phone []: 119
Home Phone []: 119

Finger information changed.

然后你会在/etc/passwd中看到:

[root@izwz9194nuv8g0cwqfqsh3z testfile]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......
test:x:1004:1004:heylin,school,119,119:/home/testfile:/bin/bash

chage命令用来帮助管理用户账户的有效期。

-d : 设置上次修改密码到现在的天数

-E:设置密码过期日期,过期后锁定

-I :设置密码过期到锁定账户的天数

-m:设置修改密码之前最少多少天

-W:设置密码过期前多久开始提醒

日期值可以有两种:

YYYY-MM-DD格式

从1970年1月1日到该日期的天数

2、使用Linux组

Linux采用组的安全概念来对共享资源的用户进行安全控制。

每个组都由唯一的GID,与UID类似,还有组名。一般新创建一个用户时系统即新创建一个组,更加安全。

/etc/group文件

在/etc/group文件中存储了所以组信息,系统账户的GID通常小于500:

[root@izwz9194nuv8g0cwqfqsh3z testfile]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

test:x:1004:

testgroup:x:1005:test

说明:

四个字段 组名:组密码:GID:属于该组的用户列表

注意:

当一个用户在/etc/passwd文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在/etc/group文件中,如上面的test用户,他也在test组,但是没有显示,/etc/passwd文件显示如下所示,test默认组GID为1004(test),但可以看到上面test组成员没有写test:

test:x:1004:1004:heylin,school,119,119:/home/testfile:/bin/bash

不能直接修改该文件来添加用户到组,要用前面提到的usermod命令。

创建新组

创建新组使用groupadd命令

[root@izwz9194nuv8g0cwqfqsh3z testfile]# groupadd shared         ##添加新组
[root@izwz9194nuv8g0cwqfqsh3z testfile]# tail -n 5 /etc/group
docker:x:993:
hailin:x:1003:
test:x:1004:
testgroup:x:1005:test                               ##test原来在testgroup组     
shared:x:1006:                                         ##添加新组成功
[root@izwz9194nuv8g0cwqfqsh3z testfile]# usermod -G shared test         ##分配test用户到该组
[root@izwz9194nuv8g0cwqfqsh3z testfile]# usermod -G shared hailin      ##分配hailin用户到该组
[root@izwz9194nuv8g0cwqfqsh3z testfile]# tail -n 5 /etc/group
docker:x:993:
hailin:x:1003:
test:x:1004:
testgroup:x:1005:                                     ##-G参数,test被移除出testgroup组
shared:x:1006:test,hailin                          ##添加用户成功
[root@izwz9194nuv8g0cwqfqsh3z testfile]# usermod -aG testgroup test       ##-a参数
[root@izwz9194nuv8g0cwqfqsh3z testfile]# tail -n 5 /etc/group
docker:x:993:
hailin:x:1003:
test:x:1004:
testgroup:x:1005:test                               ##添加用户成功,使用-a参数,不会将用户从原组移除
shared:x:1006:test,hailin                          ##test未被移除

注意:不要使用-g选项,否则指定的组名会替换掉该账户的默认组。

修改组

/etc/group文件中信息不多,能修改的也就GID(-g选项)和组名(-n选项)

[root@izwz9194nuv8g0cwqfqsh3z testfile]# groupmod -n sharing shared
[root@izwz9194nuv8g0cwqfqsh3z testfile]# tail -n 5 /etc/group
docker:x:993:
hailin:x:1003:
test:x:1004:
testgroup:x:1005:test
sharing:x:1006:test,hailin

3、理解文件权限

使用文件权限符

通过ll命令可以查看Linux上的文件、目录和设备的权限:

[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
total 24
-rw-r--r-- 1 root root   49 Feb 21 15:55 file1
-rw-r--r-- 1 root root    7 Feb 20 15:28 hailin
lrwxrwxrwx 1 root root    6 Feb 20 16:04 link -> hailin
drwxr-xr-x 2 root root 4096 Feb 20 15:35 mod_test

以上红色部分就是描述文件和目录权限的编码:

第一个字符:

-代表文件

d代表目录

l代表链接

c代表字符型设备

b代表块设备

n代表网络设备

之后3组三字符的编码 rwx、rw-、r--、r-x等:

r可读,八进制值为4(二进制100)

w可写,八进制值为2(二进制010)

x可执行,八进制值为1(二进制001)

3组权限分别对应于文件或目录所属的用户、用户组和系统的其他用户。以file1为例:

-rw-r--r-- 1 root root   49 Feb 21 15:55 file1

rw- :文件属主 权限码 6

r-- :文件所属用户组 权限码 4

r--:系统其他用户 权限码 1

八进制模式的值即为 641

默认文件权限

文件默认权限设置命令为 umask。查看系统默认umask值:

[root@izwz9194nuv8g0cwqfqsh3z ~]# umask
0022

注意,第一个0为粘着位,后面三位是文件或目录对应的umask八进制值

文件的全权限值为666(所有用户有读写权限),目录的全权限值为777(所有用户有读写和执行权限)

[root@izwz9194nuv8g0cwqfqsh3z ~]# touch umasktest
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rw-r--r-- 1 root root    0 Feb 24 16:35 umasktest

可以看到创建文件对应八进制权限为644,而文件全权限值为666,减去umask的022就得到644了。

所以umask掩码会屏蔽掉不想授予该安全级别的权限。

默认的umask值在/etc/profile文件中定义,Ubuntu系统可能会放在/etc/login.defs文件中。

修改umask值很简单,执行:

[root@izwz9194nuv8g0cwqfqsh3z ~]# umask 026
[root@izwz9194nuv8g0cwqfqsh3z ~]# touch newfile
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rw-r----- 1 root root    0 Feb 24 16:39 newfile
可以看到newfile的八进制权限值为640,这个值也会对创建目录生效

4、改变安全性设置

改变权限

权限改变使用chmod命令,其格式为:

#chmod options mode file

mode参数可以用前面提到的八进制权限值,直观方便:

[root@izwz9194nuv8g0cwqfqsh3z ~]# chmod 760 newfile 
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rwxrw---- 1 root root    0 Feb 24 16:39 newfile

也可以用符号修改:

第一个符号:

u代表用户

g代表组

o代表其他用户

a代表所有

第二个符号:

+:增加权限

-:删除权限

第三个符号:

x 执行权限

r 写权限

w 读权限

例如:

#chmod o+r newfile

改变所属关系

  • chown命令

改变文件的属主,使用chown命令,只有root可以改变所有文件的属主。

使用格式为:

#chown options owner[.group] file

使用登录名或者UID来指定文件新的属主:

[root@izwz9194nuv8g0cwqfqsh3z ~]# chown test newfile 
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rwxrw---- 1 test root    0 Feb 24 16:39 newfile

也可以同时改变文件的属主(用户)和用户组:

[root@izwz9194nuv8g0cwqfqsh3z ~]# chown hailin.test newfile 
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rwxrw---- 1 hailin test    0 Feb 24 16:39 newfile

只改变用户组:

[root@izwz9194nuv8g0cwqfqsh3z ~]# chown .root newfile 
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rwxrw---- 1 hailin root    0 Feb 24 16:39 newfile

chown命令常用的参数有 -R ,递归的改变子目录和文件的所属关系。

-h 参数可以改变文件的所有符号链接文件的所属关系。

  • chgrp命令

改变文件的默认属主,使用chgrp命令

[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rw-r--r-- 1 root   root    7 Feb 20 15:28 hailin

[root@izwz9194nuv8g0cwqfqsh3z ~]# chgrp test hailin 
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll
-rw-r--r-- 1 root   test    7 Feb 20 15:28 hailin

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值