Linux命令行与shell编程 第6章 理解Linux文件权限

本章内容

  • 理解Linux的安全性
  • 解码文件权限
  • 操作Linux组

缺乏安全的系统不是完整的系统。系统上必须要有一套保护文件不被非授权用户访问或

修改的机制。Linux沿用了Unix文件权限的办法,即允许用户和组基于每个文件和目录的

一组安全性设置访问文件。本章将介绍如何用Linux文件安全系统来在需要时共享数据和保护

数据。

6.1 Linux的安全性

Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配一个唯一的用户

账户。用户对系统上对象的访问权限取决于他们登录系统时用的账户。

Linux系统使用特定的文件和工具来跟踪和管理系统上的用户账户。在我们讨论文件权限之前,

先来看一下Linux是怎样处理用户账户的。本节会介绍管理用户账户需要的文件和工具,这样

在处理文件权限问题时,你就知道如何使用它们了。

6.1.1  /etc/passwd文件

Linux 系统使用一个专门的文件来将用户的登录名匹配到对应的UID值。这个文件就是

/etc/passwd文件,它包含了一些与用户有关的信息。下面是Linux系统上典型的/etc/passwd文件的一个

例子:

[jingpan@localhost ~]$ 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
jingpan:x:500:500::/home/jingpan:/bin/bash
radvd:x:75:75:radvd user:/:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
nignx:x:501:502::/home/nignx:/sbin/nologin
nginx:x:502:503::/home/nginx:/sbin/nologin

root用户账户是Linux系统的管理员,通常分配给它的UID是0。就像上便中显示的,Linux系统会为各种各样的功能创建

不同的用户账户,而这些账户并不是真的用户。这些账户称作系统账户,是系统上运行的各种服务进程访问资源用的特殊

账户。所有运行在后台的服务都需要用一个系统账户登录到Linux系统。

在安全成为一个问题之前,这些服务经常会用根账户登录。遗憾的是,如果有非授权的用户攻入了这些服务中的一上,他就能

作为root用户进入整个系统了。为了防止这种情况发生,现在几乎每个Linux服务器上后台运行的服务都有自己的用户账户。这样,即使有人攻入了某个服务,他也无法访问整个系统。

Linux为系统账户预留了500以下的UID值。有些服务甚至要用特定的UID才能正常工作。为普通用户创建账户时,

大多数Linux系统会将500起始的第一个可用UID分配给这个账户(这未必适用所有的Linux发行版)。

你可能已经注意到/etc/passwd文件还有很多用户登录名和UID之外的信息。/etc/passwd文件的字段包含离如下 信息"

  • 登录用户名;
  • 用户密码;
  • 用户账户的UID;
  • 用户账户的文本描述(称为备注字段);
  • 用户HOME目录的位置;
  • 用户的默认shell。

/etc/passwd文件中的密码字段都被设置成了x,这并不是说所有的账户都用相同的密码。

在早期的Linux上,/etc/passwd文件里有加密后的用户密码。但鉴于很多程序都需要访问/etc/passwd文件获取用户

信息,这就成了一个安全隐患。随着用来破解加密过的密码的工具的不断演进,用心不良的人开始忙于破解存储在

/etc/passwd文件中的密码。Linux开发人员需要生新构思这个策略。

现在,Linux系统将用户密码保存在另一个单独的文件中(称为shadow文件,位置在/etc/shadow)。只有特定的程序

才能访问这个文件,比如登录程序。

你已经看到了,/etc/passwd是标准的文本文件。你可以用任何文本编辑器来直接手动的在/etc/passwd文件里进行用户管理,

比如添加、修改或删除用户账户。但这样做极其危险,如果/etc/passwd文件损坏了,系统就无法读取它的内容了,这样用户就

无法正常登录了,甚至边root用户也会无法登录。用标准的Linux用户管理工具去执行这些用户管理功能就会安全许多。

6.1.2 /etc/shadow文件

/etc/shadow文件为系统上的每个用户保存了一条记录。记录就像下面这样:

jingpan:$6$j9ozJNNtxlogC/dq$/kQG9DOUIjLZHFKJfR5TTmFg88iA3qphdkmOOhZlixywruYwbrvKs/Uf1httIEecB/EMsQ7ChJCHHOfuLRzG/0:17476:0:99999:7:::

在/etc/shadow文件的每条记录中有9个字段:

  •     与/etc/passwd文件中的登录名对应的登录名:
  •     加密后的密码;
  •     自1970年1月1日(上次修改密码的日期)到当天的天数;
  •     多少天后才能更改密码;
  •     多少天后必须更改密码;
  •     密码过期前提前多少天提醒用户更改密码;
  •     密码过期后多少天禁用用户账户;
  •     用户账户被禁用的日期,用自1970年1月1日到当月天的天数表示;
  •     预留字段,给将来使用。

    使用shadow密码后,Linux系统可以更好地控制用户密码了。它可以控制用户多久更改

一次密码,以及密码未更新的话多久后禁用该用户账户。

6.1.3  添加新用户

        添加新用户到Linux系统的工具是useradd。 这个命令提供了一次性创建新用户及设置用户HOME目录结构的简便方法。

可以用useradd 命令加-D参数来查看你的Linux系统的默认值:

[root@localhost jingpan]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

-D 参数显示了在创建新用户时如果你不在命令行指定的话useradd命令将使用的默认值。这个例子列出了这些默认修士:

  •     新用户会被添加到GID为100的公共组;
  •     新用户的HOME目录将会位于/home/loginname;
  •     新用户账户密码在过期后不会被禁用;
  •     新用户账户未被设置为某个日期后就过期;
  •     新用户账户将bash shell作为默认shell;
  •     系统会将/etc/skel目录下的内容复制到用户的HOME目录下;
  •     系统为该用户账户在mail目录下创建一个用于接收邮件的文件。


[root@localhost jingpan]# ls -al /etc/skel/
总用量 36
drwxr-xr-x.   4 root root  4096 11月  8 08:47 .
drwxr-xr-x. 121 root root 12288 3月  15 15:40 ..
-rw-r--r--    1 root root    18 3月  23 2017 .bash_logout
-rw-r--r--    1 root root   176 3月  23 2017 .bash_profile
-rw-r--r--    1 root root   124 3月  23 2017 .bashrc
drwxr-xr-x.   2 root root  4096 11月 12 2010 .gnome2
drwxr-xr-x.   4 root root  4096 11月  6 11:36 .mozilla

这些文件是bash shell环境的标准启动文件。系统会自动将这些默认文件复制到你创建的每个用户的HOME目录。

你可以用默认系统参数创建一个新用户账户试一下,并检查一下新用户的HOME目录:

[root@localhost jingpan]# useradd -m test
[root@localhost jingpan]# ls -al /home/test/
总用量 28
drwx------  4 test test 4096 3月  15 15:59 .
drwxr-xr-x. 5 root root 4096 3月  15 15:59 ..
-rw-r--r--  1 test test   18 3月  23 2017 .bash_logout
-rw-r--r--  1 test test  176 3月  23 2017 .bash_profile
-rw-r--r--  1 test test  124 3月  23 2017 .bashrc
drwxr-xr-x  2 test test 4096 11月 12 2010 .gnome2
drwxr-xr-x  4 test test 4096 11月  6 11:36 .mozilla

默认情况下,useradd命令不会创建HOME目录,但是-m命令行选项会叫它创建HOME目录。

你能在例子中看到。useradd 命令创建了新的HOME目录,并将/etc/skel目录中的文件复制了过来。

 你可以用-D参数后跟一个代表要修改的值的参数,来修改系统默认的新用户值。

更改默认值非常简单:

[root@localhost jingpan]# useradd -D -s /bin/tsch
[root@localhost jingpan]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/tsch
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

6.1.4 删除用户

如果你想从系统中删除用户,userdel可以满足这个需求。默认情况下,userdel命令会只删除/etc/passwd文件中

的用户信息,而不会删除系统中属于该 账户的任何文件。


如果加上-r参数,userdel会删除用户的HOME目录以及mail目录。然而,系统上仍可能存有归已删除用户所有的其他文件。

这在有些环境中会造成问题。

下面是用userdel命令删除已有用户账户的一个例子:

[root@localhost jingpan]# userdel -r test
[root@localhost jingpan]# ls -al /home/test
ls: 无法访问/home/test: 没有那个文件或目录
[root@localhost jingpan]# 

加了-r参数后,用户之前的那个/home/test目录已经不存在了。

_____________________________________________________________________________________________________

警告:在有大量用户的环境中使用-r参数时要特别小心。你永远不知道用户是否在他的HOME目录下存放了

其他用户或其他程序要使用的重要文件。记住在删除用户的HOME目录之前一定要检查清楚!

——————————————————————————————————————————————

6.1.5   修改用户

Linux提供了一些不同的工具来修改已有用户账户信息。表6-3列出了这些工具。

命令                                            描述

usermod                            修改用户账户的字段,并可以指定主要组以及附加组的所属关系

passwd                               修改已有用户的密码

chpasswd                           从文件中读取登录名密码对,并更新密码

chage                                  修改密码的过期日期

chfn                                     修改用户账户的备注信息

chsh                                    修改用户账户的默认登录shell

1.usermod

usermod命令是用户账户修改工具中最强大的一个。它能用来修改/etc/passwd文件中的大部分字段,只需用与想修改的字段对应的命令行参数就可以了。参数大部分跟useradd命令的参数一样,比如-c用来修改备注字段,-e用来修改过期日期,-g用来修改默认的登录组。但还有一些实用的额外参数:

    -L用来锁定账户,这样用户就无法登录了;

    -U用来解除锁定,解除后用户就能登录了。

-L参数尤其实用。用这个参数就把账户锁定,用户就无法登录了,而不用删除账户和用户的数据。要让账户恢复正常,保要加-U参数就行了。

2.passwd和chpasswd

如果只用passwd命令,它会改变你自己的密码。系统上的任何用户都能改变他自己的密码,但只有root用户才有权限改变别人的密码。

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

chpasswd命令能让事情简单许多。chpasswd命令能从标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密,然后为用户账户设置。

3.chsh、chfn和chage工具专门用来修改特定的账户信息。chsh命令用来快速修改默认用户登录shell。使用时必须用shell的全路径名作为参数,不能只用shell名:

[root@localhost ~]# chsh -s /bin/bash  test
Changing shell for test.
Shell changed.

chfn命令提供了在/etc/passwd文件的备注字段中存储信息的标准方法。chfn命令将Unix的finger命令用到

的信息存进备注字段,而不是简单地存入一些随机文本(比如昵称之类的),或是将字段留空。finger命令可以用来

简单地查看Linux系统上的用户信息:

[root@localhost ~]# finger jingpan
Login: jingpan                          Name: 
Directory: /home/jingpan                Shell: /bin/bash
On since 五 3月 16 14:27 (CST) on pts/0 from 192.168.1.64
No mail.
No Plan.

说明  出于安全性的考虑,很多Linux系统管理员在系统上禁用finger命令。


如在使用chfn命令时不加参数,它会向你询问要存进备注字段的恰当值:

[root@localhost ~]# chfn test
Changing finger information for test.
Name [test]: IMa Test
Office [Director of Technology]: 
Office Phone [123456]: (123)555-1234
Home Phone [12345677]: (123)555-9876

Finger information changed.
[root@localhost ~]# finger test
Login: test                             Name: IMa Test
Directory: /home/test                   Shell: /bin/bash
Office: Director of Technology          Office Phone: (123)555-1234
Home Phone: (123)555-9876
On since 五 3月 16 14:59 (CST) on pts/2 from 192.168.1.64
   45 minutes 36 seconds idle
No mail.
No Plan.
[root@localhost ~]# 

查看/etc/passwd文件中的记录,你会看到下面这样的结果:

[root@localhost ~]# grep test /etc/passwd
test:x:503:504:IMa Test,Director of Technology,(123)555-1234,(123)555-9876:/home/test:/bin/bash

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

chage命令的日期值可以用下面两种方式中的任意一种:

    YYYY-MM-DD格式的日期;

    代表从1970年1月1日起到该日期天数的数值。

chage命令中有个好用的功能是设置账户的过期日期。通过它,你就能创建临时用户了。设定的

日期一过,临时账户就会自动过期,而不需要记住在那天去删除这些账户。过期的账户跟锁定的

账户很相似: 账户仍然存在,但用户无法用它登录。

6.2 使用Linux组

        用户账户在控制单个用户安全方面很惯用,但他们在允许一组用户共享资源时就捉襟见肘了。为了达到这个目的,Linux系统用了另外一给概念-----组(group)。

           组权限允许多个用户共享一组共用的权限来访问系统上的对象,比如文件、目录或设备之类(会在6.3节中细述)。

        每个组都有一个唯一的GID----跟UID类似,在系统上这是个唯一的数值。和GID一起的,每个给还有一个唯一的组名。Linux系统上有一些组工具可以用来创建和管理你自己的组。本节将细述组信息是如何保存的,以及如何用组工具来创建新组、修改已有的组。

6.2.1 /etc/group文件

类似于用户账户,组信息也保存在系统的一个文件中。/etc/group文件包含系统上用到的每个给信息。下面是一些来自Linux 系统上/etc/group文件中典型例子:

[jingpan@localhost ~]$ cat /etc/group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon
tty:x:5:
disk:x:6:
lp:x:7:daemon
mem:x:8:
kmem:x:9:
wheel:x:10:
mail:x:12:mail,postfix
uucp:x:14:
man:x:15:
games:x:20:
gopher:x:30:
video:x:39:
dip:x:40:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
dbus:x:81:
usbmuxd:x:113:
rpc:x:32:
utmp:x:22:
utempter:x:35:
rtkit:x:499:
avahi-autoipd:x:170:
desktop_admin_r:x:498:
desktop_user_r:x:497:
floppy:x:19:
vcsa:x:69:
abrt:x:173:
cdrom:x:11:
tape:x:33:
dialout:x:18:
wbpriv:x:88:
rpcuser:x:29:
nfsnobody:x:65534:
haldaemon:x:68:haldaemon
ntp:x:38:
apache:x:48:
saslauth:x:76:
postdrop:x:90:
postfix:x:89:
gdm:x:42:
pulse:x:496:
pulse-access:x:495:
fuse:x:494:
sshd:x:74:
slocate:x:21:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
tcpdump:x:72:
jingpan:x:500:
cgred:x:493:
radvd:x:75:
kvm:x:36:qemu
qemu:x:107:
nogroup:x:501:
nignx:x:502:
nginx:x:503:
test:x:504:

类似于UID,GID也是用特有的格式分配的。系统账户用的组通常会分配低于500的GID值,而用户组的GID会从500开始分配。/etc/group文件有4个字段:

    组名;

    组密码;

    GID;

    属于该给的用户列表。

 组密码允许非组内成员通过它临时性地成为该组成员。这个功能并不是非常通用,但确实存在。

千万不能直接修改/etc/group文件来添加用户到一个组,而要用usermod命令(在6.1节中介绍过)来添加。在添加用户到不同

的组之前,首先得创建组。

———————————————————————————————————————

说明 用户账户列表某种意义上有些误导人。你会发现在列表中,有些组并没有列出用户。这并不是说,这些给没有成员。

当一个用户在/etc/passwd文件中指定某个给作为默认给时,用户账户不会作为该组成员再出现在/etc/group文件中。多年

来被这人问题难倒过的系统管理员可不是一个两个。

______________________________________________________________________________________________

6.2.2 创建新组

groupadd命令用来在系统上创建新组:

[root@localhost jingpan]# /usr/sbin/groupadd shared
[root@localhost jingpan]# tail /etc/group
jingpan:x:500:
cgred:x:493:
radvd:x:75:
kvm:x:36:qemu
qemu:x:107:
nogroup:x:501:
nignx:x:502:
nginx:x:503:
test:x:504:
shared:x:505:

在创建新组时,默认没用用户属于该给成员。groupadd命令没有提供将用户添加到组的选项,

但可以用usermod命令添加用户到该组:

[root@localhost jingpan]# /usr/sbin/usermod -G shared rich
[root@localhost jingpan]# /usr/sbin/usermod -G shared test
[root@localhost jingpan]# tail /etc/group
cgred:x:493:
radvd:x:75:
kvm:x:36:qemu
qemu:x:107:
nogroup:x:501:
nignx:x:502:
nginx:x:503:
test:x:504:
shared:x:505:test,rich
rich:x:506:
[root@localhost jingpan]# 

shared组在有两个成员,test和rich。usermod命令的-G参数会把这个新组添加到用户账号的组列表里。

______________________________________________________________________________________________


说明 如果更改了已登录系统账户所属的用户组,该用户必须登出系统扣再登录,组关系的更改才能生效。

________________________________________________________________________________________

++++++++++++++++++++++++++++++++++++++++++++++++++++++

警告    在将组添加到用户账户时要格外小心。如果加了-g参数,指定的给名会替换掉该账户的默认组。-G参数则将该给添加到用户的属组的列表里,而不会影响默认组。

++++++++++++++++++++++++++++++++++++++++++++++++++++++

6.2.3 修改组

    我们在/etc/group文件中看到,组信息并不多,也没什么可修改的。groupmod命令可以修改已有给的GID(加-g参数)或组名(加-n参数):

[root@localhost jingpan]# /usr/sbin/groupmod -n sharing shared
[root@localhost jingpan]# tail /etc/group
cgred:x:493:
radvd:x:75:
kvm:x:36:qemu
qemu:x:107:
nogroup:x:501:
nignx:x:502:
nginx:x:503:
test:x:504:
rich:x:506:
sharing:x:505:test,rich
[root@localhost jingpan]# 

修改组名时,GID和组成员不会变,只有给名会改变。由于的有的安全权限都是基于GID的,

你可以随意改变组名而不会影响文件的安全性。

6.3 理解文件权限

现在你已经了解了用户和组,可以进一步了解ls命令时输出的神秘文件权限了。本节将会介绍如何对权限进行解码以及它们来来历。

6.3.1 使用文件权限符

如果你还记得第3章,那应该知道ls命令可以用来查看Linux系统上的文件、目录和设备的权限:

[root@localhost linux]# ls -l
总用量 496
drwxr-xr-x 2 root    root      4096 2月  28 11:40 ch4
-rw-rw-r-- 1 jingpan jingpan 245760 2月  28 16:55 ch4.tar
-rw-r--r-- 1 root    root    230903 2月  28 11:32 ch4.zip
drwxr-xr-x 2 root    root      4096 3月   3 10:30 ch5
drwxrwxr-x 2 jingpan jingpan   4096 1月  30 15:06 dir1
drwxrwxr-x 2 jingpan jingpan   4096 1月  30 15:07 dir2
-rwxr-xr-x 1 root    root      6469 3月   3 09:52 myprog
-rw-rw-r-- 1 jingpan jingpan     11 1月  30 15:33 test1
-rw-rw-r-- 1 jingpan jingpan      0 1月  30 15:00 test2
-rw-rw-r-- 1 jingpan jingpan      0 1月  30 14:57 test3
-rw-rw-r-- 1 jingpan jingpan      0 1月  30 15:35 test4
lrwxrwxrwx 1 jingpan jingpan      5 1月  30 15:36 test5 -> test1
[root@localhost linux]# 

输出结果的第一个字段是描述文件和目录权限的码。这个字段的第一个字符代表了对象的类型:

        -代表文件;

        d代表目录;

         l代表链接;

         c代表字符型设备;

         b代表块设备

         n代表网络设备。

          之后有3组三字符的码。每一组三字符码表示三重访问权限:

           r代表对象是可读的;

           w代表对象是可写的;

           x代表对象是可执行的。

    如果没有某种权限,在该权限位会出现单破折线。这3组三字码分别对应对象的3个安全级别:

         对象的属主;

         对象的属组;

          系统其他用户。

 6.3.2 默认文件权限 


[jingpan@localhost ~]$ touch newfile
[jingpan@localhost ~]$ ls -al newfile 
-rw-rw-r-- 1 jingpan jingpan 0 3月  30 11:51 newfile
[jingpan@localhost ~]$ umask
0002
[jingpan@localhost ~]$ 

文件,全权限的值是666(所用用户都有读和写的权限),而对于目录来说,是777(所有用户都有读、写、执行权限)。在上面的例子中,文件一开始的权限是666,然后umask值002作用后,剩下的文件权限就成了664

umask值通常会在/etc/profile启动文件中设置,你可以用umask命令为默认umask设置指定一个新值:

[jingpan@localhost ch6]$ umask 026
[jingpan@localhost ch6]$ touch newfile2
[jingpan@localhost ch6]$ ls -l newfile2
-rw-r----- 1 jingpan jingpan 0 4月   4 08:38 newfile2

在把umask值设成026后,默认的文件权限变成了640,因此新文件现在对属组成员来说是只读的,而系统里的其他成员则没有任何权限。

umask值同样会作用在创建目录上:

[jingpan@localhost ch6]$ ls -l
总用量 4
drwxr-x--x 2 jingpan jingpan 4096 4月   4 08:48 newdir
-rw-r----- 1 jingpan jingpan    0 4月   4 08:38 newfile2

由于目录的默认权限是777,umask作用后生成目录权限不同于生成的文件权限。umak会从777

中减去,留下来751作为目录权限设置。

6.4 改变安全性设置

如果你已经创建了一个目录或文件而需要改变它的安全性设置,在Linux系统上有一此不同的工具能完成这个功能。本节将告诉你如何更忙文件和目录的已有权限、默认文件属主及默认属组。

6.4.1 改变权限

    chmod命令用来改变文件和目录的安全性设置。chmod命令的格式如下:

chmod [-cfvR] [--help] [--version] mode file...

mod 参数可跟个八进制模式或符号模式来设置安全性设置。八进制模式设置非常直接,直接用期望赋予文件的标准的4位八进制权限码:

[root@localhost ~]# chmod 760 newfile 
[root@localhost ~]# ls -l newfile 
-rwxrw----. 1 root root 0 5月  29 17:18 newfile

符号模式

与通常用到的3组三字符权限字符不同,chmod命令用了另外一种实现。下面是在符号模式下的权限格式:

[ugoa...][[+-=][rwxX]...][,...]

这么使用这些权限

[root@localhost ~]# chmod o+r newfile
[root@localhost ~]# ls -l newfile
-rwxrw-r--. 1 root root 0 5月  29 17:18 newfile

不管其他用户在这一安全级别之前都有什么权限,o+r给这上级别添加了读取权限。

[root@localhost ~]# chmod u-x newfile
[root@localhost ~]# ls -l newfile 
-rw-rw-r--. 1 root root 0 5月  29 17:18 newfile

u-x移除了属主已有的执行权限。

-R参数可以让权限的改变递归地作用到文件和子目录。可以在指定文件名时通配符将权限的更改通过一个命令作用到多个文件上。

6.4.2改变所属关系

有时你需要改变文件的属主,比如有人离职或开发了人员创建了一个在软件,运行时需要归属在系统账户下的应用,Linux提供了两个命令来完成这个功能:chown命令用来改变文件的属主,chgrp命令用来改变文件的默认属组。

chown命令的格式如下:

chown options owner[.group] file

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

[root@localhost ~]# chown dan newfile 
[root@localhost ~]# ls -l
总用量 0
-rw-rw-r--. 1 dan root 0 5月  29 17:18 newfile

非常简单。chown命令也支持同时改变文件的属主和属组:

[root@localhost ~]# chown dan.shared newfile
[root@localhost ~]# ls -l
总用量 0
-rw-rw-r--. 1 dan shared 0 5月  29 17:18 newfile

还可以这样改变一个目录的默认属组:

[root@localhost ~]# chown .root newfile
[root@localhost ~]# ls -l
总用量 0
-rw-rw-r--. 1 dan root 0 5月  29 17:18 newfile

最后,如果要改成和用户登录名匹配的组名,可以这个操作:

[root@localhost ~]# chown dan. newfile
[root@localhost ~]# ls -l
总用量 0
-rw-rw-r--. 1 dan dan 0 5月  29 17:18 newfile

chown命令采用一些不同的选项参数。-R参数加通配符可以递归地改变子目录和文件的所属关系。-h参数可以改变该文件的所有符号链接文件的所属关系。

说明 只有root用户能够改变文件的属主。任何属主都可以改变文件的属组,但前提是属主必须是源和目标属组的成员。

chgrp命令可以很方便地更改文件或目录的默认属组。

[root@localhost ~]# chgrp shared newfile
[root@localhost ~]# ls -l
总用量 0
-rw-rw-r--. 1 dan shared 0 5月  29 17:18 newfile

现在shared组的任意一个成员都可以写这个文件了。这是Linux系统共享文件的一个途径。然而,在系统上给一组人共享一个文件很复杂。下一节会介绍如何做。

6.5 共享文件

可能你已经猜到了,创建组是Linux系统上共享文件访问权限方法。但在一个完整的共享文件的环境中,事情会复杂得多。

6.3节中你已经看到,创建新文件时,Linux会用默认的UID和GID来给文件分配权限。想让其他人也能访问文件,你要么改变其他用所在安全的访问权限,要么就给文件分配 一个新的包含其他用户的默认属组。

如果你想在大的环境中创建文档并将文档与人共享,这会很烦琐。幸好有解决这个问题的简单方法。

Linux还为每个文件和目录存储了3个额外的信息位。

    设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。

    设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组

    粘着位:进程结束后文件还会在内存中。

SGID位对于文件共享非常重要。使能了SGID位,你能让在一个共享目录下创建的新文件都属于该目录的属组,也就是每个用户的组。

SGID可通过chmod命令设置。它会加到标准3位八进制之前(组成4位八进制值),或者在符号模式下用符号s。

因此,要创建一个共享目录,使目录里的新文件都能没用目录的属组,你只需将该目录的SGID位置位:

[root@localhost /]# mkdir testdir
[root@localhost /]# ll
drwxrwxr-x.   2 root root    6 5月  30 14:17 testdir

[root@localhost /]# chgrp shared testdir
[root@localhost /]# chmod g+s testdir
[root@localhost /]# ls -l
drwxrwsr-x.   2 root shared    6 5月  30 14:17 testdir
[root@localhost /]# umask 002
[root@localhost /]# cd testdir/
[root@localhost testdir]# usermod -a -G shared rich
[root@localhost testdir]# su rich
[rich@localhost testdir]$ pwd
/testdir
[rich@localhost testdir]$ touch testfile
[rich@localhost testdir]$ ll
总用量 0
-rw-rw-r--. 1 rich shared 0 5月  30 14:20 testfile

首先,用mkdir命令创建希望共享的目录。其次,通过chgrp 命令修改目录的默认属组为shared,最后将SGID位置位,以保证目录 中新建文件都shared作为默认属组。

为了让这个环境能正常工作,所有组成员都需要把他们的umask值设置成文件的属组成员可写。umask改成了002。

做完了这些,组成员就能到共享目录下创建新文件了。跟期望的一样,新文件会没用目录的属组,而不是用户的默认属组。现在shared组的所有用户都能访问这个文件了。

6.6 小结

本章讨论了管理Linux系统安全性需要知道的一些命令行命令。Linux通过用户ID和组ID来限制对文件、目录以及设备的访问。Linux将用户的信息存储在/etc/passwd文件中,将组信息存储在/etc/group文件中。每个用户都会被分配一人唯一的用户ID,以及在系统中识别用户的文本登录名。组也会被分配一个唯一的组ID以及级名。组可以包含一个或多个用户以支持对系统资源的共享访问。

有若干命令可以用来管理用户账户和组。useradd命令来创建新的用户账户,groupadd命令来创建新的组账户。修改已有用户账户,我们用useradd命令。类似的groupmod命令用来修改组账户信息。

Linux 采用复杂的位系统来判定文件和目录的访问权限。每个文件都有3个安全等级:文件的属主、有访问文件权限的默认属组,以及系统上的其他用户。每个安全等级通过3个访问权限位来定义:读取、写入能及执行。如果权限被否定了,权限对应的符号会用单破折线代替(比如r--代表只读权限)。

符号权限通常以八进制值被引用。每个八进制都是由3个二进制位组合而成。而3个八进制值代表着3个安全等级。umask命令用设置系统上创建的文件和目录的默认安全设置。系统管理员通常会在/etc/profile文件中设置一个默认的umask值,但你可可以随时通过umask命令修改自己的umask值。

chmod命令用来修改文件和目录的安全设置。只有文件的属主才能改变文件或目录的权限。但root用户也可以改变系统任意文件或目录的安全设置。chown和chgrp命令可以用来改变文件默认的属主和数组。

最后 ,本章以如何使用设置组ID位来创建共享目录结尾。SGID位会强制某个目录下创建的新文件或目录都沿用该父目录的属组,而不是创建这些文件的用户的属组。这可以为系统的用户之间共享文件提供一个简便的途径。

现在你已以了解了文件权限,下面就可以进一步了解如何在Linux上处理真实的文件系统。下一章将会介绍如何从命令行在Linux上创建新的分区,以及如何格式化新分区以使在Linux虚拟目录中使用;.


你可能感兴趣的:(Linux,命令行与shell编程)