面向过程:
控制结构
顺序结构
选择结构
循环结构
1)
1 |
|
练习
写一个脚本,可以接受选项及参数,而后能够获取每一个选项,及选项的参数,并能根据选项及参数做出特定的操作,比如:
adminusers.sh –add tom,jerry –del tom,blair -v|–verbose -h|help
1 |
|
面向过程:
控制结构
顺序结构
选择结构
循环结构
1 |
|
写一个脚本,可以接受选项及参数,而后能够获取每一个选项,及选项的参数,并能根据选项及参数做出特定的操作,比如:
adminusers.sh –add tom,jerry –del tom,blair -v|–verbose -h|help
1 |
|
文件系统访问列表:
比如:
tom创建了一个文件,但是他想共享给jerry,具有可读写的权限,
但是,这个意味着他要把other那加上w权限,这样就不是他所期望的
那样了,所以这个地方引入facl
FACL:Filesystem Access Control List
利用文件扩展属性保存额外的访问控制权限
目的:
jerry:rw-
setfacl:
-m:设定额外的访问控制权限
u:UID:perm
setfacl -m u:jerry:rw test.txt
可以使用 getfacl test.txt进行查看
g:GID:perm
setfacl -m g:group:rw test.txt(多了一个组可读写)
对于目录,
setfacl -m d:u:UID:perm:rw DIR
这个意味着对这个目录下的所有文件进行共享
-x:取消额外的访问控制权限
setfacl -x u:jerry test.txt
setfacl -x g:group test.txt
getfacl:查看
getfacl test.txt
who:
username TTY log_time
-r:显示运行级别
-H:显示哪登陆的
w: log_time 空闲时间 使用cpu时间 运行当前进程使用的时间 正在干什么
这两个命令没法查看su 过去的用户;
终端类型:
console:控制台
pty:物理终端
tty#:虚拟终端(附加在pty上)
ttys#:串行终端(无VGA时的名称)
pts#:伪终端(远程或者图形化界面)
#:1,2,3…
last:显示登录历史
所查看的是 /var/log/wtmp文件,显示用户的登录历史及系统重启历史
-n:最近n次登陆
lastb:显示用户错误的登录尝试,即没成功的
/var/log/btmp文件
-n:最近n次登陆
lastlog:显示每一个用户的最近一次的成功登陆信息
-u:查看哪一个用户
basename:用于显示路径的文件名
如:basename /etc/skel
skel
mail:对应家目录mbox (我centos的是在/var/spool/mail/下)
mail -s 发送
mail -s “Hello” root < /etc/skel
即主题是hello,内容是/etc/skel
hostname:只是暂时的
永久的在 /etc/sysconfig/network
练习:
如果当前主机名不是www.geasyheart.com。就将其修改如此
[ hostname
!= ‘www.geasyheart'] &&hostname www.geasyheart.com
如果当前主机名是localhost,就将其修改为www.geasyheart.com。就将其修改如此
[ hostname
==’localhost’ ] && hostname www.geasyheart.com
如果当前主机的主机名为空,或none,或localhost,就将其修改为www.geasyheart.com
[ -z hostname
] || [ hostname
== ‘none’ -o hostname
== ‘localhost’ ] && hostname www.geasyheart.com
(这个地方要注意,选项和布尔运算不能放一起)
生成随机数:
RANDOM:0~32768
echo $RANDOM
随机数生成器:熵池
/dev/random
/dev/urandom
到熵池取随机数,如果取得多,熵池可能会被取空,这个时候,
如果是random的话,会让你等半天,然后再把熵池填满,再让你取;
而urandom是如果取完了,会采用软件乘胜方式,进行生成;
所以,在安全方面,random更高,然而在速度方面,urandom更快;
写一个脚本,利用RANDOM生成10个随机数,并找出最大数;
1 |
|
特殊权限:
SUID:运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;
chmod u+s FILE
如果FILE本身原来就有执行权限,则SUID显示为s;否则为S;
一般这个可以认为以root用户的权限运行这个程序;
如:getfacl /bin/cat ,可以看到owner:root group:root
SGID:运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组;
chmod g+s FILE
如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的话,
他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,
而文件所有者不变,还是属于建立这个文件的用户。
如:
在/tmp目录下创建一个目录progrem,
1 |
|
当user1在/tmp/progrem创建文件时,文件的所有者和所属组都是user1,即其他的组成员没法编辑这个文件,只能看,,所以为了
其他组成员可以参与编辑这个文件,可以:: chmod 2770 /tmp/progrem,这样再创建文件的所属组就属于文件的所属组了;
(而这个也是平常使用最多的一个)
Sticky:
chmod o+t DIR
t的作用在于每个人都可以使用这个目录,但是没法删除这个目录以及这个目录下的任何东西,即使给w权限,也只是可以修改内容,也同样没法删除文件。
1755 2755 4755
文件查找:
locate:
非实时,查找是根据全系统文件数据库运行的;
updatedb ,手动生成文件数据库
速度快
find:
实时
精确
支持众多查找标准
遍历指定目录中的所有文件完成查找,速度慢
Usage:
find查找路径,查找标准,查找到以后的处理运作
查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件
处理运作:默认为显示
匹配标准:
-name “filename”,对文件名作精确匹配
文件名匹配:
*:
.:
?:
-iname “filename”:对文件名不区分大小写
-regex PATTERN:基于正则表达式进行文件查找(这个用的不多)
-user USERNAME :基于用户名进行查找
-group GROUPNAME:基于属组进行查找
-uid :这个要说明,用户存在的时候可以不用这个,但是当用户删除的时候,他所拥有的文件的拥有者将会变成他原来名称的uid,所以这个价值体现在这;
-gid:根据GID查找
-nouser:查找没有属主的文件(这个挺重要)
-nogroup:查找没有属组的文件
-type:根据文件类型进行查找
f:普通文件
d:目录
c:字符设备
b:块设备
l:链接
p:管道设备
s:套接字
-size:根据文件大小今次那个查找
[+:大于/ -:小于]k:
M:
G:
说明,在进行精确查找时,1M意味着按一定规则的都认为是1M;;
组合条件:
-a 与
-o 或
-not 非
find /tmp -not -user root
find /tmp -user root -o -user geasyheart
find /tmp -not user1 -a -not user2
find ./ -not (-user user1 -a -type d)
-mtime:修改时间
-ctime:改变时间
-atime:访问时间
[+,-]:+5至少5天没访问过 -5:最近5天访问过
-mmin
-cmin
-amin:分钟;;;
然后可以使用stat + 文件名进行查看这个文件的信息
根据文件权限进行查找:
-perm mode 每一位权限必须精确匹配
-perm -mode 文件包含的权限包含查找的权限就可匹配出来
-perm /mode 只要有一位就可以
find ./ -perm 644
find ./ -perm /011 组或其他user具有执行权限
find ./ -perm -011 组和其他user具有执行权限
运作:
-print:显示
-ls:类似ls -l 的形式显示每一个文件的详细信息
-ok COMMAND {} ;每一步都需要用户确认
-exec COMMAND () ;
find -perm -006 –exec chmod o-w {} ;
find ./ -perm -020 –exec mv {} {}.new ;
(!!!所以,{}的意思是指匹配到的的集合!!!)
练习:
find /var -user root -a -group mail
find /usr -not -user root -a -not -user bin -a -not -user student
find /usr -not ( -user root -o -user bin -o -user student )
find /etc –mtime -7 -a ( - not -user root -a -not -user student )
find / (-nouser -o -nogroup) -a -atime -1 -exec chmod root:root {} ;
find /etc -size +1M >> /tmp/etc.largefiles
find /etc -size +1M | xargs echo >> /tmp/etc.largefiles
find /etc -not -perm /222 -ls
1 |
|
1 |
|
if [ $# -gt 1 -a $# -le 3 ]
if [ $# -gt 1] && [ $# -le 3 ]
当用户输入q或Q或quit或Quit:退出
if [ $1 == 'q' -o 'Q' -o 'quit' -o 'Quit' ];then
echo "Quiting"
exit 0
else
echo "Unknown Error"
末行模式下:
.:表示当前行
$:最后一行
+#:向下的#行
1,$ y 复制1至最后一行
c:修改:
cc + 新内容 这种方式是会直接把行内容删除,然后再插入模式下添加新内容
r:替换:
r + 内容 这个一般用于单字符的修改
6r + a: 就会把当前字符的后6个替换成a
R:替换:
在文本中直接替换,这个用的多!!!!!!!!!!
u:撤销
最多撤销50次;;;
ctrl + r:还原撤销
. :重复前一次编辑操作
/PATTERN:查找
?PATTERN:向前查找
敲n指向下一个
可视化模式
v:按单个字符进行选取
V:按整行进行选取
查找并替换:
和sed命令一样
1,5s/PATTERN1/PARRERN2/gi(i是忽略大小写)
s/#//
s/#//g
%:表示全文
vim file1 file2
:next 切换下一个
:prev 切换上一个
:last 最后一个
:first 第一个
:qa 全部退出
分屏显示:
即windows下words的分屏操作
ctrl + w,s :水平分割,先按ctrl+w,松开,再按s
ctrl +w ,v:垂直分割(Vertical)
实现窗口的切换 ctrl + w+ 方向键
分窗口显示多个文件:
vim -o 水平分割
-O 垂直分割
实现窗口的切换 ctrl + w+ 方向键
将另外一个文件的内容填充到当前文件中
:r file
:set ic (忽略大小写)
:set noic(取消忽略大小写)
:set autoindent or set ai (设置自动缩进)
:set noai(取消自动缩进)
查找到的为虐你高亮显示或取消
set hlsearch
set nohlsearch
语法高亮
syntax on
syntax off
练习:
%s/ftp://instructor.example.com/pub/http://172.16.0.1/yum/g
vim /etc/fstab ,然后 :5,9 w ~/fstab
==:测试字符串是否相等 (其实 = 也可以,不过一般不用这种)
such as: A=hello B=hi [ $A == $B ] echo $?(注意,等号前后A和B要有空格)
!=:用来测试是否不等,不等为真,否则为假;
>: 大于
<: 小于(一般这两个不用)
-n string:测试指定字符串是否为空,空则真,不空为假;
-s string:测试指定字符串是否不空,不空为真,空为假;
1 | #!/bin/bash |
传递三个参数给脚本,第一个为整数,第二个为算数运算符,第三个为整数,将其结果显示出来,要求保留两位精度;形如:./cal.sh 5/2
1 | #!/bin/bash |
1 | for while until |
1 | #!/bin/bash |
1 | #!/bin/bash |
1 | #!/bin/bash |
(补充说明,这个脚本不完善,准确来说,这个脚本即使在用户存在的条件下也可以跳过执行其他的)
1 | #!/bin/bash |
1 | #!/bin/bash |
grep/sed/awk
sed(流编辑器):
stream edittor
行编辑器 vim:全屏编辑器
逐行处理
sed:模式空间
默认情况下不编辑原文件,仅对模式空间中的数据做处理,
而后,处理结束后,将模式空间打印到屏幕上;
sed [options]”AddressCommand“ file…
-n:静默模式,不再默认显示模式空间中的内容
-i:直接修改原文件
-e:SCRIPT -e SCRIPT:可以同时-e ‘AddressCommand’ -e ‘AddressCommand’
-f: /PATH/TO/SED_SCRIPT
sed -f /path/to/script file (就是拿路径下的脚本对file进行操作)
-r:表示使用扩展正则表达式
或者:
sed ‘AddressCommand’ file…(两者的区别,在于需不需要转义)
Address:
Command:
d:删除符合条件的行;
(比如删除/etc/fstab的前两行 sed “1,2d” /etc/fstab)
(比如删除第3行至最后一行,sed ‘3,$d’ /etc/fstab,,(补充,换成“”就会出错))
(比如包含dev的行都给删除掉,sed ‘/dev/d’ /etc/fstab)
(比如删除从第1行往后两行,sed ‘1,+2d’ /etc/fstab)
(比如删除含有/dev的行, sed ‘/dev//d’ /etc/fstab)
(比如删除含有/dev/的行,sed ‘//dev//d’ /etc/fstab(补充,如这两个,要进行转义))
p:显示符合条件的行
(比如显示文件中(a.txt只有a,b,c,d)中的a, sed ‘/a/p’ a.txt,会把符合条件的显示两遍,
而不符合的,也会显示出来,这个就叫做在模式空间中符合条件的打印出来,但同时也会把原文件打印出来,
而删除会在模式空间中把文件中符合条件的删除后进行显示,所以不会有这种情况,所以,为了只显示符合条件
的内容,使用-n选项,即上面说的静默模式)
a \string:在指定的行后面追加新行,内容为”string”
(比如最前面是/的前面添加# hello world以及换行添加hello Easy,sed ‘/^//a # hello world \n hello Easy ‘ /etc/fstab)
i \string:在指定的行前面添加新行,内容为string
r filename:将指定的文件的内容添加至符合条件的行处
(比如,将/etc/login.defs文件内容添加至/etc/fstab的第2行处,sed ‘2r /etc/login.defs’ /etc/fstab)
(比如,添加到最后,sed ‘$r /etc/login.defs’ /etc/fstab)
w filename:将指定范围内的内容另存至指定的文件中;
(比如,将/etc/fstab 中含有oot行存至/tmp/oot.txt,,sed ‘/oot/w /tmp/oot.txt’ /etc/fstab)
s /pattern/string/:查找并替换每一行中第一次被模式匹配到的串
(查找/etc/fstab中含有oot的字符换为OOT,,sed ‘s/oot/OOT’ /etc/fstab)
如果每一行中所有含有oot的都替换,可以加
修饰符:
g(全局替换) sed ‘s/oot/OOT/g’ /etc/fstab
i(忽略大小写)
(比如要替换文件中凡是含有l..e的字符替换成l..er,(如like要替换成liker) sed ‘s/l..e/&r/g’ /etc/fstab)
(比如要替换所有l..e的字符替换成L..e(like换成Like) sed ‘s/l(..e)\L\1/g’ /etc/fstab)(后项引用)
练习:
文件测试:
-e file :测试文件是否存在
-f file :测试文件是否为普通文件
-d file:测试指定路径是否为目录
-r file:测试当前指定文件是否具有读取权限
-w :测试当前指定文件是否具有写权限
-x :测试当前指定文件是否具有执行权限
定义脚本退出状态码
exit命令:
1 | if ! grep user1 /etc/passwd &>/dev/null ; then |
1 | #!/bin/bash |
bash -n file.sh:用来测试脚本是否有错误
bash -x file.sh:单步执行脚本(用来查看bash是怎么执行这个脚本的,可用于查错)
练习:
给定一个文件;
如果是一个普通文件,就显示之;
如果是一个目录,亦显示之;
否则,此为无法识别此文件
1 | #!/bin/bash |
或者:
1 | if [ ! -e $FILE ];then |
位置变量:
./filetest.sh /etc/passwd /etc/login.defs
$1:/etc/inittab
$2:/etc/passwd
such as:
1 | #!/bin/bash |
练习:
1 | #!/bin/bash |
1 | #!/bin/bash shift1.sh 关于shift,参考05_02 |
算数运算:
A=3
B=4
let C=$A+$B
C=$[$A+$B]
C=$(($A+$B))
C=
expr $A + $B
(注意格式)
练习:
判断当前系统上是否有用户的默认shell为bash
如果有,就显示有多少这类用户,否则,就显示没有这类用户
1 | #!/bin/bash |
给定一个文件,比如/etc/inittab
判定这个文件中是否有空白行
如果有,则显示其空白行数,否则,显示没有空白行
1 | #!/bin/bash |
给定一个用户,判断其UID和GID是否相等
如果一样,显示此用户为“good boy” 否则“bad boy”
1 | #!/bin/bash |
给定一个用户,获取其密码警告期限
而后判断用户最近一次修改密码的时间距今天是否已经小于警告期限;
如果小于,则显示“Warning”,否则“OK”
1 | #!/bin/bash |
判定命令历史中历史命令的总条目是否大于1000,如果大于,显示”Some command will gone”;否则显示”OK”
1 | #!/bin/bash |
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true