UNIX与LINUX SHELL编程/Shell脚本学习笔记一
时间:2009-04-14 来源:hg1995
PART 1
第1章 文件安全与权限
本章包含以下内容:
• 文件和目录的权限。
• setuid。
• chown和chgrp。
• umask。
• 符号链接。
1.1 文件
1.2 文件类型
d 目录。
l 符号链接 (指向另一个文件 )。
s 套接字文件。
b 块设备文件。
c 字符设备文件。
p 命名管道文件。
- 普通文件,或者更准确地说,不属于以上几种类型的文件。
1.3 权限
r 读权限
w 写/更改权限
x 执行该脚本或程序的权限
对于文件属主来说,在只有读权限位被置位的情况下,仍然可以通过文件重定向的方法向该文件写入。
1.4 改变权限位
chmod 命令的一般格式为:
chmod [who] operator [permission] filename
who的含义是:
u 文件属主权限。
g 同组用户权限。
o 其他用户权限。
a 所有用户 (文件属主、同组用户及其他用户 )。
operator的含义:
+ 增加权限。
- 取消权限。
= 设定权限。
permission的含义:
r 读权限。
w 写权限。
x 执行权限。
s 文件属主和组 set-ID。
t 粘性位 *。
l 给文件加锁,使其他用户无法访问。
chmod命令举例:
命令 结果 含义
chmod a-x myfile rw- rw- rw- 收回所有用户的执行权限
chmod 666 myfile rw- rw- rw- 赋予所有用户读和写的权限
还可以通过使用 -R选项连同子目录下的文件一起设置:
chmod -R 664 /usr/local/home/dave/*
1.5 目录
目录权限:目录的权限将会覆盖该目录中文件的权限。
r 可以列出该目录中的文件
w 可以在该目录中创建或删除文件
x 可以搜索或进入该目录
1.6 suid/guid
suid意味着如果某个用户对属于自己的 shell脚本设置了这种权限,那么其他用户在执行这一脚本时也会具有其属主的相应权限。same as guid
有相当一些 UNIX命令也设置了 suid和guid。如果想找出这些命令,可以进入 /bin或/sbin 目录,执行下面的命令:
$ ls -l | grep '^...s' 上面的命令是用来查找 suid文件的;
$ ls -l | grep '^...s..s' 上面的命令是用来查找 suid和guid 的。
如果希望设置suid,那么就将相应的权限位之前的那一位设置为 4;如果希望设置 guid,那么就将相应的权限位之前的那一位设置为2;如果希望两者都置位,那么将相应的权限位之前的那一位设置为4+2. 一旦设置了这一位,一个 s 将出现在 x的位置上。记住:在设置 s u i d或g u i d的同时,相应的执行权限位必须要被设置。例如,如果希望设置 guid,那么必须要让该用户组具有执行权限。ex:chmod 4755 chmod 6711 chmod u+s <filename>
1.7 chown和chgrp
chown命令的一般形式为:
chmod -R -h owner file
- R 选项意味着对所有子目录下的文件也都进行同样的操作。 - h 选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。
1.8 umask
u m a s k 命令确定了你创建文件的缺省模式。 u m a s k命令是在 / e t c / p r o f i l e 文件中设置的.如果希望永久性地设置自己的 umask 值,那么就把它放在自己 $HOME目录下的 .profile或.bash_profile 文件中.
umask nnn 其中 nnn为umask置000-777。对于文件来说,这一数字的最大值分别是 666,目录最大值分别 777.
umask 指定的是『该默认值需要减掉的权限!』.examplr:::umask 为 022,所以 user 并没有被拿掉属性,不过 group 与 others 的属性被拿掉了 2 ( 也就是 w 这个属性 ).
• 建立档案时:(-rw-rw-rw-) – (-----w--w-) ==> -rw-r--r-- ==> 644
• 建立目录时:(drwxrwxrwx) – (d----w--w-) ==> drwxr-xr-x ==> 755
1.9 符号链接
软链接实际上就是一个指向文件的指针。
该命令的一般形式为:
ln [-s] source_path target_path
第2章 使用find和xargs
Find命令的一般形式为:
find pathname -options [-print -exec -ok]
让我们来看看该命令的参数:
pathname find 命令所查找的目录路径。例如用 .来表示当前目录,用 /来表示系统根目录。
-print find 命令将匹配的文件输出到标准输出。
-exec find 命令对匹配的文件执行该参数所给出的 s h e l l命令。相应命令的形式为 'command' {} \; ,注意 {}和\;之间的空格。
-ok 和-exec 的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
ex::find logs -type f -mtime +5 -exec rm {} \;
find命令选项:
find命令有很多选项或表达式,每一个选项前面跟随一个横杠 - 。让我们先来看一下该命令的主要选项,然后再给出一些例子。
-name 按照文件名查找文件。可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。$ find . -name "[A-Z]*" -print
-perm 按照文件权限来查找文件。在使用这一选项的时候,最好使用八进制的权限表示法。$ find . -perm 755
-prune 使用这一选项可以使 find命令不在当前指定的目录中查找,如果同时使用了 -depth选项,那么 -prune选项将被 find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在 n天以内, +n表示文件更改时间距现在 n 天以前。 Find命令还有 -atime 和-ctime选项,但它们都和 -mtime选项相似,所以我们在这里只介绍 -mtime选项。
-nogroup 查找无有效所属组的文件,即该文件所属的组在 /etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在 /etc/passwd中不存在。为了查找属主帐户已经被删除的文件,可以使用 - nouser 选项。
-newer file1 ! file2 查找更改时间比文件 file1新但比文件 file2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n[c] 查找文件长度为 n块的文件,带有 c时表示文件长度以字节计。查找文件长度大于 1M字节的文件::find . -size +1000000c
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统 mount点。在当前的文件系统中查找文件(不进入其他文件系统)
-follow 如果 find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用 cpio命令,将这些文件备份到磁带设备中。
xargs::
在使用 f i n d 命令的 - e x e c 选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递给 e x e c执行。不幸的是,有些系统对能够传递给 e x e c的命令长度有限制,这样在 f i n d 命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出” 。这就是x a rg s 命令的用处所在,特别是与 f i n d命令一起使用。
下面的例子在整个系统中查找内存信息转储文件( coredump ) ,然后把结果保存到/tmp/core.log 文件中:
$ find . -name "core" -print | xargs echo "" >/tmp/core.log
下面的例子在 /apps/audit目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:
$ find /apps/audit -perm -007 -print | xargs chmod o-w
在下面的例子中,我们用 grep命令在所有的普通文件中搜索 device这个词:
$ find / -type f -print | xargs grep "device"
第3章 后台执行命令
为了使这些进程能够在后台运行,也就是说不在终端屏幕上运行,有几种选择方法可供使用:
• 设置 crontab文件,并用它来提交作业。
• 使用 at命令来提交作业。
• 在后台提交作业。
• 使用 nohup命令提交作业。Nohup 使用它在后台运行一个命令,即使在用户退出时也不受影响。
crontab
[root@hewei ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
--------------------------------------------------------------
下面是 crontab的格式:其中 <>表示空格。在这些域中,可以用横杠 - 来表示一个时间范围.可以用星号 * 来表示连续的时间段。
分<>时<>日<>月<>星期 <>要运行的命令
crontab命令选项:
Crontab [-u user] -e -l -r
其中:
-u 用户名。
-e 编辑 crontab文件。
-l 列出 crontab文件中的内容。
-r 删除 crontab文件。
如果使用自己的名字登录,就不用使用 - u选项
at命令
at命令的基本形式为:
at [-f script] [-m -l -r] [time] [date]
其中,
-f script 是所要提交的脚本或命令。
-l 列出当前所有等待运行的作业。 atq命令具有相同的作用。
-r 清除作业。为了清除某个作业,还要提供相应的作业标识( I D);有些 U N I X 变体只接受 atrm 作为清除命令。
-m 作业完成后给用户发邮件。
time at命令的时间格式非常灵活;可以是 H 、H H . H H M M、 H H : M M或H : M ,其中 H和M分别是小时和分钟。还可以使用 a.m.或p.m.。
date 日期格式可以是月份数或日期数,而且 at命令还能够识别诸如 today、tomorrow这样的词。
ex:向at命令提交一个 shell脚本
at 3:00am tomorrow -f /etc/bin/aaa.sh
清除作业的命令格式为:
atrm [job no] 或 at -r [job no]
&命令
该命令的一般形式为:
命令 &
如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
command >out.file 2>&1 &
nohup命令
如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户之后继续运行相应的进程。 Nohup就是不挂起的意思 (nohang up)。
该命令的一般形式为:
nohup command &
第4章 文件名置换
下面就是这些特殊字符:
* 匹配文件名中的任何字符串,包括空字符串。
? 匹配文件名中的任何单个字符。
[...] 匹配 [ ] 中所包含的任何字符。还可以使用一个横杠 -来连接两个字母或数字,以此来表示一个范围。
[!...] 匹配 [ ] 中非感叹号!之后的字符。
为了列出所有以大写字母开头的文件名,可以用:$ ls [A-Z]*
为了列出所有以小写字母开头的文件名,可以用:$ ls [a-z]*
为了列出所有以数字开头的文件名,可以用:$ ls [0-9]*
为了列出所有以 . 开头的文件名(隐含文件,例如 .profile、.rhosts、.history等等),可以用:$ ls .*
第5章 shell输入与输出
echo::使用 echo命令可以显示文本行或变量,或者把字符串输入到文件。
echo string
echo命令有很多功能,其中最常用的是下面几个:
\c 不换行。
\f 进纸。
\t 跳格。
\n 换行。
read
可以使用 read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量
它的一般形式为:
read varible1 varible2 ...
cat::: 可以用来显示文件内容,创建文件,还可以用它来显示控制字符
cat命令的一般形式为:
cat [options] filename1 ... filename2 ...
cat命令最有用的选项就是:
-v 显示控制字符
如果希望创建一个名为 bigfile的文件,该文件包含上述三个文件的内容,可以把上面命令的输出重定向到新文件中:
$ cat myfile1 myfile2 myfile3 > bigfile
管道:: 可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠 | 表示。它的一般形式为:
命令 1 | 命令 2
sed、awk和grep 都很适合用管道,特别是在简单的一行命令中。
tee::它把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。如果希望在看到输出的同时,也将其存入一个文件,那么这个命令再合适不过了。
它的一般形式为:
tee -a files
其中, -a表示追加到文件末尾。
exec
exec命令可以用来替代当前 shell ;换句话说,并没有启动子 shell。使用这一命令时任何现有环境都将会被清除,并重新启动一个 shell 。它的一般形式为:
exec command
使用文件描述符
可以使用 e x e c 命令通过文件描述符打开和关闭文件。
第6章 control命令执行顺序
• 命令执行控制。
• 命令组合。
1.使用&&
使用 &&的一般形式为:
命令1 & & 命令2
& & 左边的命令(命令 1)返回真 (即返回 0,成功被执行)后, & &右边的命令(命令 2)才能够被执行;换句话说,“如果这个命令执行成功 & & 那么执行这个命令” 。
2. 使用||
使用 ||的一般形式为:
命令1 | | 命令2
如果 | | 左边的命令(命令 1 )未执行成功,那么就执行 | |右边的命令(命令 2);或者换句话说, “如果这个命令执行失败了 || 那么就执行这个命令” 。
用()和{ }将命令结合在一起
如果希望把几个命令合在一起执行, s h e l l 提供了两种方法。既可以在当前 s h e l l 也可以在子shell中执行一组命令。
为了在当前 shell 中执行一组命令,可以用命令分隔符隔开每一个命令,并把所有的命令用圆括号()括起来。
它的一般形式为:
(命令 1 ;命令2 ;...)
如果使用 { }来代替(),那么相应的命令将在子 s h e l l而不是当前 s h e l l中作为一个整体被执行,只有在 { } 中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子 s h e l l 中执行,否则在当前 shell 执行。它的一般形式为:
{命令 1;命令 2; ...}