《快乐的Linux命令行》学习记录——第九章权限

版权声明:扫我头像就可以向我提问,共同提高:) https://blog.csdn.net/u011436427/article/details/84384204

Unix 传统中的操作系统不仅是多任务系统,而且也是多用户系统。这到底意味着什么?它意味着多个用户可以在同一时间使用同一台计算机。
eg:如果一台计算机连接到一个网络或者因特网,那么远程用户通过 **ssh(安全shell)**可以登录并操纵这台电脑。事实上,远程用户也能运行图形界面应用程序,并且图形化的输出结果会出现在远端的显示器上。

为了使多用户特性付诸实践,那么必须发明一种方法来阻止用户彼此之间受到影响。毕竟,一个用户的行为不能导致计算机崩溃,也不能乱动属于另一个用户的文件。

在这一章中,我们将看看这一系统安全的本质部分,会介绍以下命令:
• id –显示用户身份号
• chmod –更改文件模式
• umask –设置默认的文件权限
• su –以另一个用户的身份来运行 shell
• sudo –以另一个用户的身份来执行命令
• chown –更改文件所有者
• chgrp –更改文件组所有权
• passwd –更改用户密码

1.拥有者,组成员,和其他人

在 Unix 安全模型中,一个用户可能拥有文件和目录。
对该用户而言,,对这个文件或目录的具有访问控制权
对用户组而言,用户属于一个由一个或多个用户组成的用户组,用户组成员由文件和目录的所有者授予对文件和目录的访问权限。除了对一个用户组授予权限之外,文件所有者可能会给每个人一些权限。

eg:先用file指令判断文件类型

[me@linuxbox ~]$ file /etc/shadow
/etc/shadow: regular file, no read permission
[me@linuxbox ~]$ less /etc/shadow
/etc/shadow: Permission denied

用 id 命令,来找到关于你自己身份的信息(Fedora 系统)

[me@linuxbox ~]$ id
uid=500(me) gid=500(me) groups=500(me)

用 id 命令,来找到关于你自己身份的信息(Ubuntu 系统)

扫描二维码关注公众号,回复: 4938360 查看本文章

[me@linuxbox ~]$ id
uid=1000(me) gid=1000(me)
groups=4(adm),20(dialout),24(cdrom),25(floppy),29(audio),30(dip),44(v
ideo),46(plugdev),108(lpadmin),114(admin),1000(me)

1)当用户创建帐户之后,系统会给用户分配一个号码,叫做用户 ID或者 uid,这个 ID 映射到一个用户名。

2)系统又会给这个用户分配一个原始的组 ID 或者是 gid,这个 gid 可能属于另外的组。

3)正如我们能看到的,两个系统中用户的 uid 和 gid 号码是不同的。原因很简单,因为
Fedora 系统从 500 开始进行普通用户帐户的编号,而 Ubuntu 从 1000 开始。

4)用户帐户定义在/etc/passwd 文件里面,对于每个用户帐号,文件/etc/passwd 定义了用户(登录)名, uid, gid,帐号的真实姓名,主目录,和登录 shell;
用户组定义在/etc/group 文件里面;
用户帐户和用户组创建以后,这些文件随着文件/etc/shadow 的变动而修改,文件/etc/shadow 包含了关于用户密码的信息;

5)超级用户(uid 0)帐号

6)现在的Linux 会创建一个独一无二的,只有一个成员的用户组,这个用户组与用户同名。这样使某种类型的权限分配更容易些。eg:普通用户分配到一个公共的用户组中,例如“users”。

2.读取,写入,和执行

1)对于文件和目录的访问权力是根据读访问,写访问,和执行访问来定义的。

2)

[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt

列表的前十个字符是文件的属性。
这十个字符的第一个字符表明文件类型。剩下的九个字符(rwx位),叫做文件模式,代表着文件所有者,文件组所有者,和其他人的读,写,执行权限(执行查看)。

在这里插入图片描述
在这里插入图片描述

3.chmod -更改文件或目录的模式

1)注意只有文件的所有者或者超级用户才能更改文件或目录的模式。

2)chmod 命令支持两种不同的方法来改变文件模式:八进制数字表示法,或符号表示法

八进制数字表示法
通过八进制表示法,我们使用八进制数字来设置所期望的权限模式(映射到用来存储文件的模式)。
通过使用 3 个八进制数字,我们能够设置文件所有者,用户组,和其他人的权限。
在这里插入图片描述

eg:

[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:52 foo.txt
[me@linuxbox ~]$ chmod 600 foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw------- 1 me me 0 2008-03-06 14:52 foo.txt

说明:
a)传递参数“600”,设置文件所有者的权限为读写权限,而删除用户组和其他人的所有权限。
b)常见的参数有:7 (rwx), 6 (rw-), 5 (r-x), 4 (r–), and 0 (—)。

符号表示法
符号表示法分为三部分:更改会影响谁,要执行哪个操作,要设置哪种权限
通过字符“u”,“g”,“o”, and “a”的组合来指定要影响的对象,如下所示:
在这里插入图片描述

说明:
如果没有指定字符,则假定使用“all”;
执行的操作可能是一个“+”字符,表示加上一个权限;
一个“—”,表示删掉一个权限;
一个“=”,表示只有指定的权限可用,其它所有的权限被删除。
权限由“r” , “w” , and “x”来指定;

eg一些符号表示法的实例:
在这里插入图片描述

八进制表示法与符号表示法的区别:
符号表示法的优点是,允许你设置文件模式的单个组成部分的属性,而没有影响其他的部分。

4.借助 GUI 来设置文件模式

在 Nautilus (GNOME) 和 Konqueror (KDE) 中,右击一个文件或目录图标将会弹出一个属性对话框。下面这个例子来自 KDE 3.5:

在这里插入图片描述

说明:
从这个对话框中,我们看到可以设置文件所有者,用户组,和其他人的访问权限。
在 KDE中,右击 “Advanced Permissions” 按钮,会打开另一个对话框,这个对话框允许你单独设置各个模式属性。这也可以通过命令行来理解!

5.umask -设置默认权限

1)当创建一个文件时, umask 命令控制着文件的默认权限。

umask 命令使用八进制表示法来表达从文件模式属性中删除一个位掩码。

eg:

[me@linuxbox ~]$ rm -f foo.txt
[me@linuxbox ~]$ umask
0002
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2008-03-06 14:53 foo.txt

说明:
首先,删除文件 foo.txt,以此确定我们从新开始;
下一步,运行不带参数的 umask 命令,看一下当前的掩码值,响应的数值是 0002(0022 是另一个常用值),这个数值是掩码的八进制表示形式;
下一步,我们创建文件 foo.txt(注意这个创建方法),并且保留它的权限。

结果:我们可以看到文件所有者和用户组都得到读权限和写权限,而其他人只是得到读权限。其他人没有得到写权限的原因是由掩码值决定的。

2)把掩码展开成二进制形式,然后与文件属性相比较,如下:

先忽略掉开头的三个零(我们一会儿再讨论),注意掩码中若出现一个数字 1,则删除文件模式中和这个 1 在相同位置的属性,在这是指其他人的写权限。这就是掩码要完成的任务。掩码的二进制形式中,出现数字 1 的位置,相应地关掉一个文件模式属性。

当掩码设置为 0000(实质上是关掉它)之后,我们看到其他人能够读写文件。
在这里插入图片描述

掩码0022 的作用:二进制中数字 1 出现的位置,相对应的属性被删除。

在这里插入图片描述

eg:

[me@linuxbox ~]$ rm foo.txt
[me@linuxbox ~]$ umask 0000
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-rw- 1 me me 0 2008-03-06 14:58 foo.txt

3)掩码什么时候使用?
大多数情况下,你不必修改掩码值,系统提供的默认掩码值就很好了。然而,在一些高安
全级别下,你要能控制掩码值。

一些特殊权限:就是前面就说的开头的四个零

除了读取,写入,和执行权限之外,还有其它的,较少用到的权限设置。
1) setuid 位(八进制 4000)
当应用到一个可执行文件时,它把有效用户 ID 从真正的用户(实际运行程序的用户)设置成程序所有者的 ID;
这种操作通常会应用到一些由超级用户所拥有的程序。
当一个普通用户运行一个程序,这个程序由根用户 (root) 所有,并且设置了 setuid 位,这个程序运行时具有超级用户的特权,这样程序就可以访问普通用户禁止访问的文件和目录;

2)setgid 位(八进制 2000)
这个相似于 setuid 位,把有效用户组 ID 从真正的用户组 ID 更改为文件所有者的组 ID;
如果设置了一个目录的 setgid 位,则目录中新创建的文件具有这个目录用户组的所有权,而不是文件创建者所属用户组的所有权;
对于共享目录来说,当一个普通用户组中的成员,需要访问共享目录中的所有文件,而不管文件所有者的主用户组时,那么设置 setgid 位很有用处;

3) sticky 位(八进制 1000)
如果一个目录设置了 sticky 位,那么它能阻止用户删除或重命名文件,除非用户是这个目录的所有者,或者是文件所有者,或是超级用户;
这个经常用来控制访问共享目录,比方说/tmp;

4)用chmod 命令和符号表示法,来设置这些特殊的权限,如下:

授予一个程序 setuid 权限。
chmod u+s program

授予一个目录 setgid 权限:
chmod g+s dir

授予一个目录 sticky 权限:
chmod +t dir

当浏览 ls 命令的输出结果时,你可以确认这些特殊权限如下:

一个程序被设置为 setuid 属性
-rwsr-xr-x

具有 setgid 属性的目录
drwxrwsr-x

设置了 sticky 位的目录:
drwxrwxrwt

6.更改身份

1) 注销系统并以其他用户身份重新登录系统。
2)使用 su 命令。
3)使用 sudo 命令。

7. su -以其他用户身份和组 ID 运行一个 shell

1)su 命令用来以另一个用户的身份来启动 shell,语法如下:
su [-[l]] [user]

说明:
a)如果包含 “-l” 选项,那么会为指定用户启动一个需要登录的 shell。这意味着会加载此用户的 shell 环境,并且工作目录会更改到这个用户的主目录;
b)如果不指定用户,那么就假定是超级用户;
c)选项 “-l” 可以缩写为”-”,这是经常用到的形式;

eg:

[me@linuxbox ~]$ su -
Password:
[root@linuxbox ~]# exit
[me@linuxbox ~]$

说明:
shell 提示我们输入超级用户的密码;
进入超级用户:提示符的末尾字符是 “#” 而不是”$”,并且当前工作目录是超级用户的主目录(通常是/root);
一旦进入一个新的 shell,我们能执行超级用户所使用的命令;
输入 “exit”,则返回到原来的 shell;

2)把命令用单引号引起:使用这种模式,命令传递到一个新 shell 中执行
以这样的方式使用 su 命令,也可以只执行单个命令,而不是启动一个新的可交互的 shell:
su -c ‘command’

eg:

[me@linuxbox ~]$ su -c ‘ls -l /root/*’
Password:
-rw------- 1 root root 754 2007-08-11 03:19 /root/anaconda-ks.cfg
/root/Mail:
total 0
[me@linuxbox ~]$

8.sudo -以另一个用户身份执行命令

sudo 命令在很多方面都相似于 su 命令,但是 sudo 还有一些非常重要的功能:
1) sudo 命令,从而允许一个普通用户以不同的身份(通常是超级用户),通过一种非常可控的方式来执行命令。
2) sudo 命令不要求超级用户的密码。使用 sudo 命令时,用户使用他/她自己的密码来认证。
3)su 和 sudo 之间的一个重要区别是 sudo 不会重新启动一个 shell,也不会加载另一个用户的 shell 运行环境。这意味者命令不必用单引号引起来。

eg:sudo 命令经过配置,允许我们运行一个虚构的备份程序,叫做 “backup script”,这个程序要求超级用户权限。

[me@linuxbox ~]$ sudo backup_script
Password:
System Backup Starting…

4)Ubuntu 与 sudo
默认情况下, Ubuntu不允许用户登录到 root 帐号(因为不能为 root 帐号设置密码),而是使用 sudo 命令授予普通用户超级用户权限。

9. chown -更改文件所有者和用户组

1)chown 命令被用来更改文件或目录的所有者和用户组。使用这个命令需要超级用户权限
语法如下:

chown [owner][:[group]] file…

2)chown 命令可以更改文件所有者和/或文件用户组,依据于这个命令的第一个参数。
eg:
在这里插入图片描述
在这里插入图片描述

2)eg:
我们有两个用户, janet拥有超级用户访问权限,而 tony 没有。
用户 jant 想要从她的主目录复制一个文件到用户 tony 的主目录。因为用户 jant 想要 tony 能够编辑这个文件, janet 把这个文件的所有者更改为 tony:

[janet@linuxbox ~]$ sudo cp myfile.txt ~tony
Password:
[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt
-rw-r–r-- 1 root root 8031 2008-03-20 14:30 /home/tony/myfile.txt
[janet@linuxbox ~]$ sudo chown tony: ~tony/myfile.txt
[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt
-rw-r–r-- 1 tony tony 8031 2008-03-20 14:30 /home/tony/myfile.txt

说明:
a)利用sudo命令,用户 janet 把文件从她的目录复制到 tony 的主目录。
b)下一步, janet 把文件所有者从 root(使用 sudo 命令的原因)改到 tony。
在这里插入图片描述
c)通过在第一个参数中使用末尾的 “:” 字符,janet 同时把文件用户组改为 tony 登录系统时的所属的用户组。
d)注意,第一次使用 sudo 命令之后,为什么(shell)没有提示 janet 输入她的密码?这是因为,在大多数的配置中, sudo 命令会相信你几分钟,直到计时结束。

10.chgrp -更改用户组所有权

chgrp 命令与 chown 命令使用起来很相似

11.练习使用权限

假想我们有两个用户,他们分别是 “bill” 和 “karen”,他们愿意设置一个共享目录。这个共享目录中,他们分别以 Ogg Vorbis 或 MP3 的格式来存储他们的音乐文件。通过 sudo命令,用户 bill 具有超级用户访问权限

1)第一步,创建一个以 bill 和 karen 为成员的用户组
使用图形化的用户管理工具, bill 创建了一个叫做 music 的用户组,并且把用户 bill 和 karen 添加到用户组music 中。
在这里插入图片描述

2)下一步, bill 创建了存储音乐文件的目录:

[bill@linuxbox ~]$ sudo mkdir /usr/local/share/Music
password:

3)这个目录创建之后,它具有以下所有权和权限:
正如我们所见到的,这个目录由 root 用户拥有,并且具有权限 755。

[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxr-xr-x 2 root root 4096 2008-03-21 18:05 /usr/local/share/Music

4)为了使这个目录共享,允许(用户 karen)写入, bill 需要更改目录用户组的所有权和权限。

[bill@linuxbox ~]$ sudo chown :music /usr/local/share/Music
[bill@linuxbox ~]$ sudo chmod 775 /usr/local/share/Music
[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxrwxr-x 2 root music 4096 2008-03-21 18:05 /usr/local/share/Music

说明:
a)上面最后一行的意思是,现在我们拥有一个目录,/usr/local/share/Music,这个目录由 root 用户拥有,并且允许用户组 music 读取和写入
b)用户组 music 有两个成员bill 和 karen,这样 bill 和 karen 能够在目录/usr/local/share/Music 中创建文件。其他用户能够列出目录中的内容,但是不能在其中创建文件。

5)通过我们目前所拥有的权限,在 Music 目录中创建的文件,只具有用户 bill 和 karen 的普通权限:

[bill@linuxbox ~]$ > /usr/local/share/Music/test_file
[bill@linuxbox ~]$ ls -l /usr/local/share/Music
-rw-r–r-- 1 bill bill 0 2008-03-24 20:03 test_file

存在的问题如下:
a)系统中默认的掩码值是 0022,这会禁止用户组成员编辑属于同组成员的文件。
我们将把用户 bill 和 karen 使用的掩码值改为 0002,所以用户组成员需要在同组
其他成员创建的目录中创建文件和目录。
b)用户组成员创建的文件和目录的用户组,将会设置为用户的主要组,而不是用户组 music。通过设置此目录的 setgid 位来解决这个问题:

[bill@linuxbox ~]$ sudo chmod g+s /usr/local/share/Music
[bill@linuxbox ~]$ ls -ld /usr/local/share/Music
drwxrwsr-x 2 root music 4096 2008-03-24 20:03 /usr/local/share/Music

6)现在测试一下,看看是否新的权限解决了这个问题。bill 把他的掩码值设为 0002,删除先前的测试文件,并创建了一个新的测试文件和目录:

[bill@linuxbox ~]$ umask 0002
[bill@linuxbox ~]$ rm /usr/local/share/Music/test_file
[bill@linuxbox ~]$ > /usr/local/share/Music/test_file
[bill@linuxbox ~]$ mkdir /usr/local/share/Music/test_dir
[bill@linuxbox ~]$ ls -l /usr/local/share/Music
drwxrwsr-x 2 bill music 4096 2008-03-24 20:24 test_dir
-rw-rw-r-- 1 bill music 0 2008-03-24 20:22 test_file
[bill@linuxbox ~]$

说明:最终我们需要的到的结果如下
a)现在,创建的文件和目录都具有正确的权限,允许用户组 music 的所有成员在目录 Music中创建文件和目录。
b)这里的umask是短暂的。

12.更改用户密码

1)如果你具有超级用户权限)。使用 passwd 命令,来设置或更改用户密码。
语法如下:
passwd [user]

2)只要输入 passwd 命令,就能更改你的密码。shell 会提示你输入你的旧密码和你的新密码:

[me@linuxbox ~]$ passwd
(current) UNIX password:
New UNIX password:

3)如果你具有超级用户权限,你可以指定一个用户名作为 passwd 命令的参数,这样可以设置另一个用户的密码。

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/84384204
今日推荐