免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 10267 | 回复: 36
打印 上一主题 下一主题

LINUX与UNIX SHELL编程指南 目录和第一部分s h e l l [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-25 11:19 |只看该作者 |倒序浏览
本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。

[ 本帖最后由 sd-feng 于 2006-5-25 11:21 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-05-25 11:20 |只看该作者
目      录
译者序
前言
第一部分   shell
第1章   文件安全与权限        1
1.1   文件        1
1.2   文件类型        2
1.3   权限        2
1.4   改变权限位        4
1.4.1   符号模式        4
1.4.2   chmod命令举例        5
1.4.3   绝对模式        5
1.4.4   chmod命令的其他例子        6
1.4.5   可以选择使用符号模式或绝对模式        7
1.5   目录        7
1.6   suid/guid        7
1.6.1   为什么要使用suid/guid        8
1.6.2   设置suid/guid的例子        8
1.7   chown和chgrp        9
1.7.1   chown举例        9
1.7.2   chgrp举例        9
1.7.3   找出你所属于的用户组        9
1.7.4   找出其他用户所属于的组        10
1.8   umask        10
1.8.1   如何计算umask值        10
1.8.2   常用的umask值        11
1.9   符号链接        12
1.9.1   使用软链接来保存文件的多个映像        12
1.9.2   符号链接举例        12
1.10   小结        13
第2章   使用find和xargs        14
2.1   find命令选项        14
2.1.1   使用name选项        15
2.1.2   使用perm选项        16
2.1.3   忽略某个目录        16
2.1.4   使用user和nouser选项        16
2.1.5   使用group和nogroup选项        16
2.1.6   按照更改时间查找文件        17
2.1.7   查找比某个文件新或旧的文件        17
2.1.8   使用type选项        17
2.1.9   使用size选项        18
2.1.10   使用depth选项        18
2.1.11   使用mount选项        18
2.1.12   使用cpio选项        18
2.1.13   使用exec或ok来执行shell命令        19
2.1.14   find命令的例子        20
2.2   xargs        20
2.3   小结        21
第3章   后台执行命令        22
3.1   cron和crontab        22
3.1.1   crontab的域        22
3.1.2   crontab条目举例        23
3.1.3   crontab命令选项        23
3.1.4   创建一个新的crontab文件        24
3.1.5   列出crontab文件        24
3.1.6   编辑crontab文件        24
3.1.7   删除crontab文件        25
3.1.8   恢复丢失的crontab文件        25
3.2   at命令        25
3.2.1   使用at命令提交命令或脚本        26
3.2.2   列出所提交的作业        27
3.2.3    清除一个作业        27
3.3   &命令        27
3.3.1   向后台提交命令        28
3.3.2   用ps命令查看进程        28
3.3.3   杀死后台进程        28
3.4   nohup命令        29
3.4.1  使用nohup命令提交作业        29
3.4.2   一次提交几个作业        29
3.5   小结        30
第4章   文件名置换        31
4.1   使用*        31
4.2   使用?        32
4.3   使用[...]和[!...]        32
4.4   小结        33
第5章   shell输入与输出        34
5.1   echo        34
5.2   read        35
5.3   cat        37
5.4   管道        38
5.5   tee        39
5.6   标准输入、输出和错误        40
5.6.1   标准输入        40
5.6.2   标准输出        40
5.6.3   标准错误        40
5.7   文件重定向        40
5.7.1   重定向标准输出        41
5.7.2   重定向标准输入        42
5.7.3   重定向标准错误        42
5.8   结合使用标准输出和标准错误        43
5.9   合并标准输出和标准错误        43
5.10   exec        44
5.11   使用文件描述符        44
5.12   小结        45
第6章   命令执行顺序        46
6.1   使用&&        46
6.2   使用||        46
6.3   用()和{ }将命令结合在一起        47
6.4   小结        48
第二部分   文本过滤
第7章  正则表达式介绍        49
7.1  使用句点匹配单字符        50
7.2   在行首以^匹配字符串或字符序列        50
7.3   在行尾以$匹配字符串或字符        51
7.4   使用*匹配字符串中的单字符或其重复
序列        51
7.5   使用\屏蔽一个特殊字符的含义        52
7.6   使用[]匹配一个范围或集合        52
7.7   使用\{\}匹配模式结果出现的次数        53
7.8   小结        55
第8章   grep家族        56
8.1   grep        57
8.1.1   双引号引用        57
8.1.2   grep选项        57
8.1.3   查询多个文件        57
8.1.4   行匹配        57
8.1.5   行数        58
8.1.6   显示非匹配行        58
8.1.7   精确匹配        58
8.1.8   大小写敏感        58
8.2   grep和正则表达式        58
8.2.1   模式范围        59
8.2.2   不匹配行首        59
8.2.3   设置大小写        59
8.2.4   匹配任意字符        59
8.2.5   日期查询        59
8.2.6   范围组合        60
8.2.7   模式出现机率        60
8.2.8   使用grep匹配“与”或者“或”模式        61
8.2.9   空行        61
8.2.10   匹配特殊字符        61
8.2.11   查询格式化文件名        61
8.2.12   查询IP地址        61
8.3   类名        62
8.4   系统grep命令        62
8.4.1   目录        63
8.4.2   passwd文件        63
8.4.3   使用ps命令        63
8.4.4   对一个字符串使用grep        64
8.5   egrep        64
8.6   小结        65
第9章   AWK介绍        66
9.1   调用awk        66
9.2   awk脚本        67
9.2.1   模式和动作        67
9.2.2   域和记录        67
9.2.3   awk中正则表达式及其操作        70
9.2.4   元字符        70
9.2.5   条件操作符        70
9.2.6   awk内置变量        73
9.2.7   NF、NR和FILENAME        74
9.2.8   awk操作符        75
9.2.9   内置的字符串函数        78
9.2.10   字符串屏蔽序列        80
9.2.11   awk输出函数printf        81
9.2.12   printf修饰符        81
9.2.13   awk数组        86
9.3   小结        88
第10章   sed 用法介绍        89
10.1   sed怎样读取数据        89
10.2   调用sed        89
10.2.1   保存sed输出        90
10.2.2   使用sed在文件中查询文本的方式        90
10.2.3   基本sed编辑命令        90
10.3   sed和正则表达式        91
10.4   基本sed编程举例        91
10.4.1   使用p(rint)显示行        91
10.4.2   打印范围        91
10.4.3   打印模式        92
10.4.4   使用模式和行号进行查询        92
10.4.5   匹配元字符        92
10.4.6   显示整个文件        92
10.4.7   任意字符        92
10.4.8   首行        92
10.4.9   最后一行        93
10.4.10   打印行号        93
10.4.11   附加文本        93
10.4.12   创建sed脚本文件        94
10.4.13   插入文本        94
10.4.14   修改文本        95
10.4.15   删除文本        96
10.4.16   替换文本        96
10.5   使用替换修改字符串        97
10.6   将sed结果写入文件命令        97
10.7   从文件中读文本        98
10.8   匹配后退出        98
10.9   显示文件中的控制字符        99
10.10   使用系统sed        99
10.10.1   处理控制字符        99
10.10.2   处理报文输出        101
10.10.3   去除行首数字        101
10.10.4   附加文本        102
10.10.5   从shell向sed传值        102
10.10.6   从sed输出中设置shell变量        102
10.11   快速一行命令        102
10.12   小结        103
第11章   合并与分割        104
11.1   sort用法        104
11.1.1   概述        104
11.1.2   sort选项        104
11.1.3   保存输出        105
11.1.4   sort启动方式        105
11.1.5   sort对域的参照方式        105
11.1.6   文件是否已分类        105
11.1.7   基本sort        106
11.1.8   sort分类求逆        106
11.1.9   按指定域分类        106
11.1.10   数值域分类        106
11.1.11   唯一性分类        107
11.1.12   使用k的其他sort方法        108
11.1.13   使用k做分类键排序        108
11.1.14   指定sort序列        108
11.1.15   pos用法        108
11.1.16   使用head和tail将输出分类        109
11.1.17   awk使用sort输出结果        109
11.1.18   将两个分类文件合并        110
11.2   系统sort        110
11.3   uniq用法        111
11.4   join用法        112
11.5   cut用法        114
11.5.1   使用域分隔符        115
11.5.2   剪切指定域        115
11.6   paste用法        116
11.6.1    指定列        116
11.6.2   使用不同的域分隔符        116
11.6.3   paste命令管道输入        117
11.7   split用法        117
11.8   小结        118
第12章   tr用法        119
12.1   关于tr        119
12.1.1   字符范围        119
12.1.2   保存输出        120
12.1.3   去除重复出现的字符        120
12.1.4   删除空行        120
12.1.5   大写到小写        121
12.1.6   小写到大写        121
12.1.7   删除指定字符        121
12.1.8   转换控制字符        122
12.1.9   快速转换        122
12.1.10   匹配多于一个字符        123
12.2   小结        123
第三部分   登录环境
第13章   登录环境        125
13.1   /etc/profile        125
13.2   用户的$HOME.profile        128
13.3   stty用法        129
13.4   创建.logout文件        131
13.5   小结        131
第14章   环境和shell变量        132
14.1   什么是shell变量        132
14.2   本地变量        132
14.2.1    显示变量        133
14.2.2   清除变量        133
14.2.3   显示所有本地shell变量        133
14.2.4   结合变量值        134
14.2.5   测试变量是否已经设置        134
14.2.6   使用变量来保存系统命令参数        135
14.2.7   设置只读变量        135
14.3   环境变量        136
14.3.1   设置环境变量        136
14.3.2   显示环境变量        136
14.3.3   清除环境变量        137
14.3.4   嵌入shell变量        137
14.3.5   其他环境变量        139
14.3.6   set命令        140
14.3.7   将变量导出到子进程        140
14.4   位置变量参数        141
14.4.1   在脚本中使用位置参数        142
14.4.2   向系统命令传递参数        142
14.4.3   特定变量参数        143
14.4.4   最后的退出状态        144
14.5   小结        145
第15章   引号        146
15.1   引用必要性        146
15.2   双引号        146
15.3   单引号        147
15.4   反引号        147
15.5   反斜线        148
15.6   小结        149
第四部分   基础shell编程
第16章   shell脚本介绍        151
16.1   使用shell脚本的原因        151
16.2   脚本内容        151
16.3   运行一段脚本        152
16.4   小结        153
第17章   条件测试        154
17.1   测试文件状态        154
17.2   测试时使用逻辑操作符        155
17.3   字符串测试        155
17.4   测试数值        156
17.5   expr用法        157
17.5.1   增量计数        158
17.5.2   数值测试        158
17.5.3   模式匹配        158
17.6   小结        159
第18章   控制流结构        160
18.1   退出状态        160
18.2   控制结构        160
18.2.1   流控制        161
18.2.2   循环        161
18.3   if then else语句        161
18.3.1   简单的if语句        162
18.3.2   变量值测试        162
18.3.3   grep输出检查        163
18.3.4   用变量测试grep输出        163
18.3.5   文件拷贝输出检查        164
18.3.6   当前目录测试        164
18.3.7   文件权限测试        165
18.3.8   测试传递到脚本中的参数        165
18.3.9   决定脚本是否为交互模式        165
18.3.10   简单的if else语句        166
18.3.11  变量设置测试        166
18.3.12   检测运行脚本的用户        166
18.3.13   将脚本参数传入系统命令        167
18.3.14   null:命令用法        167
18.3.15   测试目录创建结果        168
18.3.16   另一个拷贝实例        169
18.3.17   多个if语句        169
18.3.18   测试和设置环境变量        169
18.3.19   检测最后命令状态        170
18.3.20   增加和检测整数值        171
18.3.21   简单的安全登录脚本        172
18.3.22   elif用法        173
18.3.23   使用elif进行多条件检测        173
18.3.24   多文件位置检测        174
18.4   case语句        175
18.4.1   简单的case语句        175
18.4.2   对匹配模式使用|        176
18.4.3   提示键入y或n        177
18.4.4   case与命令参数传递        177
18.4.5   捕获输入并执行空命令        178
18.4.6   缺省变量值        179
18.5   for循环        180
18.5.1   简单的for循环        181
18.5.2   打印字符串列表        181
18.5.3   对for循环使用ls命令        181
18.5.4   对for循环使用参数        182
18.5.5   使用for循环连接服务器        183
18.5.6   使用for循环备份文件        183
18.5.7   多文件转换        183
18.5.8   多sed删除操作        184
18.5.9    循环计数        184
18.5.10   for循环和本地文档        184
18.5.11   for循环嵌入        185
18.6   until循环        186
18.6.1   简单的until循环        186
18.6.2   监视文件        187
18.6.3   监视磁盘空间        187
18.7   while循环        188
18.7.1   简单的while循环        188
18.7.2   使用while循环读键盘输入        188
18.7.3   用while循环从文件中读取数据        189
18.7.4   使用IFS读文件        189
18.7.5   带有测试条件的文件处理        190
18.7.6   扫描文件行来进行数目统计        191
18.7.7   每次读一对记录        193
18.7.8   忽略#字符        193
18.7.9   处理格式化报表        194
18.7.10   while循环和文件描述符        196
18.8   使用break和continue控制循环        197
18.8.1   break        197
18.8.2   跳出case语句        197
18.8.3   continue        197
18.8.4   浏览文件行        198
18.9   菜单        199
18.10   小结        201
第19章   shell函数        202
19.1   在脚本中定义函数        203
19.2   在脚本中使用函数        203
19.3   向函数传递参数        203
19.4   从调用函数中返回        203
19.5   函数返回值测试        204
19.6   在shell中使用函数        204
19.7   创建函数文件        204
19.8   定位文件        205
19.9   检查载入函数        205
19.10   执行shell函数        205
19.10.1   删除shell函数        206
19.10.2   编辑shell函数        206
19.10.3   函数举例        207
19.10.4   将函数集中在一起        219
19.11   函数调用        219
19.11.1   在脚本中调用函数        219
19.11.2   从函数文件中调用函数        220
19.12   定位文件不只用于函数        222
19.13   小结        223
第20章   向脚本传递参数        224
20.1   shift命令        225
20.1.1   shift命令简单用法        225
20.1.2   命令行输入的最后一个参数        225
20.1.3   使用shift处理文件转换        226
20.2   getopts        229
20.2.1   getopts脚本实例        229
20.2.2   getopts使用方式        231
20.2.3   使用getopts指定变量取值        231
20.2.4   访问取值方式        232
20.2.5   使用getopts处理文件转换        233
20.3   小结        235
第21章   创建屏幕输出        236
21.1   tput用法        236
21.1.1   字符串输出        236
21.1.2   数字输出        237
21.1.3   布尔输出        237
21.2   tput用法        237
21.2.1   设置tput命令        237
21.2.2   使用布尔输出        237
21.2.3   在脚本中使用tput        237
21.2.4   产生转义序列        238
21.2.5   光标位置        239
21.2.6   在屏幕中心位置显示文本        240
21.2.7   查找终端属性        240
21.2.8   在脚本中使用功能键        241
21.2.9   使用颜色        242
21.2.10   产生颜色        243
21.2.11   创建精致菜单        246
21.3   小结        251
第22章   创建屏幕输入        252
22.1   增加记录        252
22.2   删除记录        262
22.3   修改记录        266
22.4   查看记录        270
22.5   小结        273
第23章   调试脚本        274
23.1   一般错误        274
23.1.1   循环错误        274
23.1.2   典型的漏写引号        274
23.1.3   测试错误        274
23.1.4   字符大小写        275
23.1.5   for循环        275
23.1.6   echo        275
23.2   set命令        275
23.3   小结        276
第24章   shell嵌入命令        277
24.1   shell嵌入命令完整列表        277
24.1.1   pwd        277
24.1.2   set        278
24.1.3   times        278
24.1.4   type        278
24.1.5   ulimit        279
24.1.6   wait        279
24.2   小结        279
第五部分   高级shell编程技巧
第25章   深入讨论<<        281
25.1   快速创建一个文件        281
25.2   快速创建打印文档        281
25.3   自动选择菜单        282
25.4   自动ftp传输        283
25.5   访问数据库        286
25.6   小结        288
第26章   shell 工具        289
26.1   创建保存信息的文件        289
26.1.1   使用date命令创建日志文件        289
26.1.2   创建唯一的临时文件        290
26.2   信号        291
26.2.1   杀死一个进程        292
26.2.2   检测信号        293
26.3   trap        294
26.3.1   捕获信号并采取相应的行动        294
26.3.2   捕获信号并采取行动的另
一个例子        295
26.3.3   锁住终端        297
26.3.4   忽略信号        298
26.4   eval        300
26.4.1   执行含有字符串的命令        300
26.4.2   给每个值一个变量名        301
26.5   logger命令        302
26.5.1   使用logger命令        303
26.5.2   在脚本中使用logger命令        303
26.6   小结        305
第27章   几个脚本例子        306
27.1   pingall        306
27.2   backup_gen        306
27.3   del.lines        312
27.4   access.deny        313
27.5   logroll        316
27.6   nfsdown        317
27.7   小结        317
第28章   运行级别脚本        318
28.1   怎么知道系统中是否含有运行
级别目录        318
28.2   确定当前的运行级别        319
28.3   快速熟悉inittab        319
28.4   运行级别        320
28.4.1   各种运行级别        321
28.4.2   运行级别脚本的格式        321
28.4.3   安装运行级别脚本        322
28.5   使用inittab来启动应用程序        323
28.6   启动和停止服务的其他方法        324
28.7   小结        324
第29章   cgi脚本        325
29.1   什么是Web页面?        325
29.2   cgi        325
29.3   连接Web服务器        326
29.4    cgi和HTM脚本        326
29.4.1   基本cgi脚本        326
29.4.2   显示shell命令输出        328
29.4.3   使用SSI        330
29.4.4   访问计数器        330
29.4.5   使用一个链接来显示当前Web
环境变量        332
29.4.6   其他常用的环境变量        334
29.5   get和post方法简介        335
29.5.1   get方法        335
29.5.2   post方法        340
29.5.3   填充列表项        347
29.5.4   自动刷新页面        348
29.6   小结        349
附录   常用shell命令        350

论坛徽章:
0
3 [报告]
发表于 2006-05-25 11:22 |只看该作者
广告嫌疑
这本书不错,我看的第一本就是这本书了,错误不少,但都是很浅显的错误。

论坛徽章:
0
4 [报告]
发表于 2006-05-25 11:24 |只看该作者
第一部分s h e l l
第1章文件安全与权限

为了防止未授权用户访问你的文件,可以在文件和目录上设置权限位。还可以设定文件
在创建时所具有的缺省权限:这些只是整个系统安全问题中的一小部分。在这里我们并不想
对系统安全问题的方方面面进行全面的探讨,只是介绍一下有关文件和目录的安全问题。

本章包含以下内容:

. 文件和目录的权限。
. setuid。
. chown和c h g r p。
. umask。
. 符号链接。
创建文件的用户和他(她)所属于的组拥有该文件。文件的属主可以设定谁具有读、写、执
行该文件的权限。当然,根用户或系统管理员可以改变任何普通用户的设置。一个文件一经
创建,就具有三种访问方式:

1) 读,可以显示该文件的内容

2) 写,可以编辑或删除它

3) 执行,如果该文件是一个s h e l l脚本或程序

按照所针对的用户,文件的权限可分为三类

1) 文件属主,创建该文件的用户

2) 同组用户,拥有该文件的用户组中的任何用户

3) 其他用户,即不属于拥有该文件的用户组的某一用户



1.1 文件
当你创建一个文件的时候,系统保存了有关该文件的全部信息,包括:

. 文件的位置。
. 文件类型。
. 文件长度。
. 哪位用户拥有该文件,哪些用户可以访问该文件。
. i节点。
. 文件的修改时间。
. 文件的权限位

让我们使用ls -l 命令,来看一个典型的文件


2 第一部分shell
下载
下面让我们来分析一下该命令所得结果的前面两行,看看都包含了哪些信息

total 4232:这一行告诉我们该目录中所有文件所占的空间



- r w x r- x r- x:这是该文件的权限位。如果除去最前面的横杠,这里一共是9个字符,他们
分别对应9个权限位。通过这些权限位,可以设定用户对文件的访问权限。这9个字符可以分
为三组:
r w x:文件属主权限这是前面三位
r- x :同组用户权限这是中间三位
r- x :其他用户权限这是最后三位
后面我们还将对这些权限位作更详细的介绍。出现在r、w、x位置上的横杠表示相应的访

问权限被禁止。
1 该文件硬链接的数目。
root 文件的属主。
root 文件的属主r o o t所在的缺省组(也叫做r o o t )。
3578 用字节来表示的文件长度,记住,不是K字节!
Oct 14 04:44 文件的更新时间。
dmesg 文件名。

1.2 文件类型
还记得前面一节所提到的文件权限位前面的那个字符吗?我们现在就解释一下这个横杠
所代表的意思,文件类型有七种,它可以从ls -l命令所列出的结果的第一位看出,这七种类型
是:

d 目录

l 符号链接(指向另一个文件)

s 套接字文件

b 块设备文件

c 字符设备文件

p 命名管道文件



-普通文件,或者更准确地说,不属于以上几种类型的文件。
1.3 权限
让我们用t o u c h命令创建一个文件:

$ touch myfile


现在对该目录使用ls -l 命令:



第1章文件安全与权限3
下载
我们已经创建了一个空文件,正如我们所希望的那样,第一个横杠告诉我们该文件是一
个普通文件。你将会发现所创建的文件绝大多数都是普通文件或符号链接文件(后面将会出现
更多的符号链接文件)。

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

r w -r- -r—

接下来的三个权限位是文件属主所具有的权限;再接下来的三位是与你同组用户所具有
的权限,这里是a d m i n组;最后三位是其他用户所具有的权限。在该命令的结果中,我所属于
的缺省组也显示了出来。下面是对该文件权限的精确描述:

表1-1 ls -l命令输出的含义

(第一个字符) 普通文件
(接下来的三个字符) r w 文件属主的权限
(再接下来的三个字符) r- 同组用户的权限
(最后三个字符) r- 其他用户的权限

因此,这三组字符(除了第一个字符)分别定义了

1) 文件属主所拥有的权限

2) 文件属主缺省组(一个用户可以属于很多的组)所拥有的权限

3) 系统中其他用户的权限

在每一组字符中含有三个权限位

r 读权

w 写/更改权

x 执行该脚本或程序的权

这里我们采用另外一种方式来表示刚才所列出m y f i l e的文件权限



-r w -r- -r--

文件类型为普通文件文件属主可以读、写同组用户可以读其他用户可以读

你可能已经注意到了,m y f i l e在创建的时候并未给属主赋予执行权限,在用户创建文件时,
系统不会自动地设置执行权限位。这是出于加强系统安全的考虑。必须手工修改这一权限位:
后面讲到u m a s k命令时,你就会明白为什么没有获得执行权限。然而,你可以针对目录设置执
行权限位,但这与文件执行权限位的意义有所不同,这一点我们将在后面讨论。

上面这段关于权限位的内容可能不太好理解,让我们来看几个例子(见表1 - 2 )。

更令人迷惑的是,对于文件属主来说,在只有读权限位被置位的情况下,仍然可以通过
文件重定向的方法向该文件写入。过一会儿我们就会看到,能否删除一个文件还依赖于该文
件所在目录权限位的设置。

表1-2 文件权限及含义

权限所代表的含义
r-- --- --文件属主可读,但不能写或执行
r-- r-- --文件属主和同组用户(一般来说,是文件属主所在的缺省组)可读
r-- r-- r- 任何用户都可读,但不能写或执行
rwx r-- r- 文件属主可读、写、执行,同组用户和其他用户只可读
rwx r-x --文件属主可读、写、执行,同组用户可读、执行

论坛徽章:
0
5 [报告]
发表于 2006-05-25 11:26 |只看该作者
原帖由 大蚂蚁 于 2006-5-25 11:22 发表
广告嫌疑
这本书不错,我看的第一本就是这本书了,错误不少,但都是很浅显的错误。


靠!打击俺发帖积极性!
有需要的就到我的ftp去下吧.

[ 本帖最后由 sd-feng 于 2006-5-25 11:32 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-05-25 11:28 |只看该作者
4 第一部分shell
下载
(续)

权限所代表的含义
rwx r-x r- x 文件属主可读、写、执行,同组用户和其他用户可读、执行
rw- rw- --文件属主和同组用户可读、写
rw- rw- r- 文件属主和同组用户可读、写,其他用户可读
rw- rw- --文件属主和同组用户及其他用户读可以读、写,慎用这种权限
设置,因为任何用户都可以写入该文件

1.4 改变权限位
对于属于你的文件,可以按照自己的需要改变其权限位的设置。在改变文件权限位设置
之前,要仔细地想一想有哪些用户需要访问你的文件(包括你的目录)。可以使用c h m o d命令来
改变文件权限位的设置。这一命令有比较短的绝对模式和长一些的符号模式。我们先来看一
看符号模式。

1.4.1 符号模式
c h m o d命令的一般格式为:

chmod [who] operator [permission] filename


w h o的含义是:

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 文件属主和组s e t - I D

t 粘性位*

l 给文件加锁,使其他用户无法访问

u,g,o 针对文件属主、同组用户及其他用户的操作

*在列文件或目录时,有时会遇到“t”位。“t”代表了粘性位。如果在一个目录上出现
“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个同组用户具有和属主
同等的权限。不过有的系统在这一规则上并不十分严格。
如果在文件列表时看到“t”,那么这就意味着该脚本或程序在执行时会被放在交换区(虚
存)。不过由于当今的内存价格如此之低,大可不必理会文件的“t”的使用。


第1章文件安全与权限5
下载
1.4.2 chmod命令举例
现在让我们来看一些使用c h m o d命令的例子。假定m y f i l e文件最初具有这样的权限:r w x
rwx rwx


命令结果含义
chmod a-x myfile
chmod og-w myfile
chmod g+w myfile
chmod u+x myfile
chmod go+x myfile
rw- rw- rwrw- r-- r-
rw- rw- r-
rwx rw- r-
rwx rwx r- x
收回所有用户的执行权限
收回同组用户和其他用户的写权限
赋予同组用户写权限
赋予文件属主执行权限
赋予同组用户和其他用户执行权限

当创建m y f i l e文件时,它具有这样的权限:

如果这是我写的一个脚本,我希望能够具有执行权限,并取消其他用户(所有其他用户)
的写权限,可以用:

$ chmod u+x o-w myfile


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

现在已经使文件属主对m y f i l e文件具有读、写执行的权限,而a d m i n组的用户对该文件具
有读权限。
如果希望某个脚本文件对你自己来说可执行,而且你对该文件的缺省权限很放心,那么
只要使它对你来说具有执行权限即可。

$ chmod u+x dt


1.4.3 绝对模式
c h m o d命令绝对模式的一般形式为:

chmod [mode] file


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

表1-3 八进制目录/文件权限表示


八进制数含义

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 其他用户可执行

在设定权限的时候,只需按照表1 - 3查出与文件属主、同组用户和其他用户所具有的权限
相对应的数字,并把它们加起来,就是相应的权限表示。

从表1 - 3中可以看出,文件属主、同组用户和其他用户分别所能够具有的最大权限值就是7。

论坛徽章:
0
7 [报告]
发表于 2006-05-25 11:28 |只看该作者
6 第一部分shell
下载
再来看看前面举的例子:


相应的权限表示应为6 4 4,它的意思就是:
0 4 0 0 + 0 2 0 0 (文件属主可读、写) = 0 6 0 0
0 0 4 0 (同组用户可读) = 0 0 4 0
0 0 0 4 (其他用户可读) = 0 0 0 4

0 6 4 4
有一个计算八进制权限表示的更好办法,如表1 - 4所示:

表1-4 计算权限值

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

使用表1 - 4,可以更容易地计算出相应的权限值,只要分别针对文件属主、同组用户和其

他用户把相应权限下面的数字加在一起就可以了。
m y f i l e文件具有这样的权限:
r w -r --r -
4 + 24 4
把相应权限位所对应的值加在一起,就是6 4 4。

1.4.4 chmod命令的其他例子
以下是一些c h m o d命令绝对模式的例子:

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


下面举一个例子,假定有一个名为y o a的文件,具有如下权限:
我现在希望使自己对该文件可读、写和执行,a d m i n组用户对该文件只读,可以键入:


如果希望自己对该文件可读、写和执行,对其他所有用户只读,我可以用:


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

chmod 644*


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


第1章文件安全与权限7
下载
还可以通过使用- R选项连同子目录下的文件一起设置:

chmod -R 664 /usr/local/home/dave/
*


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

1.4.5 可以选择使用符号模式或绝对模式
上面的例子中既有绝对模式的,也有符号模式的,我们可以从中看出,如果使用该命令
的符号模式,可以设置或取消个别权限位,而在绝对模式中则不然。我个人倾向于使用符号
模式,因为它比绝对模式方便快捷。

1.5 目录
还记得在前面介绍c h m o d命令时讲过,目录的权限位和文件有所不同。现在我们来看看其
中的区别。目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创
建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。执行权限
位则意味着搜索和访问该目录(见表1 - 5、表1 - 6)。

表1-5 目录权限

r w x
可以列出该目录中的文件可以在该目录中创建或删除文件可以搜索或进入该目录
表1-6 目录权限举例
权限文件属主同组用户其他用户
drwx rwx r- x ( 7 7 5 ) 读、写、执行读、写、执行读、执行
drwx r-x r- - ( 7 5 4 ) 读、写、执行读、执行读
drwx r-x r- x ( 7 5 5 ) 读、写、执行读、执行读、执行

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

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

而其中的文件p a y的权限为:

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

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

1.6 suid/guid
我们在前面曾经提到过s u i d和g u i d。这种权限位近年来成为一个棘手的问题。很多系统供



8 第一部分shell
下载
应商不允许实现这一位,或者即使它被置位,也完全忽略它的存在,因为它会带来安全性风
险。那么人们为何如此大惊小怪呢?

s u i d意味着如果某个用户对属于自己的s h e l l脚本设置了这种权限,那么其他用户在执行这
一脚本时也会具有其属主的相应权限。于是,如果根用户的某一个脚本设置了这样的权限,
那么其他普通用户在执行它的期间也同样具有根用户的权限。同样的原则也适用于g u i d,执
行相应脚本的用户将具有该文件所属用户组中用户的权限。

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

有相当一些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的。

现在我们明白了什么是s u i d,可是如何设置它呢?下面就来介绍这个问题。如果希望设置
s u i d,那么就将相应的权限位之前的那一位设置为4;如果希望设置g u i d,那么就将相应的权限
位之前的那一位设置为2;如果希望两者都置位,那么将相应的权限位之前的那一位设置为4+2。

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

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

$ chmod 4741 logit

论坛徽章:
0
8 [报告]
发表于 2006-05-25 11:29 |只看该作者
1.6.2 设置suid/guid的例子
下面给出几个例子:

表1-7 设置s u i d / g u i d

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


第1章文件安全与权限9
下载
还可以使用符号方式来设置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 命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,
就认为它一定是一个程序或脚本。

1.7 chown和chgrp
当你创建一个文件时,你就是该文件的属主。一旦你拥有某个文件,就可以改变它的所
有权,把它的所有权交给另外一个/ e t c / p a s s w d文件中存在的合法用户。可以使用用户名或用
户I D号来完成这一操作。在改变一个文件的所有权时,相应的s u i d也将被清除,这是出于安
全性的考虑。只有文件的属主和系统管理员可以改变文件的所有权。一旦将文件的所有权交
给另外一个用户,就无法再重新收回它的所有权。如果真的需要这样做,那么就只有求助于
系统管理员了。

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

chmod -R -h owner file


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


文件p r o j e c t的所有权现在由用户l o u i s e交给了用户p a u l i n e。

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


用户p a u l i n e现在把该文件所属的组由a d m i n变为s y b a d m i n(系统中的另外一个用户组)。

1.7.3 找出你所属于的用户组
如果你希望知道自己属于哪些用户组,可以用如下的命令:


10 第一部分shell
下载
或者可以使用i d命令:


1.7.4 找出其他用户所属于的组
为了找出其他用户所属于的组,可以用如下的命令:


上面的命令告诉我们用户m a t t y属于s y b a d m i n、a p p s g e n和p o s t用户组。

1.8 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文件中。

1.8.1 如何计算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值,可以为新创建的文件和目录设置缺
省权限。表1 - 8列出了与权限位相对应的u m a s k值。

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

例如,u m a s k值002 所对应的文件和目录创建缺省权限分别为6 6 4和7 7 5。

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


第1章文件安全与权限11
下载
表1-8 umask值与权限

u m a s k 文件目录
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,相应的文件和目录缺省创建权限是什么呢?
第一步,我们首先写下具有全部权限的模式,即7 7 7 (所有用户都具有读、写和执行权限)。
第二步,在下面一行按照u m a s k值写下相应的位,在本例中是0 0 2。
第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。

稍加练习就能够记住这种方法。

第四步,对于文件来说,在创建时不能具有文件权限,只要拿掉相应的执行权限比特即
可。

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

1) 文件的最大权限rwx rwx rwx (777)
2) umask值为0 0 2 - - - - - - -w3) 目录权限rwx rwx r-x (775) 这就是目录创建缺省权限
4) 文件权限rw- rw- r-- (664) 这就是文件创建缺省权限
下面是另外一个例子,假设这次u m a s k值为0 2 2:
1) 文件的最大权限rwx rwx rwx (777)
2 ) u m a s k 值为0 2 2 - - - -w- -w3) 目录权限rwx r-x r-x (755) 这就是目录创建缺省权限
4) 文件权限rw- r-- r-- (644) 这就是文件创建缺省权限

1.8.2 常用的umask值
表1 - 9列出了一些u m a s k值及它们所对应的目录和文件权限。

表1-9 常用的u m a s k值及对应的文件和目录权限

u m a s k值目录文件
0 2 2
0 2 7
0 0 2
0 0 6
0 0 7
7 5 5
7 5 0
7 7 5
7 7 1
7 7 0
6 4 4
6 4 0
6 6 4
6 6 0
6 6 0

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

论坛徽章:
0
9 [报告]
发表于 2006-05-25 11:30 |只看该作者
12 第一部分shell
下载
如果想要改变u m a s k值,只要使用u m a s k命令设置一个新的值即可:

$ umask 002


确认一下系统是否已经接受了新的u m a s k值:


在使用u m a s k命令之前一定要弄清楚到底希望具有什么样的文件/目录创建缺省权限。否
则可能会得到一些非常奇怪的结果;例如,如果将u m a s k值设置为6 0 0,那么所创建的文件/目
录的缺省权限就是0 6 6!

1.9 符号链接
存在两种不同类型的链接,软链接和硬链接,这里我们只讨论软链接。软链接实际上就
是一个指向文件的指针。你将会发现这种软链接使用起来非常方便。

1.9.1 使用软链接来保存文件的多个映像
下面我们就解释一下符号链接是怎么回事。比方说在/ u s r / l o c a l / a d m i n / s a l e s目录下有一个
含有销售信息的文件,销售部门的每一个人都想看这份文件。你可以在每一位用户的$ H O M E
目录下建立一个指向该文件的链接,而不是在每个目录下拷贝一份。这样当需要更改这一文
件时,只需改变一个源文件即可。每个销售$ H O M E目录中的链接可以起任何名字,不必和源
文件一致。

如果有很多子目录,而进入这些目录很费时间,在这种情况下链接也非常有用。可以针
对$ H O M E目录下的一个很深的子目录创建一个链接。还有,比如在安装一个应用程序时,它
的日志被保存到/ u s r / o p t / a p p / l o g目录下,如果想把它保存在另外一个你认为更方便目录下,可
以建立一个指向该目录的链接。

该命令的一般形式为:

ln [-s] source_path target_path


其中的路径可以是目录也可以是文件。让我们来看几个例子。

1.9.2 符号链接举例
假如系统中有4 0个销售和管理用户,销售用户使用一个销售应用程序,而管理用户使用
一个管理应用程序。我作为系统管理员该怎么做呢?首先删除它们各自$ H O M E目录下的所
有. p r o f i l e文件。然后在/ u s r / l o c a l / m e n u s /目录下创建两个p r o f i l e文件,一个是s a l e s . p r o f i l e,一
个是a d m i n . p r o f i l e,它们分别为销售和管理人员提供了所需的环境,并引导他们进入相应的应
用程序。现在我在所有销售人员的$ H O M E目录下分别创建一个指向s a l e s . p r o f i l e的链接,在所
有管理人员的$ H O M E目录下分别创建一个指向a d m i n . p r o f i l e文件的链接。注意,不必在上面
命令格式中的t a rg e t _ p a t h端创建相应文件,如果不存在这样一个文件,l n命令会自动创建该文


第1章文件安全与权限13
下载
件。下面就是我对销售人员m a t t y所做的操作。


(你所看到的可能会与此稍有差别)。
这就是我所要做的全部工作;对于管理人员也是如此。而且如果需要作任何修改的话,
只要改变销售和管理人员的p r o f i l e文件即可,而不必对4 0个用户逐一进行修改。

下面是另外一个例子。我所管理的系统中有一个网络监视器,它将日志写在/ u s r / o p t /
m o n i t o r / r e g s t a r目录下,但其他所有的日志都保存在/ v a r / a d m / l o g s目录下,这样只需在该目录
下建立一个指向原有文件的链接就可以在一个地方看所有的日志了,而不必花费很多时间分
别进入各个相应的目录。下面就是所用的链接命令:

$ ln -s /usr/opt/monitor/regstar/reg.log /var/adm/logs/monitor.log


如果链接太多的话,可以删掉一些,不过切记不要删除源文件。

不管是否在同一个文件系统中,都可以创建链接。在创建链接的时候,不要忘记在原有
目录设置执行权限。链接一旦创建,链接目录将具有权限7 7 7或rwx rwx rwx,但是实际的原
有文件的权限并未改变。

在新安装的系统上,通常要进行这样的操作,在/ v a r目录中创建一个指向/ t m p目录的链接,
因为有些应用程序认为存在/ v a r / t m p目录(然而它实际上并不存在),有些应用程序在该目录中
保存一些临时文件。为了使所有的临时文件都放在一个地方,可以使用l n命令在/ v a r目录下建
立一个指向/ t m p目录的链接。


现在如果我在/ v a r目录中列文件,就能够看到刚才建立的链接:


1.10 小结
本章介绍了一些有关文件安全的基本概念。如果这些命令能够使用得当而且使用得比较
谨慎,应该不会有什么问题。手指轻轻一敲就有可能输入chmod -R这样的命令,它将改变整
个文件系统的权限,如果没有做备份的话,没有几年的时间恐怕是无法恢复了,所以在输入
这些命令时,千万不要在手指上贴膏药!

是否使用设置了s u i d的脚本完全取决于你自己。如果使用的话,一定要确保能够监控它的
使用,而且不要以根用户身份设置s u i d。

论坛徽章:
0
10 [报告]
发表于 2006-05-25 11:30 |只看该作者
置顶的文革MM的基础12篇,不知道是不是学习这本书的学习心得,相同的地方很多,都很不错。
可以看的书很多,不过关键是看书的人
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP