《Shell编程-.pdf》由会员分享,可在线阅读,更多相关《Shell编程-.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 Shell 编程第一章 shell 简介什么是 shell 存取权限和安全Shell 简单脚本Shell 特征1.1 什么是 shell shell 是核心程序(kernel)之外的指令解析器语言,相当于 dos 中的 shell 的类型:ash、bash、ksh、csh、tcsh-/etc/shells-/echo$SHELL 察看当前运行的shell#Cat/etc/shells 查看有哪几种shell 默认的 shell 是 bash#/bin/csh 转换当前运行的shell,转换为csh,即当前运行在csh 下#exit 退出子 shell,退出整个系统也用这个命令程序在 she
2、ll 中运行shell 中可运行子shell 1.2 存取权限与安全文件和目录的权限Setuid(suid/guid)(chmod u+s,g+s file)Chown 和 chgrp(chown user file/chgrp group file)Umaske(umaske nnn)符号链接(ln-s source_path target_path)例子:rootlocalhost#ls-lh 总用量368K-rw-r-r-1 root itlable 12K 8月 15 23:18 conkyrc.sample root 表示用户拥有者itlable 用户所在的组1 和 2 代表硬连接数
3、量d:表示是一个目录,事实上在ext2fs 中,目录是一个特殊的文件。:表示这是一个普通的文件。l:表示这是一个符号链接文件,实际上它指向另一个文件。2 b、c:分别表示区块设备和其他的外围设备,是特殊类型的文件。s、p:这些文件关系到系统的数据结构和管道,通常很少见到。三、特殊权限其实文件与目录设置不止这些,还有所谓的特殊权限。由于特殊权限会拥有一些“特权”,因而用户若无特殊需求,不应该启用这些权限,避免安全方面出现严重漏洞,造成黑客入侵,甚至摧毁系统!s或 S(SUID,Set UID):可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID
4、 权限的文件,黑客经常利用这种权限,以 SUID 配上 root 帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。s或 S(SGID,Set GID):设置在文件上面,其效果与SUID 相同,只不过将文件所有者换成用户组,该文件就可以任意存取整个用户组所能使用的系统资源。T 或 T(Sticky):/tmp 和/var/tmp 目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。因为 SUID、SGID、Sticky 占用 x 的位置来表示,所以在表示上会有大小写之分。加入同时开启执行权限和SUID、SGID、Sticky,则权限表示字符是小写的
5、:-rwsr-sr-t 1 root root 4096 6 月 23 08:17 conf 如果关闭执行权限,则表示字符会变成大写:-rwSr-Sr-T 1 root root 4096 6 月 23 08:17 conf#man chmod#info chmod 查看 chmod 命令帮助1.2.1 权限符号模式Chmod who operator permission filename Who(u,g,o.a)符号模式Operator(+,-,=)符号模式Permission(r,x,w,s,t)符号模式-rr-1 itlab itlab 14 Jun 19 15:15 myfile 例
6、子:修改权限chmod u=rxw,g+w,o+r myfile 注:如果组的权限为s,执行时以拥有者的权限执行,例如:-rwsrwx-x root itlab myfile,执行 myfile 这个文件的时候,是以root 用户的身份执行,对安全性有很大影响查找权限为s 的信息:一般放在bin 下,查找命令为:Ls-l/bin|grep s1.2.2 绝对模式Chmod mode filename Mode-r4-w2 3-x1 Chmod 644 filename Chmod 740 filename Chmod 4744 filename rwsrrChmod 6744 filename
7、 rwsr-srChmod 7744 filename rwsr-sr-T 1.2.3 chown 和 chgrp 改变拥有者和组的权限:Chown-R owner myfile,R 表示如果myfile 是个目录,改变权限时那么这个目录下的其他文件都发生改变Chown owner.group myfile Chown.group myfile Chgrp-R group myfile 例子:chown itlab.itlab myfile R 表示同时改变拥有者和组的权限1.2.4 umask 改变创建时默认的权限/etc/profile($HOME/.profile$HOME/.bash_
8、profile)umask 创建文件:touch filename 创建目录:mkdir directory 默认权限对应表:7-umask=目录,7-1-umask=文件Umask Umask 文件目录0 6 7 1 5 6 2 4 5 3 3 4 4 2 3 5 1 2 6 0 1 7 0 0 改变默认权限,例如:#umask 000#umask 执行 umask 00显示为 000 设置 umask 在文件/etc/profile 中,#cat/etc/profile|#cat/etc/profile|grep umask4 1.2.5 符号链接硬连接软连接ln-s source_pat
9、h target_path 硬连接:把一个文件指向另一个文件,ln ereco.tar.gz etecrogz 两个文件的大小相同软连接:把文件指向另一个文件存储的地方,ln s ereco.tar.gz etecogzlns-rr-1 itlab itlab 14 Jun 19 15:13 erecogzlns-eteco.tar.gz 软连接-rr-1 itlab itlab 14 Jun 19 15:1825064 eteco.tar.gz-rr-1 itlab itlab 14 Jun 19 15:1825064 etecrogz 硬连接硬连接占用空间的大小是1825064,而不是18
10、25064+1825064,他的大小和原文件相同,而软连接不同1.3 shell 脚本使用 shell 脚本的原因Shell 脚本基本元素Shell 脚本运行方式1.3.1 使用 shell脚本的原因功能强大节约时间,类似dos 下的批处理1.3.2 Shell 脚本基本元素#!/bin/bash 第一行#表示注释变量流程控制结构例子:加变量的脚本#!/bin/bash#这是一个打印hello word 的 shell 脚本printchar=hello word echo$printchar;必须有可执行权限不加变量的脚本#!/bin/bash#这是一个打印hello word 的 shel
11、l 脚本echo hello word ;5 1.3.2.1 别名alias alias ll=ls alhalias 放置位置为:cat$HOME/.bashrc 1.3.2.2 命令替换myfile 的内容:parm findfile#cat myfile parm findfile#ls cat myfile al 必须是反引号,执行这个命令后打印出myfile 的 内容1.3.3 后台处理什么是后台,前台看不到的为后台一个终端同时可以运行多个程序nohup command&例子:#nohub tar czf enerco.tar.gz enerco&压缩一个文件,在后台运行#jobs
12、l 查看程序是否在运行1.3.4 变量变量用来存储信息例子:helloworld.sh#!/bin/bash#这是一个打印hello word 的 shell 脚本printchar=hello word echo$printchar 1.3.75管道(|)把一个命令的输出连接到另一个命令的输入ls|sort 按照字母排序1.3.6 重定向()与管道相关,可以改变程序运行的输入来源和输出的地点6 sort myfile.txt sort myfile _dort.txt 1.3.7 模式匹配显示以 txt 为扩展名的文件或显示以a 开头的文件,这种能力就称模式匹配正则表达式例子:ls*.txt
13、 l 1.3.8 特殊字符双引号(“):用来使 shell 无法认出空格、制表符和其他大多数特殊字符,这样”Daivid medinent“表示一个值,而不是两个同样“Daivid medinent 表示一个值单引号():用来使shell 无法认出所有特殊字符反引号():用来替换命令反斜线():使shell 无法认出气候的特殊字符,使其后的支付失去了特殊的含义如Daivid medinent#touch Daivid medinent Ls Daivid medinent Daivid medinent 分号(;)允许在一行上放多个命令&:命令后台执行括号():创建成组的命令大括号:创建命令块
14、竖杆(|):管道表示符&:表示重定向*?!表示模式匹配$变量名的开头#表示注释,第一行除外空格:制表符,换行符,当作空白第二章变量和运算符本地变量影响变量的命令环境变量引号变量替换运算符位置变量表达式替换标准 shell变量运算符的优先级特殊变量7 2.1 变量什么是 shell 本地变量环境变量变量替换(显示变量)位置变量标准变量特殊变量影响变量的命令2.1.1 本地变量本地变量在用户现在的shell 生命周期的脚本中使用variable-name=value set 显示本地所有的变量Readonly variable-name 1.例子:#LOCALTEST=“test”#echo$LO
15、CALTEST test 2.通过 set查看本地变量#set 如果退出系统,重新登陆后不显示这个变量3.#readonly LOCALTEST 将 LOCALTEST 设置为只读#LOCALTEST=“chinaitlab”重新付值为chinaitlab bash:LOCALTEST:readonly variable,显示报错信息,为只读文件不能重新付值4.#readonly 或 readonly p 查看当前shell 下有哪些只读文件declare r LOCALTEST=“test”declare ir UID=“0“2.1.2 环境变量环境变量用于所有用户进程(经常称为子进程)。登
16、陆进程称为父进程。Shell 中运行的进程均称为子进程。不想本地变量(只用于现在的shell)环境变量可用于所有的子进程,这包括编辑器、脚本和应用。$HOME/.bash_profile(/etc/profile)export env 例子 1.#Cat/etc/profile#export CHINAITLAB=shenzhen 设置变量8#env 或 export 查看当前有哪些变量例子 2.#readonly CHINAITLAB#export CHINAITLAB=Shenzhen chinabash:LOCALTEST:readonly variable 2.1.3 变量替换用变量的
17、值替换它的名字echo 在变量名前加&,使用 echo 命令可以显示单个变量取值例子 1.#testvar=“this is a test“#echo$testvar this is a test 变量替换表$variable name 显示实际值到variable name$variable name:+value 如果设置了variable name,则显示其值value,否则,为空$variable name:?value 如果未设置variable name,显示用户定义错误信息value$variable name:-value 如果未设置variable name,则显示其值val
18、ue$variable name:=value 如果未设置variable name,设置其值,并显示例子 2.#testvar=“this is a test“#echo$testvar:+chinaitlab 如果设置了Chinaitlab 显示 value 例子 3.#echo$testvar1:+chinaitlab 如果未设置#显示为空例子 4.#echo$testvar1:?no defined 未设置显示用户定义错误信息Bash:testvar1:no defined 例子 5.#echo$testvar1:-chinaitlab 未设置显示其值chinaitlab 例子 6#e
19、cho$testvar:-chinaitlab ,设置了显示其值this is a test 例子 7#echo$testvar:=chinaitlab ,设置了显示设置的值this is a test 9 例子 8#echo$testvar2:=chinaitlab,未设置显示,并设置显示其值Chinaitlab#echo$testvar2 Chinaitlab 2.1.4 变量清除unset unset variable name 例子 1.清除变量#testvar=“this is a test“#echo$testvar this is a test#unset testvar#ech
20、o$testvar 显示为空#例子 2.#testvar2=“chinaitlab“#echo$testvar2 Chinaitlab#readonly testvar2#unset testvar2 bash:unset:testvar2:can not unset:readonly veriable 显示报错信息2.1.5 位置变量位置变量表示$0,$1.$9$0$1$2$3$4$5$6$7$8$9 脚本名字A B C D E F 向脚本中使用位置参数例子 1#!/bin/bash#parm echo“这是脚本的名称:&0 echo 这是脚本的第1 个位置参数:&1echo 这是脚本的第2
21、 个位置参数:&2echo 这是脚本的第3 个位置参数:&3echo 这是脚本的第4 个位置参数:&4echo 这是脚本的第5 个位置参数:&510 执行这个脚本#./parm A B C 这是脚本的名称:parm 这是脚本的第1 个位置参数:A 这是脚本的第2 个位置参数:B 这是脚本的第3 个位置参数:C 这是脚本的第4 个位置参数:这是脚本的第5 个位置参数:向系统命令传递参数#vi parm.sh 修改 parm.sh 脚本的内容脚本内容#!/bin/bash#parm.sh find/home/chinaitlab/shell name$1 print 执行这个脚本#./parm.s
22、h myfile.txt/home/chinaitlab/shel/myfile.sh 2.1.6 标准变量bash 默认建立了一些标准环境变量,可在/etc/profile 中定义EXINIT HOME 主目录IFS 设置目录分隔例子:#IFS=:echo$PATH/usr/local/sbin/usr/sbin/usr/sbin 显示的目录是以空格隔开#IFS=echo$PATH/usr/local/sbin:/usr/sbin:/usr/sbin LOGNAME 例子:#echo$LOGNAME root#set|grep LOGLOGNAME=rootMALL 例子#set|grep
23、MAIL MAIL=/var/spool/mail/root MAILCHECK=60 MALLCHECK MAILPATH 11 PATH PS1#set|grep PS1PS1=uh w$所以显示rootchinaitlab shell#PS1=chinaitlab:显示:chinaitlab:PS2,一行执行多个命令时有用PS2=时#for loop in cat myfile do echo$loop done parm myfile SHELL TERMINFO 终端类型的信息TERM 终端类型例子#set|grep TERM TERM=vt100 TZ 时区EDITOR PWD MANPATH 帮助信息的路径2.1.7 特殊变量$#(传递到脚本的参数列表)$*(以一个单字符串显示所有想脚本传递的参数。与位置变量不同,此选项参数可超过10 个$(脚本运行的当前进程ID 号)$!(后台运行的最后一个进程的进程ID 号)$(与$#相同,但是使用时加引号,并在引号中返回每个参数)$-(显示 shell 使用的当前选项,与set 功能基本相同)$?(显示最后命令的退出状态,0 表示没有错误,其他任何值表示有错误)
限制150内