1
、文件类型
Linux
广泛的被很多用户所接受,它强大的功能受到很多人喜欢,
Linux
文件一般是用一些相关的应
用程序创建,比如图像工具、文档工具、归档工具
... ....
或
cp
工具等。
Linux
文件的删除方式是用
rm
命
令。
Linux
文件类型和
Linux
文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的
比如
file.txt
、
file.tar.gz
,这些文件虽然要用不同的程序来打开,但放在
Linux
文件类型中衡量的话,大
多是常规文件(也被称为普通文件)。
Linux
文件类型常见的有:普通文件、目录、字符设备文件、块设备文件、符号链接文件等;现在我们
进行一个简要的说明;
1
普通文件
1. [root@localhost ~]# ls -lh install.log
2. -rw-r--r-- 1 root root 53K 03-16 08:54 install.log
我 们用
ls -lh
来查看某个文件的属性,可以看到有类似
-rw-r--r--
,值得注意的是第一个符号是
-
,
这样的文件在
Linux
中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文
档工具、归档工具
... ....
或
cp
工具等。这类文件的删除方式是用
rm
命令;
2
目录
1. [root@localhost ~]# ls -lh
2.
总计
14M
3. -rw-r--r-- 1 root root 2 03-27 02:00 fonts.scale
4. -rw-r--r-- 1 root root 53K 03-16 08:54 install.log
5. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
6. drwxr-xr-x 2 1000 users 4.0K 04-04 23:30 mkuml-2004.07.17
7. drwxr-xr-x 2 root root 4.0K 04-19 10:53 mydir
8. drwxr-xr-x 2 root root 4.0K 03-17 04:25 Public
当 我们在某个目录下执行,看到有类似
drwxr-xr-x
,这样的文件就是目录,目录在
Linux
是一个比较
特殊的文件。注意它的第一个字符是
d
。创建目录的命令可以用
mkdir
命令,或
cp
命令,
cp
可以把一
个目录复制为另一个目录。删除用
rm
或
rmdir
命令。
3
字符设备或块设备文件
如时您进入
/dev
目录,列一下文件,会看到类似如下的;
1. [root@localhost ~]# ls -la /dev/tty
2. crw-rw-rw- 1 root tty 5, 0 04-19 08:29 /dev/tty
3. [root@localhost ~]# ls -la /dev/hda1
4. brw-r----- 1 root disk 3, 1 2006-04-19 /dev/hda1
我们看到
/dev/tty
的属性是
crw-rw-rw-
,注意前面第一个字符是
c
,这表示字符设备文件。比如猫等
串口设备
我们看到
/dev/hda1
的属性是
brw-r-----
,注意前面的第一个字符是
b
,这表示块设备,比如硬盘,光
驱等设备;
这个种类的文件,是用
mknode
来创建,用
rm
来删除。目前在最新的
Linux
发行版本中,我们一般不
用自己来创建设备文件。因为这些文件是和内核相关联的。
4
套接口文件
当我们启动
MySQL
服务器时,会产生一个
mysql.sock
的文件。
1. [root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock
2. srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock
注意这个文件的属性的第一个字符是
s
。我们了解一下就行了。
5
符号链接文件
1. [root@localhost ~]# ls -lh setup.log
2. lrwxrwxrwx 1 root root 11 04-19 11:18 setup.log -
>
install.log
当我们查看文件属性时,会看到有类似
lrwxrwxrwx,
注意第一个字符是
l
,这类文件是链接文件。是通过
ln -s
源文件名 新文件名。上面是一个例子,表示
setup.log
是
install.log
的软链接文件。怎么理解呢?
这和
Windows
操作系统中的快捷方式有点相似。
符号链接文件的创建方法举例;
1. [root@localhost ~]# ls -lh kernel-6.15-1.2025_FC5.i686.rpm
2. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
3. [root@localhost ~]# ln -s kernel-6.15-1.2025_FC5.i686.rpm kernel.rpm
4. [root@localhost ~]# ls -lh kernel*
5. -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm
6. lrwxrwxrwx 1 root root 33 04-19 11:27 kernel.rpm -
>
kernel-6.15-1.2025_FC5
2
、文件权限
Linux
系统是一个典型的多用户系统,不同的用户处于不同的地位。为了保护系统的安全性,
Linux
系统对不同用户访问同一文件的权限做了不同的规定。
对于一个
Linux
系统中的文件来说,它的权限可以分为三种:读的权限、写的权限和执行的权限,
分别用
r
、
w
和
x
表示。不同的用户具有不同的读、写和执行的权限。
对于一个文件来说,它都有一个特定的所有者,也就是对文件具有所有权的用户。同时,由于在
Linux
系统中,用户是按组分类的,一个用户属于一个或多个组。文件所有者以外的用户又可以分为文
件所有者的同组用户和其它用户。因此,
Linux
系统按文件所有者、文件所有者同组用户和其它用户三
类规定不同的文件访问权限。
权限的概念
Linux
文件系统安全模型是通过给系统中的文件赋予两个属性来起作用的,这两个赋予每个文件的
属性称为所有者
(ownership)
和访问权限
(access rights)
。
Linux
下的每一个文件必须严格地属于一个用户和
一个组。
下图是在我机器上的
/root
目录下运行
ls -l
命令的情况。
-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 10:36 guo
因为
guo
的第
1
个位置的字符是
d
,所以由此知道
guo
是一个目录。第
2
至
4
位置上的属性是
rwx
,
表示用户
root
拥有权限列表显示
guo
中所有的文件、创建新文件或者删除
guo
中现有的文件,或者将
guo
作为当前工作目录。第
5
至
7
个位置上的权限是
rwx
,表示
root
组的成员拥有和
root
一样的权限。
第
8
至
10
位上的权限仅是
r--
,表示不是
root
的用户及不属于
root
组的成员只有对
guo
目录列表的权
限。这些用户不能创建或者删除
guo
中的文件、执行
junk
中的可执行文件,或者将
junk
作为他们的当
前工作目录。
-rwxr-xr-- 1 user admin 20480 11
月
11 09:23 Readme.txt
在该项中,第
1
个位置是短线“
-
”,表示该文件是一个普通文件,没有特殊属性。该文件对任何人
都可读,只对
user
可写,
user
和
admin
的组成员可以执行该文件。
另外需要注意的是,当用户访问一个文件时,权限检查是从左到右的。假设上述的
readme.txt
文件
具有以下权限:
-r--rw-r--
那么即使
user
是属于
admin
组的一个成员,也不能对该文件进行写操作,因为已经被左边的写权
限设置拒绝了。
一般文件权限读(
R
),写
(W)
,执行(
X
)权限比较简单。一般材料上面都
有介绍。这里介绍一下一些特殊的文件权限
——SUID
,
SGID
,
Stick bit
。
如果你检查一下
/usr/bin/passwd
和
/tmp/
的文件权限你就会发现和普
通的文件权限有少许不同,如下图所示:
这里就涉及到
SUID
和
Stick bit
。
SUID
和
SGID
我们首先来谈一下
passwd
程序特殊的地方。大家都知道,
Linux
把用户的密码信息存放
在
/etc/shadow
里面,该文件属性如下:
可以看到
Shadow
的只有所有者可读写,所有者是
root
,所以该文件对普通用户是不可读写的。但是普通用户调
用
passwd
程序是可以修改自己的密码的,这又是为什么呢?难道普通用户可以读写
shadow
文件?难道
Linux
有漏洞?当然不是啦。
password
可以修改
shadow
文件的原因是他设置了
SUID
文件权限。
SUID
文件权限作用于可执行文件。一般的可执行文件在执行期的所有者是当前用户,比
如当前系统用户是
simon
,
simon
运行程序
a.out
,
a.out
执行期的所有者应该是
simon
。但是
如果我们给可执行文件设置了
SUID
权限,则该程序的执行期所有者,就是该文件所有者。还
以 前面的
a.out
为例,假如
a.out
设置了
SUID
,并且其所有者是
root
,系统当前用户是
simon
,
当
simon
运行
a.out
的时 候,
a.out
在运行期的所有者就是
root
,这时
a.out
可以存取只有
root
权限才能存取的资源,比如读写
shadow
文件。当
a.out
执行结束 的时候当前用户的权限又回
到了
simon
的权限了。
passwd
就是设置了
SUID
权限,并且
passwd
的所有者是
root
,所以所有的用户都可以
执行他,在
passwd
运行期,程序获得临时的
root
权限,这时其可以存取
shadow
文件。当
passwd
运行完成,当前用户又回到普通权限。
同理,设置程序的
SGID
,可以使程序运行期可以临时获得所有者组的权限。在团队开发
的时候,这个文件权限比较有用,一般系统用
SUID
比较多。
SGID
可以用于目录,当目录设置了
SGID
之后,在该目录下面建立的所有文件和目录都
具有和该目录相同的用户组。
Stick bit(
粘贴位
)
对程序,该权限告诉系统在程序完成后在内存中保存一份运行程序的备份,如该程序常
用,可为系统节省点时间,不用每次从磁盘加载到内存。
Linux
当前对文件没有实现这个功能,
一些其他的
UNIX
系统实现了这个功能。
Stick bit
可以作用于目录,在设置了粘贴位的目录下面的文件和目录,只有所有者和
root
可以删除他。现在我们可以回头去看看
/tmp/
目录的情况,这个目录 设置了粘贴位。所以说,
并且所有人都可以对该目录读写执行(
777
),这样意味着所有人都可以在
/tmp/
下面创建临时
目录。因为设置
Stick bit
只有所有者和
root
才能删除目录。这样普通用户只能删除属于自己
的文件,而不能删除其他人的文件。如下图所示:
设置
SUID
,
SGID
,
Stick bit
前面介绍过
SUID
与
SGID
的功能,那么,如何打开文件使其成为具有
SUID
与
SGID
的
权限呢?这就需要使用数字更改权限了。现在应该知道,使用数字 更改权限的方式为
“3
个数
字
”
的组合,那么,如果在这
3
个数字之前再加上一个数字,最前面的数字就表示这几个属性
了(注:通常我们使用
chmod xyz filename
的方式来设置
filename
的属性时,则是假设没有
SUID
、
SGID
及
Sticky bit
)。
4
为
SUID
2
为
SGID
1
为
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 的同学都知道,Linux 文件的权限有 rwx,所有者、所有组、其它用户的 rwx 权限
是彼此独立的。为此,经常会听到如果某个 web 文件需要被修改的话,需要加上 777 的权限,这就是让所有
用户可写。
但仔细一想,这样的权限未免有些想得比较天真,没有考滤特殊情况。例如/tmp 目录默认权限是 777,
而且有些文件也是允许所有用户访问修改的,那么是不 是任何一个用户都可以将这些删除呢?再如
/etc/shadow 保存的是用户密码文件,默认情况下它的权限是 640,那么只有 shadow 的 owner(root)才能修
改它,按照常规理解,这是不可理解的,因为每个用户都可能修改密码,也就是会修改这个文件。
为了把这些情况解释清楚,需要引入 Linux 特殊文件权限的概念。Linux 特殊文件权限有三个玩意:
sticky bit、SGID、SUID,以下一一道来。
sticky bit
sticky bit 只对目录有效,使目录下的文件,只有文件拥有者才能删除(如果他不属于 owner,仅属于
group 或者 other,就算他有 w 权限,也不能删除文件)。
加 sticky bit 的方法:
chmod o+t /tmp 或者
chmod 1777 /tmp
查看是否加了 sticky bit,用 ls -l,可以看到有类似这样的权限:“-rwxrwxrwt”,t 就代表已经加
上了 sticky bit,而且生效了,如果显示的是“-rwxrwxrwT”,说明也已经加上了 sticky bit,但没有生
效(因为本来 other 就没有写的权限)。
看看/tmp 目录的权限,就是 drwxrwxrwt 吧
SGID(The Set GroupID )
加上 SGID 的文件,表示运行这个程序时,是临时以这个文件的拥有组的身份运行的;加上 SGID 的文件
夹,表示在这个目录下创建的文件属于目录所有的组,而不是创建人所在的组,在这个目录下创建的目录继
承本目录的 SGID。
加 SGID 的方法:
chmod g+s /tmp 或
chmod 2777 /tmp
查看是否加了 SGID,用 ls -l,可以看到类似这样的权限“drwxrwsrwx”,s 就代表已经加上了 SGID,
而且生效,如果显示“drwxrwSrwx”,说明已经加上了 SGID,但没有生效(因为本来 group 就没有执行的
权限)。
SUID(The Set UserID)
SUID 与 SGID 是一样的,惟一不同的是,运行时是以这个文件的拥有者身份来运行。
加 SUID 的方法:
chmod o+s /tmp 或
chmod 4777 /tmp
同样的,加了 SUID 的文件权限有这类似这两种:“drwsrwxrwx”、“drwSrwxrwx”。
看看 passwd 命令的权限:ll /usr/bin/passwd,是"-rwsr-x-rx",终于知道为什么执行 passwd 时,可
以修改/etc/shadow 文件了吧
SUID:置于 u 的 x 位,原位置有执行权限,就置为 s,没有了为 S .
SGID:置于 g 的 x 位,原位置有执行权限,就置为 s,没有了为 S .
STICKY:粘滞位,置于 o 的 x 位,原位置有执行权限,就置为 t ,否则为 T .