Linux 广泛的被很多用户所接受,它强大的功能受到很多人喜欢,Linux 文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具或cp工具等。Linux 文件的删除方式是用 rm 命令。
Linux 文件类型和 Linux 文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如 file.txt、file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在 Linux 文件类型中衡量的话,大多是常规文件(也被称为普通文件)。
Linux 文件类型常见的有:普通文件、目录、字符设备文件、块设备文件、符号链接文件等;现在我们
进行一个简要的说明;
ls -lh apt-fast.conf
-rw-r--r-- 1 root root 4.8K 11月 25 2022 apt-fast.conf
我们用 ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r–r-- ,值得注意的是第一个符号是 - ,这样的文件在 Linux 中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具或cp工具等。这类文件的删除方式是用 rm 命令
ls -lh
总用量 28K
drwxr-xr-x 2 root root 4.0K 1月 1 2015 protected.d
drwxr-xr-x 2 root root 4.0K 1月 1 2015 repos.d
drwxr-xr-x 2 root root 4.0K 1月 1 2015 vars
-rw-r--r-- 1 root root 444 1月 1 2015 version-groups.conf
-rw-r--r-- 1 root root 190 1月 1 2015 yum.conf
-rw-r--r-- 1 root root 19 1月 1 2015 yum-daily.yum
-rw-r--r-- 1 root root 46 1月 1 2015 yum-weekly.yum
当我们在某个目录下执行,看到有类似 drwxr-xr-x ,这样的文件就是目录,目录在 Linux 是一个比较特殊的文件。注意它的第一个字符是 d。创建目录的命令可以用 mkdir 命令,或 cp 命令,cp 可以把一个目录复制为另一个目录。删除用 rm 或 rmdir 命令。
如时您进入/dev 目录,列一下文件,会看到类似如下的;
ls -al /dev/tty
crw-rw-rw- 1 root tty 5, 0 8月 19 14:09 /dev/tty
ls -al /dev/nvme0n1
brw-rw---- 1 root disk 259, 0 8月 15 13:51 /dev/nvme0n1
我们看到/dev/tty的属性是 crw-rw-rw- ,注意前面第一个字符是 c ,这表示字符设备文件。比如串口设备等
我们看到/dev/nvme0n1的属性是 brw-rw---- ,注意前面的第一个字符是 b,这表示块设备,比如硬盘,光驱等设备;
这个种类的文件,是用 mknode 来创建,用 rm 来删除。目前在最新的 Linux 发行版本中,我们一般不用自己来创建设备文件。因为这些文件是和内核相关联的。
当我们启动 DOCKER时,会产生一个docker.sock的文件。
ls -lh /run/docker.sock
srw-rw---- 1 root docker 0 8月 15 13:51 /run/docker.sock
注意这个文件的属性的第一个字符是 s。我们了解一下就行了。
ls -lh vtrgb
lrwxrwxrwx 1 root root 23 11月 17 2022 vtrgb -> /etc/alternatives/vtrgb
当我们查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是 l,这类文件是链接文件。是通过
ln -s 源文件名 新文件名。上面是一个例子,表示vtrgb是/etc/alternatives/vtrgb的软链接文件。怎么理解呢?
这和 Windows 操作系统中的快捷方式有点相似。
符号链接文件的创建方法举例;
ls -lh kernel-6.15-1.2025_FC5.i686.rpm
-rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
ln -s kernel-6.15-1.2025_FC5.i686.rpm kernel.rpm
ls -lh kernel*
-rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
lrwxrwxrwx 1 root root 33 04-19 11:27 kernel.rpm -> kernel-6.15-1.2025_FC5
Linux 系统是一个典型的多用户系统,不同的用户处于不同的地位。为了保护系统的安全性,Linux系统对不同用户访问同一文件的权限做了不同的规定。
对于一个 Linux 系统中的文件来说,它的权限可以分为三种:读的权限、写的权限和执行的权限,分别用 r、w 和 x 表示。不同的用户具有不同的读、写和执行的权限。
对于一个文件来说,它都有一个特定的所有者,也就是对文件具有所有权的用户。同时,由于在Linux 系统中,用户是按组分类的,一个用户属于一个或多个组。文件所有者以外的用户又可以分为文件所有者的同组用户和其它用户。因此,Linux 系统按文件所有者、文件所有者同组用户和其它用户三类规定不同的文件访问权限。
Linux 文件系统安全模型是通过给系统中的文件赋予两个属性来起作用的,这两个赋予每个文件的属性称为所有者(ownership)和访问权限(access rights)。Linux 下的每一个文件必须严格地属于一个用户和一个组。
下图是在我机器上的/root 目录下运行 ls -l 命令的情况
ll
总用量 64
drwx------ 7 root root 4096 3月 19 17:13 ./
drwxr-xr-x 27 root root 4096 5月 13 16:21 ../
-rw------- 1 root root 17319 3月 31 15:12 .bash_history
-rw-r--r-- 1 root root 3106 4月 9 2018 .bashrc
drwx------ 4 root root 4096 6月 27 13:13 .cache/
drwx------ 3 root root 4096 2月 20 2023 .config/
-rw-r--r-- 1 root root 97 5月 24 2023 .gitconfig
drwx------ 3 root root 4096 11月 17 2022 .gnupg/
-rw-r--r-- 1 root root 148 8月 17 2015 .profile
drwxr-xr-x 7 root root 4096 1月 17 2023 snap/
drwx------ 2 root root 4096 4月 7 2023 .ssh/
- -rw-r–r–: 这些符号用来描述文件的访问权限类别,也就是常说的文件权限。这些访问权限指导 Linux 根据文件的用户和组所有权来处理所有访问文件的用户请求。总共有 10 种权限属性,因此一个权限列表总是10 个字符的长度。它的格式遵循下列规则:
- 第 1 个字符表示一种特殊的文件类型。其中字符可为 d(表示该文件是一个目录)、b(表示该文件是一个系统设备,使用块输入/输出与外界交互,通常为一个磁盘)、c(表示该文件是一个系统设备,使用连续的字符输入/输出与外界交互,如串口和声音设备),“.”表示该文件是一个普通文件,没有特殊属性。
- 2~4 个字符用来确定文件的用户(user)权限,5~7 个字符用来确定文件的组(group)权限,8~10个字符用来确定文件的其它用户(other user,既不是文件所有者,也不是组成员的用户)的权限。其中,2、5、8 个字符是用来控制文件的读权限的,该位字符为 r 表示允许用户、组成员或其它人可从该文件中读取数据。短线“-”则表示不允许该成员读取数据。与此类似,3、6、9 位的字符控制文件的写权限,该位若为 w 表示允许写,若为“-”表示不允许写。4、7、10 位的字符用来控制文件的制造权限,该位若为 x 表示允许执行,若为“-”表示不允许执行。
任何列在/etc/passwd 文件中的用户都可以是一个文件的所有者,也称为该文件的用户。同样任何列在/etc/group 文件中的组都可以是文件组的所有者,也简称为文件的组。
drwxrwxr-- 2 root root 4096 2 月 11 12:36 zoom
-rwxr-xr-- 1 user admin 20480 11 月 11 13:55 readme.txt
在该项中,第 1 个位置是短线“-”,表示该文件是一个普通文件,没有特殊属性。该文件对任何人都可读,只对 user 可写,user 和 admin 的组成员可以执行该文件。
另外需要注意的是,当用户访问一个文件时,权限检查是从左到右的。假设上述的 readme.txt 文件具有以下权限:
-r–rw-r–
那么即使 user 是属于 admin 组的一个成员,也不能对该文件进行写操作,因为已经被左边的写权限设置拒绝了
一般文件权限读(R),写(W),执行(X)权限比较简单。一般来说,使用过 Linux 的同学都知道,Linux 文件的权限有 rwx,所有者、所有组、其它用户的 rwx 权限是彼此独立的。为此,经常会听到如果某个 web 文件需要被修改的话,需要加上 777 的权限,这就是让所有用户可写。
但仔细一想,这样的权限未免有些想得比较天真,没有考滤特殊情况。例如/tmp 目录默认权限是 777,而且有些文件也是允许所有用户访问修改的,那么是不 是任何一个用户都可以将这些删除呢?再如/etc/shadow 保存的是用户密码文件,默认情况下它的权限是 640,那么只有 shadow 的 owner(root)才能修改它,按照常规理解,这是不可理解的,因为每个用户都可能修改密码,也就是会修改这个文件。
为了把这些情况解释清楚,需要引入 Linux 特殊文件权限的概念。这里介绍一下一些特殊的文件权限——SUID,SGID,Stick bit。
如果你检查一下/usr/bin/passwd 和/tmp/的文件权限你就会发现和普通的文件权限有少许不同,涉及到 SUID 和 Stick bit,如所示:
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59640 11月 29 2022 /usr/bin/passwd
ls -ld /tmp/
drwxrwxrwt 20 root root 49152 8月 19 14:28 /tmp/
我们首先来谈一下 passwd 程序特殊的地方。大家都知道,Linux 把用户的密码信息存放在/etc/shadow 里面,该文件属性如下:
ls -l /etc/shadow
-rw-r----- 1 root shadow 1419 10月 27 2023 /etc/shadow
可以看到shadow的只有所有者可读写,所有者是 root,所以该文件对普通用户是不可读写的。
**但**是普通用户调用 passwd 程序是可以修改自己的密码的,这又是为什么呢?
难道普通用户可以读写 shadow文件?
难道 Linux 有漏洞?
当然不是啦。
答案:password 可以修改 shadow 文件的原因是他设置了SUID 文件权限。
SUID 文件权限作用于可执行文件。一般的可执行文件在执行期的所有者是当前用户,比如当前系统用户是zoom,zoom运行程序 a.out,a.out 执行期的所有者应该是zoom。但是如果我们给可执行文件设置了 SUID 权限,则该程序的执行期所有者,就是该文件所有者。还以 前面的 a.out 为例,假如 a.out 设置了 SUID,并且其所有者是 root,系统当前用户是zoom,当zoom运行 a.out 的时 候,a.out 在运行期的所有者就是 root,这时 a.out 可以存取只有 root权限才能存取的资源,比如读写 shadow 文件。当 a.out 执行结束 的时候当前用户的权限又回到了zoom的权限了。
passwd 就是设置了 SUID 权限,并且 passwd 的所有者是 root,所以所有的用户都可以执行他,在 passwd 运行期,程序获得临时的 root 权限,这时其可以存取 shadow 文件。当 passwd运行完成,当前用户又回到普通权限。
实战:
SUID 与 SGID 是一样的,唯一不同的是,运行时是以这个文件的拥有者身份来运行。
加 SUID 的方法:
chmod o+s /tmp
或
chmod 4777 /tmp
同样的,加了 SUID 的文件权限有这类似这两种:“drwsrwxrwx”、“drwSrwxrwx”。
看看 passwd 命令的权限:ll /usr/bin/passwd,是"-rwsr-x-rx",终于知道为什么执行 passwd 时,可以修改/etc/shadow 文件了吧
同理,设置程序的 SGID,可以使程序运行期可以临时获得所有者组的权限。在团队开发的时候,这个文件权限比较有用,一般系统用 SUID 比较多。
SGID 可以用于目录,当目录设置了 SGID 之后,在该目录下面建立的所有文件和目录都具有和该目录相同的用户组。
实战:
加上 SGID 的文件,表示运行这个程序时,是临时以这个文件的拥有组的身份运行的;加上 SGID 的文件夹,表示在这个目录下创建的文件属于目录所有的组,而不是创建人所在的组,在这个目录下创建的目录继承本目录的 SGID。
加 SGID 的方法:
chmod g+s /tmp
或
chmod 2777 /tmp
查看是否加了 SGID,用 ls -l,可以看到类似这样的权限“drwxrwsrwx”,s 就代表已经加上了 SGID,而且生效,如果显示“drwxrwSrwx”,说明已经加上了 SGID,但没有生效(因为本来 group 就没有执行的权限)。
对程序,该权限告诉系统在程序完成后在内存中保存一份运行程序的备份,如该程序常用,可为系统节省点时间,不用每次从磁盘加载到内存。Linux 当前对文件没有实现这个功能,一些其他的 UNIX 系统实现了这个功能。
sticky bit 可以作用于目录,在设置了粘贴位的目录下面的文件和目录,只有所有者和 root可以删除他。现在我们可以回头去看看/tmp/目录的情况,这个目录 设置了粘贴位。所以说,并且所有人都可以对该目录读写执行(777),这样意味着所有人都可以在/tmp/下面创建临时目录。因为设置 sticky bit 只有所有者和 root 才能删除目录。这样普通用户只能删除属于自己的文件,而不能删除其他人的文件。如下图所示:
sudo touch file;sudo chmod 777 file;ls -l file
-rwxrwxrwx 1 root root 0 8月 19 16:52 file
实战:
加 sticky bit 的方法:
chmod o+t /tmp
或者
chmod 1777 /tmp
查看是否加了 sticky bit,用 ls -l,可以看到有类似这样的权限:“-rwxrwxrwt”,t 就代表已经加上了 sticky bit,而且生效了,如果显示的是“-rwxrwxrwT”,说明也已经加上了 sticky bit,但没有生效(因为本来 other 就没有写的权限)。看看/tmp 目录的权限,就是 drwxrwxrwt 吧
前面介绍过 SUID 与 SGID 的功能,那么,如何打开文件使其成为具有 SUID 与 SGID 的权限呢?这就需要使用数字更改权限了。现在应该知道,使用数字 更改权限的方式为“3 个数字”的组合,那么,如果在这 3 个数字之前再加上一个数字,最前面的数字就表示这几个属性了(注:通常我们使用 chmod xyz filename 的方式来设置 filename 的属性时,则是假设没有SUID、SGID 及sticky bit)。
假设要将一个文件属性改为“-rwsr-xr-x”,由于 s 在用户权限中,所以是 SUID,因此,在原先的 755 之前还要加上 4,也就是使用“chmod 4755 filename”来设置。
SUID 也可以用“chmod u+s filename”来设置,“chmod u-s filename”来取消 SUID 设置;同样,SGID 可以用“chmod g+s filename”,“chmod g-s filename”来取消 SGID 设置。
在 Linux 操作系统中,root 的权限是最高的,也被称为超级权限的拥有者。普通用户无法执行的操作,root 用户都能完成,所以也被称之为超级管理用户。在系统中,每个文件、目录和进程,都归属于某一个用户,没有用户许可其它普通用户是无法操作的,但对 root 除外。root
用户的特权性还表现在 root 可以超越任何用户和用户组来对文件或目录进行读取、修改或删除(在系统正常的许可范围内);对可执行程序的执行、终止;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改,以适合系统管理的需要(因为 root 是系统中权限最高的特权用户);
在所有 Linux 系统中,系统都是通过 UID 来区分用户权限级别的,而 UID 为 0 的用户被系统约定为是具有超级权限。超级用户具有在系统约定的最高权限满园内操作,所以说超级用户可以完成系统管理的所有工具;我们可以通过/etc/passwd 来查得UID 为 0 的用户是 root,而且只有 root 对应的 UID 为 0,从这一点来看,root 用户在系统中是无可替代的至高地位和无限制权限。root 用户在系统中就是超级用户;
当系统默认安装时,系统用户和 UID 是一对一的对关系,也就是说一个 UID 对应一个用户。我们知道用户身份是通过 UID 来确认的,我们在 《用户(user)和用户组(group)配置文件详解》中的 UID 的解说中有谈到“UID 是确认用户权限的标识,用户登录系统所处的角色是通过 UID 来实现的,而非用户名;把几个用户共用一个 UID 是危险的,比如我们把普通用户的UID 改为 0,和 root 共用一个 UID ,这事实上就造成了系统管理权限的混乱。如果我们想用 root 权限,可以通过 su 或 sudo来实现;切不可随意让一个用户和 root 分享同一个 UID 。
在系统中,能不能让 UID 和用户是一对多的关系?是可以的,比如我们可以把一个 UID 为0这个值分配给几个用户共同使用,这就是 UID 和用户的一对多的关系。但这样做的确有点危险;相同 UID 的用户具有相同的身份和权限。比如我们在系统中把zoom这个普通用户的 UID 改为 0 后,事实上这个普通用户就具有了超级权限,他的能力和权限和 root 用户一样;用户zoom所有的操作都将被标识为 root 的操作,因为zoom的 UID 为 0,而 UID 为 0 的用户是 root ,是不是有点扰口?也可以理解为UID 为 0 的用户就是 root ,root 用户的 UID 就是 0;
UID 和用户的一对一的对应关系 ,只是要求管理员进行系统管理时,所要坚守的准则,因为系统安全还是第一位的。所以我们还是把超级权限保留给 root 这唯一的用户是最好的选择;如果我们不把 UID 的 0 值的分享给其它用户使用,只有 root 用户是唯一拥有 UID=0 的话,root 用户就是唯一的超级权限用户;
与超级用户相对的就是普通用户和虚拟(也被称为伪装用户),普通和伪装用户都是受限用户;但为了完成特定的任务,普通用户和伪装用户也是必须的;Linux 是一个多用户、多任务的操作系统,多用户主要体现在用户的角色的多样性,不同的用户所分配的权限也不同;这也是 Linux 系统比 Windows 系统更为安全的本质所在,即使是现在最新版本的 Windows 2003 ,也无法抹去其单用户系统的烙印;
超级权限用户(UID 为 0 的用户)到底在系统管理中起什么作用呢?主要表现在以下两点;
但值得注意的是这种操作是在系统最高许可范围内的操作;有些操作就是具有超级权限的 root 也无法完成;
比如/proc 目录,/proc 是用来反应系统运行的实时状态信息的,因此即便是 root 也无能为力;它的权限如下
pwd
/root
cd /
ls -ld /proc/
dr-xr-xr-x 134 root root 0 2005-10-27 /proc/
就是这个目录,只能是读和执行权限,但绝对没有写权限的;就是我们把/proc 目录的写权限打开给 root,root 用户也是不能进行写操作;
chmod 755 /proc
ls -ld /proc/
drwxr-xr-x 134 root root 0 2024-08-17 /proc/
cd /proc/
mkdir test
mkdir: 无法创建目录‘test’: 没有那个文件或目录
硬件管理、文件系统理解、用户管理以及涉及到的系统全局配置等等…如果您执行某个命令或工具时,提示您无权限,大多是需要超级权限来完成;
比如用 adduser 来添加用户,这个只能用通过超级权限的用户来完成;
由于超级权限在系统管理中的不可缺少的重要作用,为了完成系统管理任务,我们必须用到超级权限;在一般情况下,为了系统安全,对于一般常规级别的应用,不需要 root 用户来操作完成,root 用户只是被用来管理和维护系统之用;比如系统日志的查看、清理,用户的添加和删除…
在不涉及系统管理的工作的环境下,普通用户足可以完成,比如编写一个文件,听听音乐;用 gimp 处理一个图片等… 基于普通应用程序的调用,大多普通用户就可以完成;当我们以普通权限的用户登录系统时,有些系统配置及系统管理必须通过超级权限用户完成,比如对系统日志的管理,添加和删除用户。而如何才能不直接以 root 登录,却能从普通用户切换到 root 用户下才能进行操作系统管理需要的工作,这就涉及到超级权限管理的问题;
获取超级权限的过程,就是切换普通用户身份到超级用户身份的过程;这个过程主要是通过 su 和 sudo 来解决;
su 命令就是切换用户的工具,怎么理解呢?比如我们以普通用户 zoom登录的,但要添加用户任务,执行 useradd ,zoom用户没有这个权限,而这个权限恰恰由 root 所拥有。解决办法无法有两个,一是退出 zoom用户,重新以 root 用户登录,但这种办法并不是最好的;二是我们没有必要退出 zoom用户,可以用 su 来切换到 root 下进行添加用户的工作,等任务完成后再退出 root。我们可以看到当然通过 su 切换是一种比较好的办法;
通过 su 可以在用户之间切换,如果超级权限用户 root 向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证;
用法:su [选项] [登录]
选项:
-c, --command COMMAND 将 COMMAND 传递至启动的 shell
-h, --help 显示此帮助信息并退出
-, -l, --login 将 shell 设为登录 shell
-m, -p,
--preserve-environment 不重置环境变量并保持同一 shell
-s, --shell SHELL 使用 SHELL 而非 passwd 中的默认值
至于更详细的,请参看 man su ;
su 在不加任何参数,默认为切换到 root 用户,但没有转到 root 用户家目录下,也就是说这时虽然是切换为 root 用户了,但
并没有改变 root 登录环境;用户默认的登录环境,可以在/etc/passwd 中查得到,包括家目录,SHELL 定义等;
su
Password:
pwd
/home/zoom
su 加参数 - ,表示默认切换到 root 用户,并且改变到 root 用户的环境;
pwd
/home/zoom
su -
Password:
pwd
/root
su 参数 - 用户名
su - root 注:这个和 su - 是一样的功能;
Password:
pwd
/root
su - linuxsir 注:这是切换到 linuxsir 用户
Password: 注:在这里输入密码;
pwd 注:查看用户当前所处的位置;
/home/linuxsir
id 注:查看用户的 UID 和 GID 信息,主要是看是否切换过来了;
uid=505(linuxsir) gid=502(linuxsir) groups=0(root),500(zoom),502(linuxsir)
su - -c ls 注:这是 su 的参数组合,表示切换到 root 用户,并且改变到 root 环境,然后列出
root 家目录的文件,然后退出 root 用户;
Password: 注:在这里输入 root 的密码;
anaconda-ks.cfg Desktop install.log install.log.syslog testgroup testgroupzoom testgrouproot
pwd 注:查看当前用户所处的位置;
/home/zoom
id 注:查看当前用户信息;
uid=500(zoom) gid=500(zoom) groups=500(zoom)
su 的确为管理带来方便,通过切换到 root 下,能完成所有系统管理工具,只要把 root 的密码交给任何一个普通用户,他都能切换到 root 来完成所有的系统管理工作;但通过 su 切换到 root 后,也有不安全因素;比如系统有 10 个用户,而且都参与管理。如果这 10 个用户都涉及到超级权限的运用,做为管理员如果想让其它用户通过 su 来切换到超级权限的 root,必须把 root 权限密码都告诉这 10 个用户;如果这10 个用户都有 root 权限,通过 root 权限可以做任何事,这在一定程度上就对系统的安全造成了威协;想想 Windows 吧,简直就是恶梦;
“没有不安全的系统,只有不安全的人”,我们绝对不能保证这 10 个用户都能按正常操作流程来管理系统,其中任何一人对系统操作的重大失误,都可能导致系统崩溃或数据损失;所以 su 工具在多人参与的系统管理中,并不是最好的选择,su 只适用于一两个人参与管理的系统,毕竟 su 并不能让普通用户受限的使用;超级用户 root 密码应该掌握在少数用户手中,这绝对是真理!所以集权而治的存在还是有一定道理的;
由于 su 对切换到超级权限用户 root 后,权限的无限制性,所以 su 并不能担任多个管理员所管理的系统。如果用 su 来切换到超级用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时,最好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限,并且约定其使用哪些工具来完成与其相关的工作,这时我们就有必要用到 sudo。
通过 sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道 root 密码,所以 sudo 相对于权限无限制性的su 来说,还是比较安全的,所以 sudo 也能被称为受限制的 su ;另外 sudo 是需要授权许可的,所以也被称为授权许可的su;
sudo 执行命令的流程是当前用户切换到 root(或其它指定切换到的用户),然后以 root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过 sudo 的配置文件/etc/sudoers 来进行授权;
sudo 的配置文件是/etc/sudoers ,我们可以用他的专用编辑工具 visodu ,此工具的好处是在添加规则不太准确时,保存退出时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过 sudo -l 来查看哪些命令是可以执行或禁止的;
/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可以用\号来续行,这样看来一个规则也可以拥有多个行;
/etc/sudoers 的规则可分为两类;
别名定义并不是必须的,但授权规则是必须的;
别名规则定义格式如下
Alias_Type NAME = item1, item2, ...
或
Alias_Type NAME = item1, item2, item3 : NAME = item4, item5
别名类型(Alias_Type):别名类型包括如下四种
Host_Alias::定义主机别名;
User_Alias: 用户别名,别名成员可以是用户,用户组(前面要加%号)
Runas_Alias: 用来定义 runas 别名,这个别名指定的是“目的用户”,即 sudo 允许切换至的用户;
Cmnd_Alias: 定义命令别名;
NAME 就是别名了,NMAE 的命名是包含大写字母、下划线以及数字,但必须以一个大写字母开头,比如 SYNADM、SYN_ADM或 SYNAD0 是合法的,sYNAMDA 或 1SYNAD 是不合法的;
item: 按中文翻译是项目,在这里我们可以译成成员,如果一个别名下有多个成员,成员与成员之间,通过半角,号分隔;成员在必须是有效并事实存在的。什么是有效的呢?比如主机名,可以通过 w 查看用户的主机名(或 ip 地址),如果您只是本地机操作,只通过 hostname 命令就能查看;用户名当然是在系统中存在的,在/etc/paswd 中必须存在;对于定义命令别名,成员也必须在系统中事实存在的文件名(需要绝对路径);
item 成员受别名类型 Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias 制约,定义什么类型的别名,就要有什么类型的成员相配。我们用 Host_Alias 定义主机别名时,成员必须是与主机相关相关联,比如是主机名(包括远程登录的主机名)、ip 地址(单个或整段)、掩码等;当用户登录时,可以通过 w 命令来查看登录用户主机信息;用 User_Alias 和 Runas_Alias定义时,必须要用系统用户做为成员;用 Cmnd_Alias 定义执行命令的别名时,必须是系统存在的文件,文件名可以用通配符表示,配置 Cmnd_Alias 时命令需要绝对路径;
其中 Runas_Alias 和 User_Alias 有点相似,但与 User_Alias 绝对不是同一个概念,Runas_Alias 定义的是某个系统用户可以 sudo 切换身份到 Runas_Alias 下的成员;我们在授权规则中以实例进行解说;
别名规则是每行算一个规则,如果一个别名规则一行容不下时,可以通过\来续行;同一类型别名的定义,一次也可以定义几个别名,他们中间用:号分隔,
Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24 注:定义主机别名 HT01,通过=号列
出成员
Host_Alias HT02=st09,st10 注:主机别名 HT02,有两个成员;
Host_Alias HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24:HT02=st09,st10 注:上面的两条对
主机的定义,可以通过一条来实现,别名之间用:号分割;
注:我们通过 Host_Alias 定义主机别名时,项目可以是主机名、可以是单个 ip(整段 ip 地址也可以),也可以是网络掩码;如果是主机名,必须是多台机器的网络中,而且这些机器得能通过主机名相互通信访问才有效。那什么才算是通过主机名相互通信或访问呢?
比如 ping 主机名,或通过远程访问主机名来访问。在我们局域网中,如果让计算机通过主机名访问通信,必须置/etc/hosts,/etc/resolv.conf ,还要有 DNS 做解析,否则相互之间无法通过主机名访问;在设置主机别名时,如果项目是中某个项目是主机名的话,可以通过 hostname 命令来查看本地主机的主机名,通过 w 命令查来看登录主机是来源,
通过来源来确认其它客户机的主机名或 ip 地址;对于主机别名的定义,看上去有点复杂,其实是很简单。如果您不明白 Host_Alias 是怎么回事,也可以不用设置主机别名,在定义授权规则时通过 ALL 来匹配所有可能出现的主机情况。如果您把主机方面的知识弄的更明白,的确需要多多学习
User_Alias SYSAD=zoom,linuxsir,bnnnb,lanhaitun 注:定义用户别名,下有四个成员;要在系统中确实在存在的;
User_Alias NETAD=zoom,bnnb 注:定义用户别名 NETAD ,我想让这个别名下的用户来管理网络,所以取了 NETAD 的
别名;
User_Alias WEBMASTER=linuxsir 注:定义用户别名 WEBMASTER,我想用这个别名下的用户来管理网站;
User_Alias SYSAD=zoom,linuxsir,bnnnb,lanhaitun:NETAD=zoom,bnnb:WEBMASTER=linuxsir 注:上面三行的别名
定义,可以通过这一行来实现,请看前面的说明,是不是符合?
Cmnd_Alias USERMAG=/usr/sbin/adduser,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod
注意:命令别名下的成员必须是文件或目录的绝对路径;
Cmnd_Alias DISKMAG=/sbin/fdisk,/sbin/parted
Cmnd_Alias NETMAG=/sbin/ifconfig,/etc/init.d/network
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PWMAG = /usr/sbin/reboot,/usr/sbin/halt
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
注:这行定义命令别名有点长,可以通过 \ 号断行
Cmnd_Alias SU = /usr/bin/su,/bin,/sbin,/usr/sbin,/usr/bin
在上面的例子中,有 KILL 和 PWMAG 的命令别名定义,我们可以合并为一行来写,也就是等价行;
Cmnd_Alias KILL = /usr/bin/kill:PWMAG = /usr/sbin/reboot,/usr/sbin/halt
注:这一行就代表了 KILL 和 PWMAG命令别名,把 KILL 和 PWMAG 的别名定义合并在一行写也是可以的;
Runas_Alias OP = root, operator
Runas_Alias DBADM=mysql:OP = root, operator
注:这行是上面两行的等价行;至于怎么理解 Runas_Alias ,我们必须得通过授权规则的实例来理解;
授权规则是分配权限的执行规则,我们前面所讲到的定义别名主要是为了更方便的授权引用别名;如果系统中只有几个用户,其实下放权限比较有限的话,可以不用定义别名,而是针对系统用户直接直接授权,所以在授权规则中别名并不是必须的;授权规则并不是无章可寻,我们只说基础一点的,比较简单的写法,如果您想详细了解授权规则写法的,请参看 man sudoers
授权用户 主机=命令动作
这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用( )号括起来,如果不需要密
码直接运行命令的,应该加 NOPASSWD:参数,但这些可以省略
文件或者目录的用户能够使用 chmod 命令修改文件的权限。Chmod 命令有两种方式:一种是字符方式,使用字符来修改文件的权限;另外一种是数字方式,使用 3 个数字的组合来修改文件的权限。
使用方式 : chmod [-cfvR] [–help] [–version] mode file…
说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以借以控制档案如何被他人所调用。
参数 :
mode : 权限设定字串,格式如下 : [ugoa…][[±=][rwxX]…][,…],其中
系统中各种文件的权限设置对特定用户的数据安全有很大影响。但是要求用户逐一明确设置系统中每个文件的权限也是不现实的,为此,需要使用 umask 命令,该命令可以为用户账号中新文件的创建进行缺省设置。系统管理员必须要为你设置一个合理的 u m a s k 值,以确保你创建的文件具有所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。具体来说,umask 是用来设置权限掩码的,权限掩码由 3 个数字组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时默认的权限。
语 法:umask [-S][权限掩码]
补充说明:umask 可用来设定[权限掩码]。[权限掩码]是由 3 个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。
参 数:
chown 命令用途更改与文件关联的所有者或组。
语法 chown[ -f ] [ -h] [ -R ] Owner [ :roup ] { File … | Directory … }
描述 chown 命令将 File 参数指定的文件的所有者更改为 Owner 参数指定的用户。Owner 参数的值可以是可在 /etc/passwd 文件中找到的用户标识或登录名。还可以选择性地指定组。group 参数的值可以是可在 /etc/group 文件中找到的组标识或组名。只有 root 用户可以更改文件的所有者。只在您是 root 用户或拥有该文件的情况下才可以更改文件的组。如果拥有文件但不是 root 用户,则只可以将组更改为您是其成员的组。虽然 -H、-L 和 -P 标志是互斥的,指定不止一个也不认为是错误。指定的最后一个标志确定命令拟稿将演示的操作。
参数:
功能说明:变更文件或目录的所属群组。
语 法:chgrp [-cfhRv][–help][–version][所属群组][文件或目录…] 或 chgrp [-cfhRv][–help][–reference=<参考文件或目录>][–version][文件或目录…]
补充说明:在 UNIX 系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用 chgrp 指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。
参 数: