首页 > 代码库 > Linux Unix shell 编程指南学习笔记(第一部分)

Linux Unix shell 编程指南学习笔记(第一部分)

第一章:文件安全与权限

1、文件和目录的权限

创建文件时系统保存了文件所有相关的信息,包括 文件的位置 、 文件类型 、 文件长度 、 哪位用户拥有该文件,哪些用户可以访问该文件 、 i 节点 、 文件的修改时间 、 文件的权限位 。

文件类型:

d: 目录

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

s: 套接字文件

b: 块设备文件

c: 字符设备文件

p: 命名管道文件

-: 不属于上述类型的文件


文件权限

XXX       XXX        XXX

最左边 XXX : 文件属主 权限位

中间   XXX : 文件属主所在组的用户的权限位

最右边 XXX : 其他用户权限位


修改权限

chmod   [u|g|o|a](who)   [+|-|=](operator)   [r|w|x|s|t|i] (permission)  filename(target file)

permission: 

1、 s   文件属主和组  set-ID

2、 t   粘性位 *

3、 i   给文件加锁,使其他用户无法访问。(查看文件是否设置了  i  位 。 lsattr filename    ;  给文件设置 i 位  :  chattr  +i  filename  。)

* 在 列文件 或 目录 会遇到 t 位 , 

如果在目录上出现 t 位 , 这意味着该目录中的文件只有其属主才可以删除。

如果在文件列表中看到 t 位 , 意味着该脚本或程序在执行时会被放到交换区(虚拟存储空间)

chmod 的绝对模式 : chmod   [mode]  filename

mode 是一个八进制数 。

-R  : 连同子目录下的文件权限一起设置。


读权限用于目录表示可以列出其中的内容。

写权限用于目录表示可以在该目录中创建或删除文件。

执行权限用于目录表示可以搜索和访问该目录。


2、setuid

SUID: 如果某个用户对属于自己的shell 脚本 设置了这种权限 , 那么其他用户在执行它的期间也同样具有属主相应的权限。  在某目录下查找所有的suid 文件 : ls -l | grep `^...s`

GUID: 跟SUID 类似 —— 属组 。 在某目录下查找所有的guid文件: ls -l | grep `^...s..s`

设置 SUID 和 GUID 时 其相应的执行权限位必须设置 。


3、chown 和chgrp

chown : 改变文件所有权,当文件所有权改变时,相应的suid也被清除,并且不能再收回该文件的所有权(除非找系统管理员);   chown  -R  -h   owner  file  (-R 对子目录执行相应的操作 , -h 如果文件是符号链接,那么不影响其指向到的文件)

chgrp : chgrp 和chown 格式差不多。


找出所有用户组(ubuntu12.04,有的说用group 就ok):  groups    or id 

找出某用户所在的组:  groups  user

插播======> 切换到root 用户忘记密码怎么办: sudo  passwd root   然后按照提示输入新的密码。


4、umask

umask 用于设置已经登陆用户 创建文件 的缺省模式。

如果希望改变所有用户的 umask 值可以在   /etc/profile 文件中设置

如果希望只修改自己的shell 的umask 默认值 可以在 $HOME/.profile  或$HOME/.bash_profile

umask 的计算:

umask 和 chmod 正好相反 表示减去某一权限值,值得注意的是  创建文件时默认不允许指定执行权限,必须后面用 chmod 来添加执行权限。

所以对于目录: umask  n  所指定的权限为 : chmod 7-n

对于文件:  umask n 所指定的权限为:chmod 7-n(n 为奇数)  ; chmod 7-n-1 (n为偶数)

5、符号链接

软连接:指向文件 或 目录 的一个指针(相当于windows 的快捷方式)。

硬链接:只能对文件生效。


第二章  使用 find  和 xargs

1、find  命令选项

find 一般格式:

find pathname -options 【-print -exec -ok】 (自动递归查找)

pathname:  find 命令查找的目录路径

-print: find 命令将匹配的文件输出到标准输出

-exec: find 命令对皮诶的文件执行该 参数所给出的shell 命令。

-ok   : 和 -exec作用相同,区别在于执行每个命令之前会提示用户,让用户选择是否执行该命令。


options值:
-name: 按照文件名查找     -name “文件正则表达式”

-perm: 按照文件权限查找   -perm  数字权限 ; 如果查找所有可读,可写,可执行的文件 在数字前面添加 - 

-prune:不在当前指定的目录中查找,如果指定了  -depth 该选项被忽略。

-user:  按照文件属主来查找  -user + 用户

-group: 按照文件属组来查找。 -group + 组名

-mtime: 按照文件的更改时间来查找 。-n 更改时间在 n 天以内。 +n 更改时间在 n 天以前。 -mtime +|- n

-atime: 按照文件最近访问时间查找

-ctime: 按照文件创建时间查找

-nogroup: 查找没有有效group的文件,(文件所属组不在 /etc/groups 中)

-nouser: 无效属主文件(文件属主不在/etc/passwd中)

-newer file1  !file2: 查找比 file1 新 但是 比file2 旧的文件   -newer 较新的文件  !较旧的文件

-type: 查找某一类型的文件

b : 快设备

d : 目录

c : 字符设备文件

p : 管道文件

l :  符号链接文件

f : 普通文件。

-size n【 c】: 长度为n快 的文件, 带 c 时 表示以字节计算。    size +n (大于n 块的文件)

-depth : 先在当前目录中中查找,然后再到其子目录中查找。

-fstyle : 查找位于某一文件系统中的文件。

-mount : 查找文件时不跨越文件系统 mount 点。

-follow : 如果 find 遇到符号链接,就跟踪到链接所指向的文件。

-cpio : 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。



find XXX    -exec XXX {} \;  : 所有内容一次性提交,每个任务会创建一个进程,造成系统性能下降;参数内容过长时,某些系统会报错。 执行 shell 命令时 不提示。

find XXX    -ok    XXX {} \;  : 跟 -exec 类似, 但是执行shell 命令时要提示。

find XXX    | xargc XXX  : 提交长度可以调节, 所有任务只创建一个进城,方便灵活,提交系统系能。


第三章 后台执行命令

设置 crontab 文件,并用它来提交作业

使用 at 命令来提交作业

在后台提交作业

使用 nohup 命令提交作业

cron : 系统调度进程。

at :    at 命令。

&    : 使用它在后台运行一个占用时间不长的命令。

nohup: 使用它在后台运行一个命令,即使用户退出也不受影响。


cron 和 crontab

cron 是系统主要的调度进程,可以在无需人工干预的情况下提交作业。

crontab 命令允许用户提交,编辑或删除相应的作业。通常来说,每个用户都可以拥有自己的crontab文件。系统管理员通过cron.deny 和cron.allow这两个文件来禁止和允许用户拥有自己的crontab文件。


crontab 格式 :(必须包含 5 个时间域)

分(0~59)  时(0~23)  日(1~31)  月(1~12)  星期(0~6)   要运行的命令(任意shell命令)

用 - 表示时间范围: 如 在第一列  1-10 表示 1 到 10分钟。

用 ,表示特定的时间: 如在星期列  1,4 表示在星期一,星期四运行。

用 * 表示任意时间断:如 在星期列 使用 * , 表示周一到周日都运行命令。


crontab 命令选项(最好先备份一份该文件,以免误删):

-u:用户名 (如果使用自己的名字登录,就不用使用该选项)

-e:编辑crontab文件

-i:列出crontab文件内容

-r:删除crontab文件。


At 命令:

at 命令允许用户想cron守护进程提交作业,使其在稍后的时间运行。

一旦一个作业被提交,at命令将会保留所有当前环境变量。

该作业所有的输出都将以电子邮件形式发送给用户。

root 用户可以通过 /etc 目录下的at.allow 和at.deny 允许和禁止哪些用户使用at命令。

at 格式:

at   [-f script]   [-m -l -r]   [time]   [date]

-f script :所要提交的脚本或命令

-l : 列出当前所有等待运行的作业

-r : 清除作业,后面接 作业 id 。

-m : 作业完成后给用户发邮件。

time: 时间

date: 日期,日期格式合一是月份数或日期数。

at接收的日期/时间格式(不仅限于此):

at 6.45am May 12

at 11.10pm

at now + 1hour

at 9am tomorrow

at 15:00 May 24d

at now + 10 minutes

使用echo向at 提交命令:

echo find . -name "passwd" | at now + 10 minutes


& 命令(不适用于与用户有交互的作业)

当在前台运行某个作业时,终端被改作业占据,而在后台运行时不会被占据。 & 命令将前台作业放到后台执行。

& 命令格式:

命令   &


杀死后台进程(当任务被放到后台执行shell 会给出一个进程号,用户根据该进程号可以用kill命令杀死进程):

kill -signal 【process number】


nohup命令(需要在退出账号之后继续执行作业的进程):

如果正在运行一个进程,而且在退出账户的时候该进程不会结束,需要继续执行,则可以使用该命令(no hang up),格式:

nohup cmmand &


nohup 提交作业默认所有输出都定向到nohup.out文件中,除非指定了输出文件。

nohup cmmand  > myout.file 2>&1 

提交多个作业:

提交多个作业最好放到shell脚本中。



第四章  文件名置换

匹配文件名中的任何字符串         *    :任何字符串

匹配文件名中的单个字符           ?   :单个字符

匹配文件名中的字母或数字字符    [...] : []中包含的字符  ; [!...]: []中之外的字符

这章主要讲解一些简单的正则表达式,详细内容看正则表达式即可。


第五章 shell 输入与输出

使用标准输入、标准输出、标准错误。

重定向标准输入和标准输出。


echo:

格式:

echo sting 

选项:

\c : 不换行

\f : 进纸

\t : 跳格

\n : 换行

echo “\007” : 使系统响铃一声。

==============================================================

|  linux 系统必须使用 -n 选项进纸echo命令输出后换行。echo -n "XXX"      |

|             必须使用 -e 才能使转义字符生效 : echo -e “\007”              |

==============================================================

echo  “XXX”  > filename (覆盖原有内容)

echo  "XXX"  >> filename (在原有内容后面添加)


Read:

read 可以从键盘或者文件的某一行中读入文本信息,并将其赋给变量。如果只指定了一个变量,那么read 会把所有的值都赋给该变量(否则会一一对应),直到读入文件结束符或换行符。

格式:

read  var1 var2 ........


CAT:

cat命令可以用来显示文件内容(一次性全部显示出来),创建文件,还可以用来显示控制字符。

格式:

cat [option] file1 file2 file3....

选项:

-v : 显示控制字符

显示文件内容:

cat filename 

显示包含控制字符的文件

cat -v filename

将多个文件的内容放到一个文件中

cat file1 file2 file3  > newFile

用 cat 创建新文件并写入一些内容:

cat  > filename
XXXXX
XXX<CTRL-D>

cat 回显输入的内容

cat
XXX
XXX
CTRL-D

管道:

管道可以将一个命令的输出作为另一个命令的输入.

格式:

命令1   |  命令2   |  命令3 ....

搜索当前目录并查询文件 filename

ls | grep filename


who 命令的输出用管道传递给awk命令处理(只显示用户名和所在的终端):

who  | awk ‘{print $1 "\t" $2}‘


列出所有文件系统,给awk只显示第一列 并用grep 去掉题头filesystem

df -k | awk '{print $1 }' | grep -v "Filesystem"

在上面命令的基础上只显示分区名

df -k | awk '{print $1}' | grep -v "Filesystem" | sed s'/\/dev\///g'

对文件进行排序,然后输送到打印机

sort filename  | lp


TEE:

tee 将输出的一部分输出到标准输出,另一个副本拷贝到相应的文件中。

格式:

tee  -a files

选项:

-a : 追加到文件末尾。

对文件排序然后将一份拷贝输出到标准输出,另一份追加到newlog.log中

sort filename | t -a newlog.log


标准输入、输出、和错误

当在shell中执行命令的时候,每个进程都和三个打开的文件相联系并使用文件描述符来引用这些文件。

标准输入文件 ————————>    0

标准输出文件 ————————>    1

标准错误文件 ————————>    2


系统可用的文件描述符有12个,除了标准输入、输出、错误,其它 9  个可以随便安排使用。

exec : 使用该命令时,shell所有的环境变量都会被清除,并重新启动一个shell。

exec 4<&0 0<good.txt
read line1
read line2
exec 0<&4
echo $line1
echo $line2
上述脚本使用了文件描述符4,首先将4设定为标准输入,然后打开good.txt文件,从中读取两行,接着关闭文件描述符4,并显示读取到的两行文件内容。


第六章   命令执行顺序

命令执行控制

命令组合


使用 &&

格式:命令1  && 命令2  ; 命令1执行成功后才执行命令2 。 

一个执行失败的例子,在当前目录下没有temp.txt 文件,

~/myTech/shell$ cp temp.txt chmoe_R/ && echo "cp command execute success if you see this ."
cp: cannot stat `temp.txt': No such file or directory

创建文件后再执行上面的命令:

shell$ touch temp.txt
@ubuntu:~/myTech/shell$ cp temp.txt chmoe_R/ && echo "cp command execute success if you see this ."
cp command execute success if you see this .

使用 ||

格式: 命令1  || 命令2   ; 命令1执行失败了才执行命令2 。 使用方法和 && 一样。


使用() 和 {} 将命令组合在一起

在当前shell 中结合命令: (命令1;命令2;命令3...)

在子shell   中结合命令:  {命令1,;命令2,命令3...}


 以上内容多数来自 Linux与Unix shell 编程指南 ,更加详细的内容请阅读正版图书。


LINUX 常用内置变量:

HOME      :   用户根目录

LOGNAME  :  登陆名


who

/dev/null  系统垃圾箱

2 > &1 : 合并标准输出和标准错误输出




Linux Unix shell 编程指南学习笔记(第一部分)