`
yuanlanjun
  • 浏览: 1180942 次
文章分类
社区版块
存档分类
最新评论

shell脚本系列-文件安全与权限

 
阅读更多

文件权限位
基本命令
• 文件和目录的权限。
• setuid。
• chown和c h g r p。
• umask。
• 符号链接。

按照所针对的用户,文件的权限可分为三类:
1) 文件属主,创建该文件的用户。
2) 同组用户,拥有该文件的用户组中的任何用户。
3) 其他用户,即不属于拥有该文件的用户组的某一用户。

当创建一个文件的时候,系统保存了有关该文件的全部信息,包括:
" 文件的位置。
" 文件类型。
" 文件长度。
" 哪位用户拥有该文件,哪些用户可以访问该文件。
" i节点。
" 文件的修改时间。
" 文件的权限位。

让我们用touch命令创建一个文件:

$ touch temp

创建了一个空文件,现在用ls -l命令查看该目录下文件的属性(我这里用中文版):
如下:

[root@Linux_chenwy temp]# ls -l
总用量 36
-rw-r--r-- 1 root root 34890 10月 19 20:17 httpd.conf
-rw-r--r-- 1 root root 0 10月 19 20:16 temp
总用量 36:是ls所列出的入口占用空间的字节数(以K为单位)。
1该文件硬链接的数目。
root:文件属主。
root:文件属组(一般是文件属主所在的缺省组。)
34890:字节来表示的文件长度,记住,不是K字节!
10月 19 20:17:件的更新时间。
temp or httd.conf :件名。

BTW:要检查该目录所有文件占用的空间应该用这个命令:du。
譬如说前面说的36是如何计算出来:
首先我们要先了解你所用的文件系统的IO BLOCK(中文叫作簇)为多少,在你所使用的这个文件系统的IO BLOCK大小是4096 Bytes。

他意义是文件系统最小的读写及分配单位,每次读写操作你都不能小于这个尺寸。即使你的文件是只有一个字节。而且文件在硬盘上的存储也是以这个为单位,就是说如果文件尺寸小于这个值,那么它在磁盘上占用的空间就是4096字节。

占用空间的具体算法是:(进一(文件尺寸/4096))×4096。根据这个你就可以计算出你所列举的例子中的文件的空间使用状况:34890除以4096,大约等于8.5,进一法取得为9,就是说文件在磁盘上占用了9个BLOCk,每个BLOCK为4K,所以这两个文件占用的空间就是36K。

这个规则也适合于目录,不过不会出现为0的目录,即使是空目录

-rw-r--r-- :这是该文件的权限位。

第一个横杠:指定文件类型,表示该文件是一个普通文件。(所创建的文件绝大多数都是普通文件或符号链接文件)。

除去最前面的横杠,一共是9个字符,他们分别对应9个权限位。通过这些权限位,可以设定用户对文件的访问权限。对这两个文件的精确解释是:

rw-:前三位,文件属主可读、写
r--:中间三位,组用户可读
r--:最后三位,其他用户只可读

在创建的时候并未给属主赋予执行权限,在用户创建文件时,系统不会自动地设置执行权限位。这是出于加强系统安全的考虑

BTW:文件的属主组并不一定就是所有者所在的缺省组,而可以是任何一个跟该文件所有者无关的用户组。为了方便,还是统称属主,属组和其它

现在分开详细说明:

文件类型

前面提到的第一条横杠,表示该文件是普通文件型
文件类型有七种,它可以从ls -l命令所列出的结果的第一位看出.

七种类型:

d 目录。
l 符号链接(指向另一个文件)。
s 套接字文件。
b 块设备文件。
c 字符设备文件。
p 命名管道文件。
- 普通文件,或者更准确地说,不属于以上几种类型的文件。

文件的权限位中中每一组字符中含有三个权限位:

r 读权限
w 写/更改权限
x 执行该脚本或程序的权限

如:

r-- --- --- 文文件属主可读,但不能写或执行
r-- r-- --- 文文件属主和属组用户(一般来说,是文件属主所在的缺省组)可读
r-- r-- r- - 文任何用户都可读,但不能写或执行
rwx r-- r- - 文文件属主可读、写、执行,属组用户和其他用户只可读
rwx r-x --- 文文件属主可读、写、执行,属组用户可读、执
rwx r-x r- x 文文件属主可读、写、执行,属组用户和其他用户可读、执行
rw- rw- --- 文文件属主和属组用户可读、写
rw- rw- r- - 文文件属主和属组用户可读、写,其他用户可读
rw- rw- --- 文文件属主和属组用户及其他用户读可以读、写,慎用这种权限
设置,因为任何用户都可以写入该文件

使用chmod来改变权限位

这一命令有符号模式和绝对模式。

符号模式

chmod命令的一般格式为:

chmod [who] operator [permission] filename

w h o的含义是:

现在已经使文件属主对temp文件具有读、写执行的权限,属组用户真有读写权限,其它用户没有权限了。

绝对模式

chmod命令绝对模式的一般形式为:

chmod [mode] file

其中m o d e是一个八进制数。
在绝对模式中,权限部分有着不同的含义。每一个权限位用一个八进制数来代表,如

0 4 0 0 文件属主可读
0 2 0 0 文件属主可写
0 1 0 0 文件属主可执行

0 0 4 0 属组用户可读
0 0 2 0 属组用户可写
0 0 1 0 属组用户可执行

0 0 0 4 其他用户可读
0 0 0 2 其他用户可写
0 0 0 1 其他用户可执行

在设定权限的时候,只需按照上面查出与文件属主、属组用户和其他用户所具有的权限相对应的数字,并把它们加起来,就是相应的权限表示。
可以看出,文件属主、属组用户和其他用户分别所能够具有的最大权限值就是7。

再来看看前面举的例子:

-rwxr--r--1 root 0 10月 19 20:16 temp

相应的权限是:

rwx-:0400 + 0200 +0100 (文件属主可读、写、执行) = 0 7 0 0
r--:0 0 4 0 (属组用户可读) = 0 0 4 0
r--:0 0 4 0 (属组用户可读) = 0 0 4 0
0 7 4 4

有一个计算八进制权限表示的更好办法,如下:

文件属主:r w x:4 + 2 + 1
属组用户:r w x:4 + 2 + 1
其他用户:r w x:4 + 2 + 1

这上面这相,更容易地计算出相应的权限值,只要分别针对文件属主、属组用户和其他用户把相应权限下面的数字加在一起就可以了。

temp文件具有这样的权限:

r w x r - - r - -
4+2+14 4

把相应权限位所对应的值加在一起,就是7 4 4。

如:

chmod 666 rw- rw- rw- 赋予所有用户读和写的权限
chmod 644 rw- r-- r- - 赋予所有文件属主读和写的权限,所有其他用户读权限
chmod 744 rwx r-- r- - 赋予文件属主读、写和执行的权限,所有其他用户读的权限
chmod 664 rw- rw- r- - 赋予文件属主和属组用户读和写的权限,其他用户读权限
chmod 700 rwx --- --- 赋予文件属主读、写和执行的权限
chmod 444 r-- r-- r- - 赋予所有用户读权限

下面举一个例子,假定有一个名为temp的文件,具有如下权限:

-rw-rw-r--1 root 0 10月 19 20:16 test1

现在希望对该文件可读、写和执行, root组用户对该文件只读,可以键入:

$chmod 740 test1
$ls -l
-rwxr-----1 root 0 10月 19 20:16 test1

如果文件可读、写和执行,对其他所有用户只读,用:

$chmod 744 test1
$ls -l
-rwxr--r--1 root 0 10月 19 20:16 test1

如果希望一次设置目录下所有文件的权限,可以用:

$chmod 664*
$ls -l
-rw-r--r--1 root 0 10月 19 20:16 test1

这将使文件属主和属组用户都具有读和写的权限,其他用户只具有读权限。

还可以通过使用- R选项连同子目录下的文件一起设置:

chmod -R 664 /temp/*

这样就可以一次将/ temp目录下的所有文件连同各个子目录下的文件的权限全部设置为文件属主和属组用户可读和写,其他用户只读。使用- R选项一定要谨慎,只有在需要改变目录树下全部文件权限时才可以使用。
目录

目录的权限位和文件有所不同。目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。执行权限位则意味着搜索和访问该目录.

r :可以列出该目录中的文件
w:可以在该目录中创建或删除文件
x:可以搜索或进入该目录

权限文件属主属组用户其他用户

drwx rwx r- x ( 775 ) 属主读、写、执行,属组读、写、执行,其它组读、执行
drwx r-x r- - ( 754 ) 属主读、写、执行,属组读、执行,其它组读
drwx r-x r- x ( 755 ) 属主读、写、执行,属组读、执行,其它组读、执行

如果把属组用户或其他用户针对某一目录的权限设置为- - x,那么他们将无法列出该目录中的文件。如果该目录中有一个执行位置位的脚本或程序,只要用户知道它的路径和文件名,仍然可以执行它。用户不能够进入该目录并不妨碍他的执行。

目录的权限将会覆盖该目录中文件的权限。例如,如果目录temp具有如下的权限:

drwxr--r--1 admin 0 10月 19 20:16 temp

而目录下的文件myfile的权限为:

-rwxrwxrwx1 admin 0 10月 19 20:16 myfile

那么admin组的用户将无法编辑该文件,因为它所属的目录不具有这样的权限。

该文件对任何用户都可读,但由于它所在的目录并未给admin组的用户赋予执行权限,所以该组的用户都将无法访问该目录,他们将会得到“访问受限”的错误消息。

-rwxrwxrwx

9个权限位换成这样是不是更容易理解呢?

如:

-rwxrw-r-- 1 root admin 34890 10月 19 20:17 httpd.conf



前三位:rwx:它的所有者是root,即就是文件所有者,它对httpd.conf这个文件的权限是读写执行;
中间三位:rw-:表示admin组对这个文件的权限是读写
后面位:r--:就是即不是所有者,也不是属组的对文件的权限是读


suid/guid


1、为什么要使用这种类型的脚本?

例如有几个着几个大型的数据库系统,对它们进行备份需要有系统管理权限。可以写几个脚本,并设置了它们的g u i d,这样就可以指定的一些用户来执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份登录,以免不小心破坏了数据库服务器。通过执行这些脚本,他们可以完成数据库备份及其他管理任务,但是在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限。


2、查找suid/guid命令

有相当一些U N I X命令也设置了s u i d和g u i d。如果想找出这些命令,可以进入/ b i n或/ s b i n目录,执行下面的命令:

$ ls -l | grep '^...s'

上面的命令是用来查找s u i d文件的;

$ ls -l | grep '^...s..s'

上面的命令是用来查找s u i d和g u i d的。


3、设置UID

设置s u i d:将相应的权限位之前的那一位设置为4;
设置g u i d:将相应的权限位之前的那一位设置为2;
两者都置位:将相应的权限位之前的那一位设置为4+2=6。

设置了这一位后x的位置将由s代替。
记住:在设置s u i d或g u i d的同时,相应的执行权限位必须要被设置。
例如,如果希望设置g u i d,那么必须要让该用户组具有执行权限。

如果想要对文件l o g i n[它当前所具有的权限为rwx rw- r-- (741)]设置s u i d,,可在使用c h m o d命令时在该权限数字的前面加上一个4,即chmod 4741,这将使该文件的权限变为r w s rw- r - -。

$ chmod 4741 login

设置suid/guid的例子

命令 结果 含义
chmod 4755 rws r-x r- x 文件被设置了s u i d,文件属主具有读、写和执行的权限,其他用户具有读和执行的权限
chmod 6711 rws --s --x 文件被设置了s u i d和g u i d,文件属主具有读、写和执行的权限,其他用户具有执行的权限
chmod 4764 rws rw- r- - 文件被设置了s u i d,文件属主具有读、写和执行的权限,属组用户具有读和执行的权限,用户具有读权限

4、还可以使用符号方式来设置s u i d / g u i d。如果某个文件具有这样的权限: rwx r-x r- x,那么可以这样设置其s u i d:

chmod u+s <filename>;

于是该文件的权限将变为: rws r-x r-x

在查找设置了s u i d的文件时,没准会看到具有这样权限的文件:rwS r-x r- x,其中S为大写。
它表示相应的执行权限位并未被设置,这是一种没有什么用处的s u i d设置,可以忽略它的存在。

注意,c h m o d命令不进行必要的完整性检查,可以给某一个没用的文件赋予任何权限,但chmod 命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,就认为它一定是一个程序或脚本。
chown和chgrp

当你创建一个文件时,你就是该文件的属主。一旦你拥有某个文件,就可以改变它的所有权,把它的所有权交给另外一个/ e t c / p a s s w d文件中存在的合法用户。可以使用用户名或用户I D号来完成这一操作。

在改变一个文件的所有权时,相应的s u i d也将被清除,这是出于安全性的考虑。只有文件的属主和系统管理员可以改变文件的所有权。一旦将文件的所有权交给另外一个用户,就无法再重新收回它的所有权。如果真的需要这样做,那么就只有求助于系统管理员了。

1、c h o w n命令的一般形式为:

chmod -R -h owner file



QUOTE:
- R选项意味着对所有子目录下的文件也都进行同样的操作。
- h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。

2、chown举例

如:
# ls -l
drwxrwxr-x 2 sam sam 4096 10月 26 19:48 sam
# chown gem sam
# ls -l
drwxrwxr-x 2 gem sam 4096 10月 26 19:48 sam

文件sam的所有权现在由用户sam交给了用户gem。


3、chgrp举例

c h g r p命令和c h o w n命令的格式差不多,下面给出一个例子。

# ls -l
drwxrwxr-x 2 gem sam 4096 10月 26 19:48 sam
# chgrp group sam
# ls -l
drwxrwxr-x 2 gem group 4096 10月 26 19:48 sam

现在把该文件sam所属的组由sam变为group。


4、找出你所属于的用户组

如果你希望知道自己属于哪些用户组,可以用ID这个命令:

# su sam
$ id
uid=506(sam) gid=4(adm) groups=4(adm)

5、找出其他用户所属于的组

# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
查看当前用户所属组

# id gem
uid=507(gem) gid=507(group) groups=507(group),0(root),4(adm)
查看其它用户所用组:#id 用户名

# su sam
$ id gem
uid=507(gem) gid=507(group) groups=507(group),0(root),4(adm)
查看其它用户所属组

这里书上用group,但我试过不能使
BTW:可以用#cat /etc/passwd和#cat /etc/group直接查看用户和组

umask

当最初登录到系统中时, u m a s k命令确定了你创建文件的缺省模式。这一命令实际上和c h m o d命令正好相反。你的系统管理员必须要为你设置一个合理的u m a s k值,以确保你创建的文件具有所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。

在已经登录之后,可以按照个人的偏好使用u m a s k命令来改变文件创建的缺省权限。相应的改变直到退出该s h e l l或使用另外的u m a s k命令之前一直有效。

一般来说,u m a s k命令是在/ e t c / p r o f i l e文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的u m a s k,可以在该文件中加入相应的条目。如果希望永久性地设置自己的u m a s k值,那么就把它放在自己$ H O M E目录下的. p r o f i l e或. b a s h _ p r o f i l e文件中。

如何计算umask值


u m a s k命令允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、属组、其他用户)存在一个相应的u m a s k值中的数字。对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用c h m o d命令增加这一权限。目录则允许设置执行权限,这样针对目录来说, u m a s k中各个数字最大可以到7。
该命令的一般形式为:

umask nnn

其中n n n为u m a s k置0 0 0 - 7 7 7。

计算u m a s k值:

可以有几种计算u m a s k值的方法,通过设置u m a s k值,可以为新创建的文件和目录设置缺省权限。

与权限位相对应的u m a s k值。

umask 文件 目录
0 6 7
1 6 6
2 4 5
3 4 4
4 2 3
5 2 2
6 0 1
7 0 0

在计算u m a s k值时,可以针对各类用户分别按上面那张表中按照所需要的文件/目录创建缺省权限查找对应的u m a s k值。
例如,u m a s k值

0 6 7
0 6 7
2 4 5

所以002所对应的文件和目录创建缺省权限分别为6 6 4和7 7 5。

还有另外一种计算u m a s k值的方法。我们只要记住u m a s k是从权限中“拿走”相应的位即可。

umask 文件 目录
0 6 7
1 6 6
2 4 5
3 4 4
4 2 3
5 2 2
6 0 1
7 0 0

例如,对于u m a s k值0 0 2,相应的文件和目录缺省创建权限是什么呢?

QUOTE:
第一步,我们首先写下具有全部权限的模式,即7 7 7 (所有用户都具有读、写和执行权限)。
第二步,在下面一行按照u m a s k值写下相应的位,在本例中是0 0 2。
第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。
稍加练习就能够记住这种方法。
第四步,对于文件来说,在创建时不能具有文件权限,只要拿掉相应的执行权限比特即可。

这就是上面的例子,其中u m a s k值为0 0 2:

QUOTE:
1) 文件的最大权限rwx rwx rwx (777)
2) umask值为0 0 2 - - - - - - -w-
3) 目录权限rwx rwx r-x (775) 这就是目录创建缺省权限
4) 文件权限rw- rw- r-- (664) 这就是文件创建缺省权限

下面是另外一个例子,假设这次u m a s k值为0 2 2:

QUOTE:
1) 文件的最大权限rwx rwx rwx (777)
2 ) u m a s k值为0 2 2 - - - -w- -w-
3) 目录权限rwx r-x r-x (755) 这就是目录创建缺省权限
4) 文件权限rw- r-- r-- (644) 这就是文件创建缺省权限

如果想知道当前的umask 值,可以使用u m a s k命令:

#su sam /*切换到sam用户玩境下
#umask /*查看sam的umask
0022
前面多了个0,是suid/guid的



$ touch file1
$ mkdir file2
$ ls -l
总用量 8
-rw-r--r-- 1 sam adm 0 10月 30 19:27 file1
drwxr-xr-x 2 sam adm 4096 10月 30 19:28 file2



QUOTE:
新建文件file1和目录file2,查看新建文件和目录的默认权限,umask为022时
目录权限rwx r-x r-x (755)
文件权限rw- r-- r-- (644)

更改umask默认值由022至002

$ umask 002
$ touch file3
$ ls -l
总用量 12
-rw-r--r-- 1 sam adm 0 10月 30 19:27 file1
drwxr-xr-x 2 sam adm 4096 10月 30 19:28 file2
-rw-rw-r-- 1 sam adm 0 10月 30 19:34 file3
drwxrwxr-x 2 sam adm 4096 10月 30 19:34 file4



QUOTE:
可以看到,新建文件和目录的默认权限改变了,umask为002时
目录权限rwx rwx r-x (775)
文件权限rw- rw- r-- (664)

可以看见,$ umask 002已生效


补充umask的另一种用法,书上没有的,我觉得这个比较方便

先说一下umask在不同玩境下的不同

1、bash
umask [-p] [-S] [mode]

2、tcsh
umask [value]

说明

当新增文件或目录时,预设的使用权限,由 umask 这个内设值所规定的。
一般情况下,umask 会被设定在 shell 的启始档案中。

QUOTE:
对 bash 的使用者来说,个人的启始档案是 $HOME/.bashrc,使用者可以将 umask 设定在其中。像 RedHat 9 是放 /etc 之下,档名为 bashrc。
当使用者没有自行设定,umask 设定值便来自于此系统的默认设定。

tcsh 的个人启始档案为 ~/.tcshrc,系统设定文件在 /etc/csh.cshrc。



linux 操作系统的角度,完整的权限设定值是四位数字。
第一位数,代表档案或目录的特殊属性。 4 代表 "suid"﹔2 代表 "sgid"﹔1 代表 "粘滞位 - save text image"。
后三位数,依序代表 "user-档案拥有者","group-群组","other-其它"。
每一位数,代表三种权限的叠加,4-读(r),2-写(w),1-执行(x)。
被禁止的权限则以 0 带入。



QUOTE:
对 umask 来说,有效的设定值只有后三位数。在 bash 中,虽然可带入四位数字,但第一个数字,必须为 0。这点请注意。



指令 umask 的设定值以三个八进位的数字“nnn”代表。
第一个设定数字给使用者自己(owner user),
第二个则是设定给用使用者所属的群体(group),
第三个给不属于同群体的其它使用者(other)。
每一位数字的设定值都是三项不同权限的数值加总,read 权限数值为 4;write 权限数值为 2;execute 权限数值为 1。
结合了前三者的权限数值,单一的数字可设定的范围是 0 ~ 7;整体的可设定范围是 000 ~ 777。

umask 的设定值,对目录,与对档案的实质作用是有差别的。

注意:

当我们设定为 000 时,会得到完全开放的目录权限 777,以及文件权限 666。为何文件只得到 666 呢?因为文件权限中的 execute 权限已被程序移除,因此,不管你设定什么 umask 数值,文件都不会出现 execute 权限。

umask 语法如下:

umask who operator permissions

其中,参数的含义如下:

who:表示下列字符中的一个、两个或全部:

u(表示用户权限)
g(表示组用户权限)
o(表示其他用户权限)
a (ugo 的缩写形式)

如果忽略了字符 who,operator 和 permissions 将适用于所有类(等同于 a 或 ugo)。

operator:字符 +、- 或 = 之一:

+ 增加权限。
- 取消权限。
= 设定权限。



permissions:字符或字符组合 r、w、x、rx、wx、rw 或 rwx 之一,用于为相应的 who 和 operator 指定读、写和(或)执行(搜索)权限。

如果未指定 permissions,则相应的 who 中的现有文件创建模式掩码不会发生更改。

如果在 shell 提示符下设置 umask,它将只适用于当前登录会话中的 shell 和 subshell。但不适用于以后登录的会话。要在登录时自动应用 umask 设置,请将 umask 命令添加到 .profile 文件(对于 POSIX 和 Bourne Shell 用户)或 .login 文件中(对于 C Shell 用户)。
选项说明

bash

-S

以 "u=rwx,g=rx,o=rx" 这种较人性的格式取代数字显示。



-p

当使用 -p 选项,但 mode 省略,输出格式为 umask mode (可以做为下 umask 指令使用)。当模式改变成功,或 mode 参数被省略,执行的状态值为 0。否则状态值为 1。

实例说明

bash

首先,让我们先显示目前环境的 umask 设定情况

# umask
0022
#

得到的数值为 "0022"。所以,建立新档案的预设权限是 644,目录则是755。如果不习惯看数字,我们可以使用 -S 选项来显示设定值

# umask -S
u=rwx,g=rx,o=rx
#

实际建个档案与目录看看

# ls >; fileA
# mkdir dirB
# ls -l
总计 8
drwxr-xr-x 2 root root 4096 12月 21 16:42 dirB
-rw-r--r-- 1 root root 6 12月 21 16:42 fileA
#

可以看到文件和目录的不同

tcsh

$ umask
22
$
$ umask 000
$ umask
0
$

从以上,我们可以知道,tcsh 简单到连 0 都懒的显示...

要设置 umask 值,使文件所有者具有读写执行权限,属组的其他用户具有只读权限,除此之外的其他用户没有访问权限 (-rw-r-------),请输入以下内容:

$ umask u=rwx,g=r,o=r
$ touch file5
$ mkdir file6
$ ls -l
总用量 16
-rw-r--r-- 1 sam adm 0 10月 30 19:48 file5
drwxr--r-- 2 sam adm 4096 10月 30 19:48 file6

要确定当前的 umask 设置,请键入:

$ umask -S
u=rwx,g=r,o=r


符号链接

存在两种不同类型的链接,软链接和硬链接。修改其中一个,硬连接指向的是节点(inode),而软连接指向的是路径(path)



软链接文件

  软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象",链接文件甚至可以循环链接自己。类似于编程语言中的递归。

命令格式:

ln [-s] source_path target_path

硬链接文件

  info ln 命令告诉您,硬链接是已存在文件的另一个名字,硬连接的命令是

ln -d existfile newfile



QUOTE:
硬链接文件有两个限制

  1、不允许给目录创建硬链接;
  2、只有在同一文件系统中的文件之间才能创建链接。

  对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。修改其中一个,与其连接的文件同时被修改

举例 说明:

$umask 022
$ cp /etc/httpd/conf/httpd.conf /usr/sam

原来前面做的试验,改变了系统默认的umask值,现在改回来为022,
举个httpd.conf文件做例 子

$ ln httpd.conf httpd1.conf
$ ln -s httpd.conf httpd2.conf

第一条为硬链接,第二条为软链接

$ ls -li



总用量 80
1077669 -rw-r--r-- 2 sam adm 34890 10月 31 00:57 httpd1.conf
1077668lrwxrwxrwx 1 sam adm 10 10月 31 00:58 httpd2.conf ->; httpd.conf
1077669-rw-r--r-- 2 sam adm 34890 10月 31 00:57 httpd.conf

可以看到,使用ls -li,软连接只产生了10字节的快捷而已,硬连接却实实在在的的拷贝。最前面的inode硬链接和源文件是一样的,而软链接不一样,具体看一下回复这话有误,但先这么理解,具体请看下面的回复

对http1.conf进行编辑,可以发现httpd.conf也发生了一样的变化

$ rm httpd.conf

现在删除链接的源文件,来比较不同之处

$ ls -l
总用量 44
drw-r--r-- 2 sam adm 4096 10月 30 20:14 file6
-rw-r--r-- 1 sam adm 34890 10月 31 00:57 httpd1.conf
lrwxrwxrwx 1 sam adm 10 10月 31 00:58 httpd2.conf ->; httpd.conf

发现,httpd2.conf实际已经不存在了,是断链,而httpd1.conf变也了普通文件
转一个:更好理解

索引节点、硬连接和连接计数

索引节点inode:

QUOTE:
Linux为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。

例如:

假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行:

This is my file.



1、当然这行文字一定是存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇区号来描述,在本例中假设分别是1、20、30)。

2、假设其inode是262457,那么系统通过一段标准程序,就能将这个inode转换成存放此文件的具体物理地址(1磁头、20柱面、30扇区),最终读出文件的内容:“This is my file.”

3、所以inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不同物理数据区的文件必定分别对应着两个不同的inode号码。

文件拷贝命令与硬链接的区别:

# cp /home/zyd/mytext newfile

在当前工作目录建立了一个新文件newfile,其实际操作主要包括如下三步:

1、在当前目录中增加一个目录项,其文件名域填入newfile,并分配了一个新的inode,假设是262456。
2、将原文件(在1磁头、20柱面、30扇区)的内容复制了一份到新的空闲物理块(假设是1磁头、20柱面、31扇区)。
3、填写一些其他关键信息,使系统通过这些信息及inode号码可以完成物理地址的转换。

所以文件复制要分配新的inode和新的数据区,虽然两个文件的内容是一样的。


硬连接hardlink:

我们实际使用文件时一般是通过文件名来引用的。通过上面的讨论,我们知道:

1个inode号码肯定和一片完全属于一个文件的数据区一一对应。那么一个文件系统中两个或更多个不同的文件名能否对应同一个文件呢?答案是肯定的。

我们知道inode号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项具有相同的inode值,实际上就使它们对应着同一个文件。

有几个目录项具有相同的inode号,我们就说这个文件有几个硬连接(hardlink),

对于普通文件,ls -l命令的连接计数count域的数值就是本文件拥有的硬连接数。硬连接可以通过ln命令建立,

例如:

# ln /home/zyd/mytext hardlink_mytext

就建立了一个新的文件hardlink_mytext,这个文件的inode同样是262457。建立硬连接实际上只是增加了一个目录项,但并复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保证两个文件能同步更新。

'ls -il'可以显示文件的inode(在下面最左边):

262456 -rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext

连接计数count:

前面我们介绍了,文件的连接计数域表明本系统中共有几个文件目录项的inode和本文件相同,也就是本文件共有几个硬连接。如上面的例子中hardlink_mytext和mytext文件的count值都是2。

那么对于目录,其count域的含义是什么呢?目录的count同样表示共有多少个目录项指向此目录,不过要详细说明必须进一步解释VFS文件系统的结构,为简单起见,只要这样理解就行了:(count-2)等于本目录包含的直接子目录数(就是只包括儿子,不包括孙子啦!)。

例如:如果一个目录/abc的count域为5,那么/abc目录一定包含3个子目录。
进一步说明:

硬连接文件实际上并不是一种新的文件类型,两个文件互为对方的硬连接。它们应该都是普通文件(谁能告诉我:其它类型的文件可以硬连接吗?)。两个文件除了名称或/和文件目录不同外,其它部分完全相同,更改了一个文件,另一个的文件长度、内容、更改时间等都将相应发生变化,更改了一个文件的权限位mode,另一个也会发生同样的变化。
注意连接计数字段count,互为硬连接的两个文件的count值都是2,表明有两个inode指向同一文件的inode。

当我们删除其中一个文件时,系统首先将(count-1)->;count,如果结果是零,就将其目录项和数据区都删除,否则只将本目录项删除,数据区仍然保留,仍然可以通过另外的文件名访问。根据这个特性,可以通过为重要的文件建立硬连接的方法来防止其被误删除。

一个文件系统允许的inode节点数是有限的,如果文件数量太多,即使每个文件都是0字节的空文件,系统最终也会因为节点空间耗尽而不能再创建文件。所以当发现不能建立文件时首先要考虑硬盘数据区是否还有空间(可通过du命令),其次还得检查节点空间。

互为硬连接的多个文件必须位于同一个文件系统上。根设备及任何一个需要mount才能挂接进来的分区、软盘、NFS、光驱等都是一个独立的文件系统,每个文件系统有一个相应的设备号,不同文件系统中具有相同inode节 点的文件间没有任何联系。系统则通过设备号和inode号的组合唯一确定一个文件。

Linux之所以能支持多种文件系统,其实是由于Linux提供了一个虚拟文件系统VFS,VFS作为实际文件系统的上层软件,掩盖了实际文件系统底层的具体结构差异,为系统访问位于不同文件系统的文件提供了一个统一的接 口。

实际上许多文件系统并不具备inode结构,其目录结构也和以上的讨论不同,但通过VFS,系统均为其提供了虚拟一致的inode和目录项结构。

所以,'ls -il'命令实际显示的inode应该是VFS inode,也就是说,inode是存在于内存中的数据结构,而不一定是实际的硬盘结构。

但为Linux量身定做的ext2文件系统具备实际的inode和连接型目录项结构,所以,对于ext2文件系统,可以认为我们上面讨论的关于硬连接的概念是完全正确的。

u 文件属主权限。
g 属组用户权限。
o 其他用户权限。
a 所有用户(文件属主、属组用户及其他用户)。

o p e r a t o r的含义:

+ 增加权限。
- 取消权限。
= 设定权限。

p e r m i s s i o n的含义:

r 读权限。
w 写权限。
x 执行权限。
s 文件属主和组set-ID。
t 粘性位*。
l 给文件加锁,使其他用户无法访问。
u,g,o 针对文件属主、属组用户及其他用户的操作。

*在列文件或目录时,有时会遇到“ t”位。“t”代表了粘性位。如果在一个目录上出现“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个属组用户具有和属主同等的权限。不过有的系统在这一规则上并不十分严格。

如果在文件列表时看到“ t”,那么这就意味着该脚本或程序在执行时会被放在交换区(虚存)。

对"t"粘贴位的解释:


1,t 权限是粘着位,例:TMP目录下,任何人都有读写执行权限,但是不是任何人对里边的可写权限的文件就可以删除呢,当然不是了,这个就是粘着位的做用,只有所有者才有权删除自已的文件,当然,ROOT除外
2,关于文件安全的另一种权限,
i权限 也就是不可修改权限例:chattr u+i aaa 则aaa文件就不可修改,无论任何人,如果删除就用u-i就好了
a权限 也就是只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。方法和i权限一样加
如果想要看某个文件是不是有这个权限,用lsattr filename就行了

例如:

chmod a-x temp //rw- rw- rw- 收回所有用户的执行权限
chmod og-w temp //rw- r-- r- - 收回属组用户和其他用户的写权限
chmod g+w temp //rw- rw- r- - 赋予属组用户写权限
chmod u+x temp //rwx rw- r- - 赋予文件属主执行权限
chmod go+x temp //rwx rwx r- x 赋予属组用户和其他用户执行权限

举如

当创建temp文件时,它具有这样的权限:

-rw-r--r-- 1 root root 0 10月 19 20:16 temp

如果要使属主和属组用户具有有执行权限,并取消其他用户(所有其他用户)的写权限,可以用:

$ chmod ug+x temp
$ chmod o-w temp

这样,该文件的权限变为:

-rwxr--r-- 1 root root 0 10月 19 20:16 temp

分享到:
评论

相关推荐

    shell学习脚本指南-1(中文完整版)

    有了Shell脚本,你可以结合基本的UNIX文本与文件处理命令来消化数据,以及自动化重复的工作。一旦你对Shell脚本的编写掌控自如,在接下来的几年,这些技巧将对你相当有帮助。 编写Shell脚本所需要的不只是对Shell...

    shell学习脚本指南-3(中文完整版)

    有了Shell脚本,你可以结合基本的UNIX文本与文件处理命令来消化数据,以及自动化重复的工作。一旦你对Shell脚本的编写掌控自如,在接下来的几年,这些技巧将对你相当有帮助。 编写Shell脚本所需要的不只是对Shell...

    UNIX命令及SHELL编程

    01_Shell-文件安全与权限.PDF 02_Shell-使用find和xargs.PDF 03_Shell-后台执行命令.PDF 04_Shell-文件名置换.PDF 05_Shell-shell输入与输出.PDF 06_Shell-命令执行顺序.PDF 07_文本过滤-正则表达式介绍.PDF ...

    shell学习脚本指南-2(中文完整版)

    有了Shell脚本,你可以结合基本的UNIX文本与文件处理命令来消化数据,以及自动化重复的工作。一旦你对Shell脚本的编写掌控自如,在接下来的几年,这些技巧将对你相当有帮助。 编写Shell脚本所需要的不只是对Shell...

    Linux常见命令与shell脚本

    1.19 chmod 修改文件权限 9 1.20 chgrp改变文件/目录所属的组 11 1.21 chown更改某个文件/目录的所有者和属组 11 1.22 find文件查找 11 1.23 locate快速文件查找 13 1.24 whereis和which查找命令所在目录 13 1.25 ...

    java调用shell脚本执行sqlldr与存储过程

    在java代码中调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。...于是我把oracle的所有环境变量直接复制到shell脚本文件中,在java中调用了一下,然后所有问题迎刃而解! 具体代码参看文件内容

    Linux与UNIX Shell编程指南.rar

    第一章 文件安全与权限 第二章 使用FIND和XARGS 第三章 后台执行命令 第四章 文件名置换 第五章 SHELL输入输出 第六章 命令执行顺序 第二部分 文本过滤 第七章 正则表达式介绍 第八章 GERP家族 第九章 AWK介绍 第十...

    LINUX与UNIX SHELL编程指南

    001-文件安全与权限.PDF 002-使用find和xargs.PDF 003-后台执行命令.PDF 004-文件名置换.PDF 005-shell输入与输出.PDF 006-命令执行顺序.PDF 007-正则表达式.PDF 008-grep家族.PDF 009-AWK介绍.PDF 010-sed 用法介绍...

    shell帮助文档

    01-文件安全与权限.pdf 02-使用find和xargs.pdf 03-后台执行命令.pdf 04-文件名置换.pdf 05-shell输入与输出.pdf 06-命令执行顺序.pdf 07-正则表达式介绍.pdf 08-grep 家族.pdf 09-AWK 介绍.pdf 10-sed 用法介绍.pdf...

    Shell脚本学习笔记

    1.7 Linux文件权限 40 1.7.1 Linux安全性 40 1.7.2 使用Linux用户组 46 1.7.3 解码文件权限 47 1.7.4 修改安全设置 49 1.8 vim编辑器 52 第2章 基本脚本编译 54 2.1 创建脚本与使用变量 54 2.1.1 创建脚本 54 2.1.2 ...

    Linux基础知识与系统管理教学课件-pdf.rar

    8.2.3 权限管理-文件特殊权限-Sticky BIT 8.3 权限管理-chattr权限 8.4 权限管理-sudo权限 9 文件系统管理 9.1 文件系统管理-回顾分区和文件系统 9.2.1 文件系统管理-文件系统常用命令-df、du、fsck、dumpe2fs ...

    shell脚本实现俄罗斯方块.txt

    此段shell脚本实现俄罗斯方块的脚本,是我在网上转载过来的,整段代码一共619行。嵌进linux的shell环境,给予文件可执行权限,在执行脚本文件即可。此段代码我已经测试过。

    Linux基础知识与系统管理视频.rar

    8.2.3 权限管理-文件特殊权限-Sticky BIT 8.3 权限管理-chattr权限 8.4 权限管理-sudo权限 9 文件系统管理 9.1 文件系统管理-回顾分区和文件系统 9.2.1 文件系统管理-文件系统常用命令-df、du、fsck、dumpe2fs ...

    shell编程指南,shell脚本,本书共分五部分全。grep家族,sed,AWK,正则表达式,tr用法

    第1章 文件安全与权限 1 第2章 使用find和xargs 14 第3章 后台执行命令 22 第4章 文件名置换 31 第5章 shell输入与输出 34 第6章 命令执行顺序 46 第二部分 文本过滤 第7章 正则表达式介绍 49 第8章 grep家族 56 第...

    ubuntu 切换java版本的shell脚本文件

    将文件放在home目录,修改权限sudo chmod a+x sw_java.sh,在任何目录执行:. ~/sw_java.sh输入对应的java版本回车即可,详细内容见博客地址:https://blog.csdn.net/hello_java_Android/article/details/79267509

    Shell脚本编程基本知识

    介绍Shell编程的基本知识 shell脚本能提高用户操作和管理员进行系统管理的效率,一般步骤 编辑器编写脚本程序 shell做解释程序,非交互地执行脚本,两种执行方式: ...给脚本文件添加执行权限,用./命令执行

    Linux shell脚本 精华中文版

    016_基础shell编程_shell脚本介绍.pdf 017_条件测试_test_expr.pdf 018_控制流结构_if_for_while_case_util_break_continue.pdf 019_Shell函数.pdf 020_向脚本传递参数_shift_getops.pdf 021_创建屏幕输出_...

    shell脚本详解

    第1章_文件安全与权限; 第2章_使用find和xargs; 第3章_后台执行命令; 第4章_文件名置换; 第5章_shell输入与输出; 第6章_命令执行顺序; 第7章_正则表达式介绍; 第8章_grep家族; 第9章_awk介绍; 第10章_sed...

Global site tag (gtag.js) - Google Analytics