对日期进行加减,建议先转换成1970-01-01 UTC之后的秒数,然后再进行加减
1.转换成1970-01-01 UTC之后秒数:start_date=$(date -d'080826' +%s)
2.进行加减:end_date=$(expr $start_date + n \* 86400)
其中,n是需要增加的天数,86400是一天的秒数
3.转换成需要的日期格式:end_date=$(date -d"1970-01-01 UTC $end_date seconds" +%y%m%d)
时间加减
如:1990-01-01 01:01:01 加上 1小时 20分
处理方法:
a.将基础时间转为时间戳
time1=$(date +%s -d '1990-01-01 01:01:01')
echo $time1
631126861 【时间戳】
b.将增加时间变成秒
[root@localhost ~]# time2=$((1*60*60+20*60))
[root@localhost ~]# echo $time2
4800
c.两个时间相加,计算出结果时间
time1=$(($time1+$time2))
time1=$(date +%Y-%m-%d\ %H:%M:%S -d "1970-01-01 UTC $time1 seconds");
echo $time1
1990-01-01 02:21:01
2。时间差计算方法
如:2010-01-01 与 2009-01-01 11:11:11 时间差
原理:同样转成时间戳,然后计算天,时,分,秒
time1=$(($(date +%s -d '2010-01-01') - $(date +%s -d '2009-01-01 11:11:11')));
echo time1
将time1 / 60 秒,就变成分了。
shell时间(字符串和时间戳转换)
在shell中,字符串转换为时间戳可以这样做:
date -d "2010-10-18 00:00:00" +%s
输出形如:
1287331200
其中,-d参数表示显示指定的字符串所表示的时间,+%s表示输出时间戳。
而时间戳转换为字符串可以这样做:
date -d @1287331200
输出形如:
Mon Oct 18 00:00:00 CST 2010
如果要转换成“2010-10-18 00:00:00”这种形式的时间戳,则这样做:
date -d "1970-01-01 UTC 1287331200 seconds" "+%F %T"
输出形如:
2010-10-18 00:00:10
再多废话一句,如果只要输出日期,不要时间,则去掉 %T 就可以了:
date -d "1970-01-01 UTC 1287331200 seconds" +%F
输出形如:
2010-10-18
年月日小时分钟
file_time=`cat /home/hadoop/readfile/datatime.txt`
time_1=$(date -d "`echo ${file_time} | sed 's/\([0-9]\{8\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1 \2:\3/'`" +%s)
next_1=`expr ${time_1} + 300`
next_time=`date -d "1970-01-01 UTC ${next_1} seconds" "+%Y%m%d%H%M"`
年月日小时分钟秒
echo ${file_time} | sed 's/\([0-9]\{8\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1 \2:\3:/'
date -d "`echo 201606210000 | sed 's/\([0-9]\{8\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1 \2:\3:/'`" +%s
date -d "1970-01-01 UTC 1466438400 seconds" "+%Y%m%d%H%M%S"
以下还有一些时间的计算方法:
echo $(date --date='3 day') //当天日期+3天
Fri Jan 16 11:55:02 CST 2015
echo $(date --date='3 day ago') //当天日期-3天
Sat Jan 10 11:55:10 CST 2015
echo $(date --date='3 month') //当天日期+3月
Mon Apr 13 11:55:17 CST 2015
echo $(date --date='3 month ago') //当天日期-3朋
Mon Oct 13 11:55:25 CST 2014
echo $(date --date='3 year') //当天日期+3年
Sat Jan 13 11:55:32 CST 2018
echo $(date --date='3 year ago') //当天日期-3年
Fri Jan 13 11:55:38 CST 2012
echo $(date --date='3 minute ') //当天日期+3秒
Tue Jan 13 11:58:44 CST 2015
echo $(date --date='3 minute ago') //当天日期-3秒
Tue Jan 13 11:52:52 CST 2015
echo $(date --date='3 hour ago') //当天日期-3小时
Tue Jan 13 08:56:00 CST 2015
echo $(date --date='3 hour') //当天日期+3小时
Tue Jan 13 14:56:06 CST 2015
很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.txt中提取也文件名file.txt,提取出目录/dir1/dir2,提取出文件后缀txt等。
下面介绍两种常用的方法来进行相关的操作。
一、使用${}
1、${var##*/}
该命令的作用是去掉变量var从左边算起的最后一个'/'字符及其左边的内容,返回从左边算起的最后一个'/'(不含该字符)的右边的内容。使用例子及结果如下:
从运行结果可以看到,使用该命令,可以提取出我们需要的文件名file.txt。
若使用时在shell程序文件中,可以使用变量来保存这个结果,再加以利用,如file=${var##*/}
2、${var##*.}
该命令的作用是去掉变量var从左边算起的最后一个'.'字符及其左边的内容,返回从左边算起的最后一个'.'(不含该字符)的右边的内容。使用例子及结果如下:
从运行结果可以看到,使用该命令,可以提取出我们需要的文件后缀。
如果文件的后缀不仅有一个,例如,file.tar.gz,命令${var##*.}仅能提取最后一个后缀,而我想提取tar.gz时该怎么办?那么就要用下面所说的${var#*.}命令了。
3、${var#*.}
该命令的作用是去掉变量var从左边算起的第一个'.'字符及其左边的内容,返回从左边算起第一个'.'(不含该字符)的右边部分的内容。使用例子及结果如下:
从运行结果可以看到,使用该命令,可以提取出文件的多个后缀。
4、${var%/*}
该命令的使用是去掉变量var从右边算起的第一个'/'字符及其右边的内容,返回从右边算起的第一个'/'(不含该字符)的左边的内容。使用例子及结果如下:
从运行的结果可以看到,使用该命令,可以提取出我们需要的文件所在的目录
5、${var%%.*}
该命令的使用是去掉变量var从右边算起的最后一个'.'字符及其右边的内容,返回从右边算起的最后一个'.'(不含该字符)的左边的内容。使用例子及结果如下:
当我们需要建立一个与文件名相同名字(没有后缀)的目录与对应的文件相对应时,就可以使用该命令来进行操作。例如,解压文件的情况就与此类似,我们压缩文件file.zip时,会在与file.zip同级目录下建立一个名为file的目录。
6、${}总结
其实${}并不是专门为提取文件名或目录名的,它的使用是变量的提取和替换等等操作,它可以提取非常多的内容,并不一定是上面五个例子中的'/'或'.'。也就是说,上面的使用方法只是它使用的一个特例。
看到上面的这些命令,可能会让人感到非常难以理解和记忆,其实不然,它们都是有规律的。
#:表示从左边算起第一个
%:表示从右边算起第一个
##:表示从左边算起最后一个
%%:表示从右边算起最后一个
换句话来说,#总是表示左边算起,%总是表示右边算起。
*:表示要删除的内容,对于#和##的情况,它位于指定的字符(例子中的'/'和'.')的左边,表于删除指定字符及其左边的内容;对于%和%%的情况,它位于指定的字符(例子中的'/'和'.')的右边,表示删除指定字符及其右边的内容。这里的'*'的位置不能互换,即不能把*号放在#或##的右边,反之亦然。
例如:${var%%x*}表示找出从右边算起最后一个字符x,并删除字符x及其右边的字符。
看到这里,就可以知道,其实该命令的用途非常广泛,上面只是指针文件名和目录名的命名特性来进行提取的一些特例而已。
二、basename和dirname
${}并不是专门为提取文件名和目录名设计的命令,那么basename和dirname命令就是专门为做这一件事而已准备的了。
1、basename
该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。
1)从路径中提出出文件名(带后缀),例子如下:
2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名,例子如下:
2、dirname
该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME
使用例子如下:
这样就提取出了file.txt文件所在的目录。
注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:
它提取出了目录dir2所在的目录dir1.
0.删除交换分区(逻辑卷分配交换分区的时候需要的额外操作)
关闭交换分区
swapoff /dev/mapper/VolGroup-lv_swap
1、先通过umount命令卸载掉逻辑卷lv_home
umount /dev/mapper/VolGroup-lv_home
2、修改/etc/fstab里面逻辑卷的挂载信息,否则系统有可能启动不起来。
删除上面删除和卸载的交换分区以及文件系统
3、通过lvremove 删除逻辑卷lv_home
lvremove /dev/mapper/VolGroup-lv_home
lvremove VolGroup 删除交换去
4、通过vgremove 删除卷组VolGroup
vgremove VolGroup
5、通过pvremove 将物理卷转化成普通分区。
pvremove /dev/sdg2
6、重新删除和格式化磁盘/dev/sdg
sed:stream editor
流线型,非交互式的编辑器。它每次只处理一行文件并把输出打印到屏幕上。
Pattern space: 模式空间即存放当前正在处理的行的缓存空间。 一旦处理工作完成,sed就会把结果输出到屏幕,然后清空模式空间并把下一行读入模式空间,进行相关处理;直到最后一行。
sed是无破坏性的,它不更改原文件,除非你使用重定向保存输出结果。
对于一行文本,sed命令是依次执行的,如果有多个命令的话。这时,要注意各命令之间可能产生的相互影响。
对于多个sed命令,我们可以用“{}”把它们括起来。但要注意,右花括号一定要单独成行。
sed命令后不能有空格,前面则无所谓。
我们可以把一系列的sed命令写入文件中并用sed 的-f选项调用
好啦,打住先(没提到的后面都会有例子说明的,嘿嘿)
首先,我们来看看sed的语法及寻址方式:
语法:
sed [options] 'command' filename(s)
寻址方式:
1.单行寻址:[line-address]command;寻找匹配line-address的行并进行处理。
2.行集合寻址:[regexp]command ;匹配文件中的一行或多行,如/^A/command匹配所有以A开头的行。
3.多行寻址: [line-address1,line-address2] command;寻找在两个地址之间的内容并做相应的处理。
4.嵌套寻址:10,20{
/^$/d
#上面三种寻址方法都可以应用在这里
}
接下来,瞧瞧sed的一些命令和选项
sed选项:
选项 功能
-e 允许多次编辑
-f 跟随脚本文件名
-n 禁止默认输出
sed的相关命令:
命令 | 功能
a\ | 向当前行添加文本行
c\ | 用新的文本行取代当前行里的文本
i\ | 在当前行之前插入文本
d | 删除行
h | 把模式空间内容复制到一个固定缓存
H | 把模式空间内容添加到一个固定缓存
g |把固定缓存里的所有文本都复制到模式缓存,重写模式缓存的内容
G |把固定缓存里的所有文本添加到模式缓存
l | 列出不打印的字符
p | 打印行
P(大写) |多行打印,输出多行模式空间里的第一部分,直到第一个嵌入的换行符为止
n | 输出模式空间的内容并读取下一行
N | 读取新的输入行并将其添加到模式空间的现有内容之后来创建多行模式空间
q | 结束或退出
r |读入行,从某个文件
! | 把命令应用到选定行之外的其它所有行
s | 替换
替换标志:
标志
功能
g
全局替换
p
打印
w
把行写到文件中
x
交换;用模式空间的内容交换固定缓存的内容
y
转换,如大小写转换
sed支持的一些元字符:
元字符
功能
例
^
定位行开头
/^sed/:匹配所有以sed开头的行
$
定位行结尾
/sed$/:匹配所有以sed结尾的行
.
匹配单个字符,不包括换行符
/s.d/:匹配包含一个s,后跟一个字符,再跟一个e的行
*
匹配零个或多个字符
/*sed/:匹配的行有零个或多个空格且其后跟模式sed
[]
匹配集中的一个字符
/[Ss]ed/:匹配包含sed或Sed的行
[^]
反上
/[^Ss]ed/:匹配的行不包含s,S且后跟ed
\(..\)
保存被匹配的字符
s/\(love\)/\1 ly/:用lovely取代love。把被标志的部分标为1,以后就能用\1引用。最多允许使用9个标记,第一个从模式的最左端开始。如上面的love就保存在寄存器1里且被记在替换串里。
&
保存搜索串以便记在替换串里
s/sed/fuck&/:&代表搜索串sed。此例中sed将被fucksed替换
\<
定位词开头
/\<sed/:匹配以sed开头的一个词
\>
定位词结尾
/sed\>/:匹配以sed结尾的一个词
x\{m\}
字符x重复m次
o\{3\}:匹配的行里o要连续出现3次
x\{m,\}
字符x至少重复m次
o\{3\,}:匹配的行里o至少要连续出现3次
x\{m,n\}
字符x至少重复m次且不超过n次
O\{3,5\}:匹配的行里要o至少要连续出现3次但不超过5次
好啦,下面就有例子来说话喔,呵呵
datafile的内容:
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
e.g. 1:
a\--找到以north开头的行并在其后添加很多FUCK
[fedora@novice chap04]$ sed '/^north/a\FUCK FUCK FUCK FUCK \nkcuf kcuf kcuf kcuf' datafile
northwest NW Charles Main 3.0 .98 3 34
FUCK FUCK FUCK FUCK
kcuf kcuf kcuf kcuf
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
FUCK FUCK FUCK FUCK
kcuf kcuf kcuf kcuf
north NO Margot Weber 4.5 .89 5 9
FUCK FUCK FUCK FUCK
kcuf kcuf kcuf kcuf
central CT Ann Stephens 5.7 .94 5 13
***************************************************************************************************
发现在bash中只能像上面那样输入且a后的\可有可无 ; 并不像书上说的那样,不知是不是跟SHELL有关系
一般,a后是要带\的,有时还要带两个。如果要添加的文本不止一行的话,除了最后一行每一行的结尾都要跟\。以上只是在控制台输入,在脚本中输入的情况还是和书上说的一样的。
***************************************************************************************************
e.g. 2:
i\ --在以central开头的行前分行插入FUCK
[fedora@novice chap04]$ sed '/central/i\F\nU\nC\nK' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
F
U
C
K
central CT Ann Stephens 5.7 .94 5 13
***************************************************************************************************
一般,如果要添加的文本不止一行的话,除了最后一行每一行的结尾都要跟\。但在我这里好像有点不一样,在终端直接输入时。
****************************************************************************************************
e.g. 3:
c\--把有sourth的行全部用FUCK取代
[fedora@novice chap04]$ sed '/south/c\FUCK' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
FUCK
FUCK
FUCK
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
****************************************************************************************************
*其它与e.g.1 ,e.g. 2 类似
****************************************************************************************************
e.g. 4:
d--删除第一行
[fedora@novice chap04]$ sed '1d' datafile
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
d--删除1-4行
[fedora@novice chap04]$ sed '1,4d' datafile
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
d--删除有north的行
[fedora@novice chap04]$ sed '/north/d' datafile
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
central CT Ann Stephens 5.7 .94 5 13
***************************************************************************************************
e.g. 5:
s--替换。用FUCK替换north.
[fedora@novice chap04]$ sed 's/north/FUCK/' datafile
FUCKwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
FUCKeast NE AM Main Jr. 5.1 .94 3 13
FUCK NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
s--替换。用FUCK替换所有以south开头的行中的south.
[fedora@novice chap04]$ sed '/^south/s/south/FUCK/g' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
FUCKwest SW Lewis Dalsass 2.7 .8 2 18
FUCKern SO Suan Chin 5.1 .95 4 15
FUCKeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
s--替换。 寻找大于1少于10的一位小数并用FUCK+&替代。这里的&保存了前面的小数
[fedora@novice chap04]$ sed 's/[0-9]\.[0-9]/FUCK&/' datafile
northwest NW Charles Main FUCK3.0 .98 3 34
western WE Sharon Gray FUCK5.3 .97 5 23
southwest SW Lewis Dalsass FUCK2.7 .8 2 18
southern SO Suan Chin FUCK5.1 .95 4 15
southeast SE Patricia Hemenway FUCK4.0 .7 4 17
eastern EA TB Savage FUCK4.4 .84 5 20
northeast NE AM Main Jr. FUCK5.1 .94 3 13
north NO Margot Weber FUCK4.5 .89 5 9
central CT Ann Stephens FUCK5.7 .94 5 13
****************************************************************************************************
刚开始时用的是下面的语句:
sed '[0-9][0-9]$/FUCK&/' datafile,怎么弄都不成功。
不知是怎么回事。
*****************************************************************************************************
e.g. 6:
p--打印:默认打印所有的行。这里用-n选项过滤无关的行
[fedora@novice chap04]$ sed -n '/north/p' datafile
northwest NW Charles Main 3.0 .98 3 34
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
发现一个问题:p也会把匹配的行打印两次:
[fedora@novice chap04]$ sed '/north/p' datafile
northwest NW Charles Main 3.0 .98 3 34
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94
也就是说不使用-n选项的话,p会打印出匹配两次
P--多行打印:在执行完所有命令后模式空间的内容会自动输出,在下面的例子中可以看到匹配的行输出了两次,但是-n选项会抑制这个动作。只有在与D,N配合使用时才会输出模式空间里的第一行,此时不用-n选项。
[fedora@novice chap04]$ sed '/north/P' datafile
northwest NW Charles Main 3.0 .98 3 34
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
****************************************************************************************************
e.g. 7:
D--多行删除:选项看到d与D的不同之处了么?其中空行分别为1,2,3,4行。
[fedora@novice chap04]$ cat >test
this is a test line
this is a test line
this is a test line
this is a test line
this ia a test line
[fedora@novice chap04]$ sed -e '/^$/N' -e '/^\n$/d' test
this is a test line
this is a test line
this is a test line
this is a test line
this ia a test line
[fedora@novice chap04]$ sed -e '/^$/N' -e '/^\n$/D' test
this is a test line
this is a test line
this is a test line
this is a test line
this ia a test line
****************************************************************************************************
可以看到,与N配合的情况下:
使用d,若有偶数个空行将会全被删除,若有奇数个空行将会保留一行。这是因为d删除的是整个模式空间的内容。一旦遇到第一个空行就马上读入下一行,然后两行都删除。如果第三行为空且下一行不为空则命令不执行,空行被输出。
使用D,当遇到两个空行时D会删除两个空行中的第一个,然后再读入下一行,如果是空行则删除第一行,如果空行后有文本则模式空间可以正常输出。
***************************************************************************************************
e.g. 8:关于N命令与-e选项在上面已在应用,这里就不举例啦,偷点懒哈,嘿嘿。
*****************************************************************************************************
e.g. 9:
r--从文件中读取:从test中读取相关的内容添加到datafile中所有匹配的行的后面。
[fedora@novice chap04]$ sed '/^south/r test' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
**********************************
FUCK FUCK FUCK FUCK ,FUCK TOO MUCH
**********************************
southern SO Suan Chin 5.1 .95 4 15
**********************************
FUCK FUCK FUCK FUCK ,FUCK TOO MUCH
**********************************
southeast SE Patricia Hemenway 4.0 .7 4 17
**********************************
FUCK FUCK FUCK FUCK ,FUCK TOO MUCH
**********************************
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
***************************************************************************************************
e.g. 10
w--写入文件:把datafile中所有匹配的行写入到test文件中
[fedora@novice chap04]$ sed '/^south/w test' datafile|cat test
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
***************************************************************************************************
e.g. 11
n--next:如果有能匹配western行,则n命令使得sed读取下一行,然后执行相应命令
[fedora@novice chap04]$ sed -e '/western/n' -e 's/SW/FUCK/' datafile|head -n 4
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest FUCK Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
***************************************************************************************************8
e.g. 12
y--变换:
[fedora@novice chap04]$ sed '3,5y/s/S/' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
SouthweSt SW LewiS DalSaSS 2.7 .8 2 18
Southern SO Suan Chin 5.1 .95 4 15
SoutheaSt SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
[fedora@novice chap04]$ sed '1y/3/9/' datafile
northwest NW Charles Main 9.0 .98 9 94
western WE Sharon Gray 5.3 .97 5 23
***************************************************************************************************
替换的类型要一致,数字与字母之间不能相互替换。
且对正则表达式的元字符不起作用。
*****************************************************************************************************
e.g. 13:
q--退出:
打印三行后退出
[fedora@novice chap04]$ sed '3q' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
用相应的字符做出替换后退出
[fedora@novice chap04]$ sed -e 'y/northwest/ABCDEFGHI/' -e q datafile
ABCDEFGHD NW CEaClGH MaiA 3.0 .98 3 34
这样也可以的
[fedora@novice chap04]$ sed '{ y/northwest/ABCDEFGHI/; q;}' datafile
ABCDEFGHD NW CEaClGH MaiA 3.0 .98 3 34
多个命令写在一行时可以用-e选项,也可以用花括号把所有命令括起来并用分号隔开且最后一个分号可有可无,在我的实验环境下。
**************************************************************************************************
e.g. 14:
H/h/G/g--保存和取得
下面是这几个命令的一些组合,能看出些什么来么?
[fedora@novice chap04]$ sed -e '/northeast/h' -e '$g' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
northeast NE AM Main Jr. 5.1 .94 3 13
[fedora@novice chap04]$ sed -e '/northeast/h' -e '$G' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
northeast NE AM Main Jr. 5.1 .94 3 13
[fedora@novice chap04]$ sed -e '/northeast/H' -e '$g' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
northeast NE AM Main Jr. 5.1 .94 3 13
[fedora@novice chap04]$ sed -e '/northeast/H' -e '$G' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
northeast NE AM Main Jr. 5.1 .94 3 13
因为呢,H/G在相应空间的内容之后放置一个换行符,且后面紧跟模式空间的内容;而g/h的呢都是取代相应空间的内容,所以就有上面的不同结果喔
***************************************************************************************************
e.g. 15
x--交换模式/保持空间内容
首先匹配第一个包含north的行放入保持缓存,然后匹配第一个包含south的行放入模式空间,最后把两者的内容交换。
[fedora@novice chap04]$ sed -e '/north/h' -e '/south/x' datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
northwest NW Charles Main 3.0 .98 3 34
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
****************************************************************************************************
e.g. 16
sed脚本:
[fedora@novice chap04]$ vim sedlist
/central/a\
------This is a test--------
/northeast/i\
------This is a test too------
[fedora@novice chap04]$ sed -f sedlist datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
------This is a test too------
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
------This is a test--------
可以在里面添加注释,以#开头的行被认为是注释
如有多行,则每行都要以\结尾,除了最后一行。如,下面的脚本是可以正常执行的。
[fedora@novice chap04]$ cat sedlist
#This script is a test for sed commands list
/central/a\
------This is a test too--------\
------Hi am here----------------\
#now ,the second test
/northeast/i\
------This is a test ------
***************************************************************************************************
****************************************************************************************************
*******************************************************************************************************
高级流控制命令
b 分支 :无条件转移
t 测试 :有条件的转移
它们将脚本中的控制转移到包含特殊标签的行;如果没有标签则直接转移到脚本的末尾。只有当替换命令改变当前行时才会被执行。
标签:任意的字符组合且长度不大于7,它本身占据一行且以冒号开头
:mylabel
冒号和标签之间不能有空格,标签后的空格会被当做标签的一部分。
标签和命令之间允许有空格。
b 分支:[address] b [label]
b --> branch,在脚本中将控制权转到另一行,通过它你可以跳到你想去的地方,是不是有点像c中的goto呀?
它可以将一组命令当做一个过程来执行且这个过程在脚本中可以重复执行,只要条件满足。
e.g 17
b--分支
看下面的例子:
e.g. 17.1
匹配以north加空格开头的行,若匹配则转到:label后面的命令,在以s开头的行前插入FFFFFFFFFFFFFFUCK ;
[fedora@novice chap04]$ cat sedlist
#This script is a test for sed commands
:label
/^s/i\
FFFFFFFFFFFFFFUCK
/^north / b label
[fedora@novice chap04]$ sed -f sedlist datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
FFFFFFFFFFFFFFUCK
southwest SW Lewis Dalsass 2.7 .8 2 18
FFFFFFFFFFFFFFUCK
southern SO Suan Chin 5.1 .95 4 15
FFFFFFFFFFFFFFUCK
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
其实这也是个循环,反复执行两个标签间的命令,直到模式不匹配。但是,如上,不管匹配与否两个标签间的内容至少会被执行一次。也就是说,正常情况下上面的命令都会被执行一次。看下面的例子:
e.g 17.2
[fedora@novice chap04]$ cat sedlist
#This script is a test for sed commands
:label
/^n/d
/^A/b label
/^cent/a\
--FUCK!!! \
Just a test! \
Take it easy!!!
[fedora@novice chap04]$ sed -f sedlist datafile
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
central CT Ann Stephens 5.7 .94 5 13
--FUCK!!!
Just a test!
Take it easy!!!
看到了吧!虽然模式不匹配,但还是执行了两个标签间的内容,嘿嘿!再看看上面,和do-while语句有什么异同?
e.g. 17.3
如果匹配,什么都不做,否则执行后的命令向以cent开头的行后添加一些内容
[fedora@novice chap04]$ cat sedlist
#This script is a test for sed commands
:label
/^A/b label
/^cent/a\
--FUCK!!! \
Just a test! \
Take it easy!!!
[fedora@novice chap04]$ sed -f sedlist datafile
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
--FUCK!!!
Just a test!
Take it easy!!!
e.g. 17.4
另一种循环模式
command1
/pattern/b label
command2
label:
command3
首先执行command1,然后看模式是否匹配,若匹配则执行command3,否则执行command2,command3
[fedora@novice chap04]$ cat sedlist
#This script is a test for sed commands
/^n/d
/^A/b label
s/south/SSSSSS/
:label
/^cent/a\
--FUCK!!! \
Just a test! \
Take it easy!!!
[fedora@novice chap04]$ sed -f sedlist datafile
western WE Sharon Gray 5.3 .97 5 23
SSSSSSwest SW Lewis Dalsass 2.7 .8 2 18
SSSSSSern SO Suan Chin 5.1 .95 4 15
SSSSSSeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
central CT Ann Stephens 5.7 .94 5 13
--FUCK!!!
Just a test!
Take it easy!!!
模式不匹配,顺序执行各命令,下面来看匹配的情况:
[fedora@novice chap04]$ cat sedlist
#This script is a test for sed commands
/^w/d
#north后有一个空格
/^north /b label
s/south/SSSSSS/
:label
/^cent/a\
--FUCK!!! \
Just a test! \
Take it easy!!!
[fedora@novice chap04]$ sed -f sedlist datafile
northwest NW Charles Main 3.0 .98 3 34
SSSSSSwest SW Lewis Dalsass 2.7 .8 2 18
SSSSSSern SO Suan Chin 5.1 .95 4 15
SSSSSSeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
--FUCK!!!
Just a test!
Take it easy!!!
很显然,这里并没有跳过第二个命令,但是理论上只模式空间匹配的话就会直接转到:label后的命令的呀!这到底是为什么呢?我们来看下一个脚本,只对上个脚本做一点点修改:
[fedora@novice chap04]$ cat sedlist
#This script is a test for sed commands
/^w/d
#north后有一个空格
/^north /b label
s/north /SSSSSS/
:label
/^cent/a\
--FUCK!!! \
Just a test! \
Take it easy!!!
[fedora@novice chap04]$ sed -f sedlist datafile
northwest NW Charles Main 3.0 .98 3 34
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
--FUCK!!!
Just a test!
Take it easy!!!
这次结果正常啦,它找到了以north加空格开头的行,并跳过了第二个命令。
再来看两个例子:
在第二个命令后再添加一个命令s/south/NNNNNN看会有怎样的结果:
[fedora@novice chap04]$ cat sedlist
#This script is a test for sed commands
/^w/d
/^north /b label
s/north /SSSSSS/
s/south/NNNNNN/
:label
/^cent/a\
--FUCK!!! \
Just a test! \
Take it easy!!!
[fedora@novice chap04]$ sed -f sedlist datafile
northwest NW Charles Main 3.0 .98 3 34
NNNNNNwest SW Lewis Dalsass 2.7 .8 2 18
NNNNNNern SO Suan Chin 5.1 .95 4 15
NNNNNNeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
--FUCK!!!
Just a test!
Take it easy!!!
显然,s/north /SSSSSS/ 没有被执行而s/south/NNNNNN/ 被执行啦
又一个例子:
[fedora@novice chap04]$ cat sedlist1
#This script is a test for sed commands
/^w/d
/^north/b label
p
:label
/^cent/a\
--FUCK!!! \
Just a test! \
Take it easy!!!
[fedora@novice chap04]$ sed -f sedlist1 datafile
northwest NW Charles Main 3.0 .98 3 34
southwest SW Lewis Dalsass 2.7 .8 2 18
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
central CT Ann Stephens 5.7 .94 5 13
--FUCK!!!
Just a test!
Take it easy!!!
可以看到p应用到了除以north开头的所有行!再来一个例子:
[fedora@novice chap04]$ cat sedlist1
#This script is a test for sed commands
/^w/d
/^north/b label
p
l
:label
/^cent/a\
--FUCK!!! \
Just a test! \
Take it easy!!!
[fedora@novice chap04]$ sed -f sedlist1 datafile
northwest NW Charles Main 3.0 .98 3 34
southwest SW Lewis Dalsass 2.7 .8 2 18
southwest\tSW\tLewis Dalsass\t\t2.7\t.8\t2\t18\r$
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southern\tSO\tSuan Chin\t\t5.1\t.95\t4\t15\r$
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
southeast \tSE\tPatricia Hemenway\t4.0\t.7\t4\t17\r$
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
eastern\t\tEA\tTB Savage\t\t4.4\t.84\t5\t20\r$
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
central\t\tCT \tAnn Stephens\t\t5.7\t.94\t5\t13\r$
central CT Ann Stephens 5.7 .94 5 13
--FUCK!!!
Just a test!
Take it easy!!!
看到了么?P,l都只应用到了除以north开头的所有行上!!!
从上面的一堆例子中,可以得到:在
command1
/pattern/b label
command2
label:
command3
模式中 只有 针对 匹配pattern的行 的操作才会被跳过!
e.g. 17.5
如何指定执行上例中的command2或command3中的一个
commmand1
/pattern/b label
command2
b
:label
command3
首先执行command1,然后执行/pattern/b label,如果模式匹配则直接跳到command3并执行相关命令,否则跳到command2在执行完相关命令后遇到分支b,分支b将控制转到脚本的结尾,绕过了command3.
下面看一个简单的例子:
[fedora@novice chap04]$ cat sedlist1
#This script is a test for sed commands
/^e/d
/^DDD/b label
s/west/SSSSSS/
b
:label
/^cent/a\
--FUCK!!! \
Just a test! \
Take it easy!!!
[fedora@novice chap04]$ sed -f sedlist1 datafile
northSSSSSS NW Charles Main 3.0 .98 3 34
SSSSSSern WE Sharon Gray 5.3 .97 5 23
southSSSSSS SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
是吧,果然当模式不匹配时只执行command2而:label后的命令没有被执行,哈哈
e.g. 18
t: [address] t [label]
t-->test,如果在当前匹配的行上成功地进行了替换,那么t命令就转到标签处或脚本末尾(未给定标签默认指向脚本末尾)。
t要单独成行
下面来一个简单的例子:
[fedora@novice chap04]$ cat sedlist
/^s/d
/^west/s/west/QQQ/
t label1
/^n/y/nort/FUCK/
t label
:label
/^F/y/FUCK/nort/
:label1
/^QQQ/s/QQQ/west/
[fedora@novice chap04]$ sed -f sedlist datafile
northwest NW rharles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
[fedora@novice chap04]$ cat sedlist
/^s/d
/^west/y/Q/a/
t label1
/^n/y/nort/FUCK/
t label
:label
/^F/y/FUCK/nort/
:label1
/^n/y/FUCK/nort/
[fedora@novice chap04]$ sed -f sedlist datafile
northwest NW rharles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
看出两者的区别了么?我相会的,嘿嘿
GPT 分区类型的磁盘添加和划分新分区方法
使用命令:parted
# parted /dev/sda -------划分磁盘sda分区
GNU Parted 2.1
使用 /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help 首先看看帮助熟悉下
print -------------------查看现有分区
mklabel gpt -------------------创建创建磁盘标签
mkpart -------------创建一个分区
分区名称? ----------可以省略不写
文件系统类型? -----------ext4 或者默认
起始点? 1 -------根据上面查看的现有分区的终点大小
结束点? 4398GB -----------根据sda的大小
rm 1 --------------创建错误可以删除分区重新创建
p --------------查看新建的分区
toggle 1 lvm -------把新建的分区改为lvm逻辑卷。
quit ---------------退出分区命令
扩展逻辑卷lv
1. 创建PV:
创建PV:pvcreate /dev/vda1
查看系统PV:pvscan
这样我们就创建了一个 21T的PV
2. 增加 VG容量:
查看卷组名:vgdisplay
增加VG:vgextend 卷组名 /dev/vda1
查看VG:vgdisplay
这样我们就将vg_test增加了 21T(XXXX 个Free PE,要记住这个数字)
3. 增加LV容量:
查看lv的名称:lvdisplay
增加LV:lvresize -L +XXXX (/dev/mapper/cl-home)lv路径(XXXX是VG中Free PE的个数) 或者lvresize -L +XXXXGB (/dev/mapper/cl-home)lv路径
查看LV:lvdisplay
这样我们就将 lv_test 的容量增加至21T
4. 扩展文件系统
# resize2fs (/dev/mapper/cl-home)lv路径
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block 当尝试打开 /dev/mapper/cl-home 时
找不到有效的文件系统超级块. ----------报错
----------解决办法----------------------
确认文件系统是xfs:
[root@backup binlog]# cat /etc/fstab | grep cl-home
/dev/mapper/centos-home /home xfs defaults 0 0
xfs用以下命令来扩磁盘空间:
[root@backup binlog]# xfs_growfs /dev/mapper/centos-home
成功。
yum install createrepo yum-utils
创建本地源:
reposync -m -p /home/ftpdata/yum/centos7
创建rpm包目录,把rpm全部拷贝到此目录下
如:
/home/centos/yum/base
进入此目录/home/centos/yum/执行
##################createrepo -u -o -d /home/centos/yum
createrepo -g /home/ftpdata/yum/centos6/base/comps.xml /home/ftpdata/yum/centos6 ##软件组
createrepo -p -d -o /home/ftpdata/yum/centos6 /home/ftpdata/yum/centos6 ##rpm包
挂载iso镜像文件:
mount -t iso9660 -o loop CentOS-7-x86_64-DVD-1908.iso /mnt
本地文件源:
[iso]
name="iso repo"
baseurl=file:///media/cdrom/
enabeld=1
gpgcheck=0
ftp连接方式:
[ftp]
name=ftp
baseurl=ftp://yum:[email protected]/
enabled=1
gpgcheck=0
yum clean all
yum makecache
linux运维必须知道的几个常用命令
1.删除0字节文件
find -type f -size 0 -exec rm -rf {} \;
2.查看进程
按内存从大到小排列
ps -e -o "%C : %p : %z : %a"|sort -k5 -nr
3.按cpu利用率从大到小排列
ps -e -o "%C : %p : %z : %a"|sort -nr
4.打印说cache里的URL
grep -r -a jpg /data/cache/* | strings | grep "http:" | awk -F'http:' '{print "http:"$2;}'
5.查看http的并发请求数及其TCP连接状态:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
6. sed -i '/Root/s/no/yes/' /etc/ssh/sshd_config sed在这个文里Root的一行,匹配Root一行,将no替换成yes.
7.1.如何杀掉mysql进程:
ps aux |grep mysql |grep -v grep |awk '{print $2}' |xargs kill -9 (从中了解到awk的用途)
killall -TERM mysqld
kill -9 `cat /usr/local/apache2/logs/httpd.pid` 试试查杀进程PID
8.显示运行3级别开启的服务:
ls /etc/rc3.d/S* |cut -c 15- (从中了解到cut的用途,截取数据)
9.如何在编写SHELL显示多个信息,用EOF
cat << EOF
+--------------------------+
| === Welcome to Tunoff services === |
+--------------------------+
EOF
10. for 的巧用(如给mysql建软链接)
cd /usr/local/mysql/bin
for i in *
do ln /usr/local/mysql/bin/$i /usr/bin/$i
done
11. 取IP地址:
ifconfig eth0 |grep "inet addr:" |awk '{print $2}'|cut -c 6- 或者
ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'
12.内存的大小:
free -m |grep "Mem" | awk '{print $2}'
13.
netstat -an -t | grep ":80" | grep ESTABLISHED | awk '{printf "%s %s\n",$5,$6}' | sort
14.查看Apache的并发请求数及其TCP连接状态:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
15.因为同事要统计一下服务器下面所有的jpg的文件的大小,写了个shell给他来统计.原来用xargs实现,但他一次处理一部分,搞的有多个总和....,下面的命令就能解决啦.
find / -name *.jpg -exec wc -c {} \;|awk '{print $1}'|awk '{a+=$1}END{print a}'
CPU的数量(多核算多个CPU,cat /proc/cpuinfo |grep -c processor)越多,系统负载越低,每秒能处理的请求数也越多。
---------------------------------------------------
16 CPU负载 # cat /proc/loadavg
检查前三个输出值是否超过了系统逻辑CPU的4倍。
18 CPU负载 #mpstat 1 1
检查%idle是否过低(比如小于5%)
19 内存空间 # free
检查free值是否过低 也可以用 # cat /proc/meminfo
20 swap空间 # free
检查swap used值是否过高 如果swap used值过高,进一步检查swap动作是否频繁:
# vmstat 1 5
观察si和so值是否较大
21 磁盘空间 # df -h
检查是否有分区使用率(Use%)过高(比如超过90%) 如发现某个分区空间接近用尽,可以进入该分区的挂载点,用以下命令找出占用空间最多的文件或目录:
# du -cks * | sort -rn | head -n 10
22 磁盘I/O负载 # iostat -x 1 2
检查I/O使用率(%util)是否超过100%
23 网络负载 # sar -n DEV
检查网络流量(rxbyt/s, txbyt/s)是否过高
24 网络错误 # netstat -i
检查是否有网络错误(drop fifo colls carrier) 也可以用命令:# cat /proc/net/dev
25 网络连接数目 # netstat -an | grep -E “^(tcp)” | cut -c 68- | sort | uniq -c | sort -n
26 进程总数 # ps aux | wc -l
检查进程个数是否正常 (比如超过250)
27 可运行进程数目 # vmwtat 1 5
列给出的是可运行进程的数目,检查其是否超过系统逻辑CPU的4倍
28 进程 # top -id 1
观察是否有异常进程出现
29 网络状态 检查DNS, 网关等是否可以正常连通
30 用户 # who | wc -l
检查登录用户是否过多 (比如超过50个) 也可以用命令:# uptime
31 系统日志 # cat /var/log/rflogview/*errors
检查是否有异常错误记录 也可以搜寻一些异常关键字,例如:
# grep -i error /var/log/messages
# grep -i fail /var/log/messages
32 核心日志 # dmesg
检查是否有异常错误记录
33 系统时间 # date
检查系统时间是否正确
34 打开文件数目 # lsof | wc -l
检查打开文件总数是否过多
35 日志 # logwatch –print 配置/etc/log.d/logwatch.conf,将 Mailto 设置为自己的email 地址,启动mail服务(sendmail或者postfix),这样就可以每天收到日志报告了。
缺省logwatch只报告昨天的日志,可以用# logwatch –print –range all 获得所有的日志分析结果。
可以用# logwatch –print –detail high 获得更具体的日志分析结果(而不仅仅是出错日志)。
36.杀掉80端口相关的进程
lsof -i :80|grep -v "PID"|awk '{print "kill -9",$2}'|sh
37.清除僵死进程。
ps -eal | awk '{ if ($2 == "Z") {print $4}}' | kill -9
38.tcpdump 抓包 ,用来防止80端口被人攻击时可以分析数据
# tcpdump -c 10000 -i eth0 -n dst port 80 > /root/pkts
39.然后检查IP的重复数 并从小到大排序 注意 "-t\ +0" 中间是两个空格
# less pkts | awk {'printf $3"\n"'} | cut -d. -f 1-4 | sort | uniq -c | awk {'printf $1" "$2"\n"'} | sort -n -t\ +0
40.查看有多少个活动的php-cgi进程
netstat -anp | grep php-cgi | grep ^tcp | wc -l
chkconfig --list | awk '{if ($5=="3:on") print $1}'
41.kudzu查看网卡型号
kudzu --probe --class=network
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d*$ //匹配正整数
^-[1-9]\d*$ //匹配负整数
^-?[1-9]\d*$ //匹配整数
^[1-9]\d*|0$ //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式
创建vpn用户
/etc/openvpn/easy-rsa/easyrsa3/easyrsa gen-req 用户
/etc/openvpn/easy-rsa/easyrsa3/easyrsa sign client 用户
密匙生成路径
/etc/openvpn/easy-rsa/easyrsa3/pki/issued/
cd /etc/openvpn/easy-rsa/easyrsa3/
已经删除vpn的账户
/etc/openvpn/easy-rsa/easyrsa3/easyrsa revoke test
/etc/openvpn/easy-rsa/easyrsa3/easyrsa gen-crl
网可以访问的
/etc/openvpn/easy-rsa/easyrsa3/easyrsa revoke test
用法: rar <命令> -<选项 1> -<选项 N> <压缩档案> <文件…>
<@文件列表…> <解压缩路径\>
<命令>
a 添加文件到压缩档案
c 添加压缩档案注释(注释的大小最大不能超过62000字节)
cf 添加文件备注( 当使用’v'参数时显示文件备注,最大不能超过32767字节)
ch 改变压缩档案参数
cw 向指定文件写入档案备注
d 从档案中删除文件
e 解压缩文件到当前目录(不创建任何子目录)
f 刷新档案中的文件(更新这些文件自它们被打包之后产生的变化,不在压缩档案中增加新的)
i[par]=<str> 在档案中查找特定字符
k 锁定档案(任何试图改变压缩档案中内容的命令都会被忽略)
l[t,b] 列出档案[technical, bare]
m[f] 移动到压缩档案中[只针对文件]
p 打印文件到标准输出
r 修补压缩档案
rc 重建丢失的分卷
rn 重命名压缩档案中的文件
rr[N] 添加数据恢复记录
rv[N] 创建恢复卷
s[name|-] 压缩档案与SFX(自解压文档)之间的转换
t 测试压缩档案文件
u 更新压缩档案中的文件
v[t,b] 列出压缩档案的详细信息[technical,bare]
x 解压缩到完整路径
<选项>
- 停止对选项的扫描
ad 追加档案名称到目标路径
ag[format] 使用当前数据生成压缩档案名
ap<path> 在档案内部设置路径
as 同步档案内目录
av 设置认证检测(只有注册版提供此功能)
av- 关闭认证检测
c- 关闭备注显示
cfg- 关闭读取设置
cl 转换名称为小写字母
cu 转换名称为大写字母
df 压缩后删除原文件
dh 打开共享文件
ds 关闭针对于稳固档案的名称排序
dw 压缩后擦除文件
e[+]<attr> 设置文件排除与包含属性
ed 不添加空目录
en 不设置档案结束块
ep 名称中不包含路径
ep1 名称中不包含基本文件目录
ep3 展开路径到完整包含的驱动器名
f 刷新文件
hp[password] 加密文件数据和文件头部
id[c,d,p,q] 关闭消息
ierr 发送所有消息到标准错误输出
ilog[name] 记录错误日志到文件中(只有注册版提供此功能)
inul 关闭所有消息
isnd 打开声音
k 锁定压缩档案
kb 保持被解压过的已损坏的文件
m<0..5> 设置压缩等级(0-存储…3-默认…5-最大)
mc<par> 设置高级压缩参数
md<size> Dictionary size in KB (64,128,256,512,1024,2048,4096 or A-G)
ms[ext;ext] 存储指定的文件类型
n<file> 仅包含指定的文件
n@ 从标准输入读取文件名到包含内容中
n@<list> 在指定列表文件中包含文件
o[+|-] 设置重写模式
ol 替文件保存符号连接作为连接
or 自动重命名文件
ow 保存活存储文件的拥有者与群组
p[password] 设置密码
p- 不询问密码
r 对子目录进行递归操作
r0 仅用通配符名称对子目录进行递归操作
rr[N] 添加数据恢复记录
rv[N] 创建恢复
s[<N>,v[-],e] 创建稳固档案压缩
s- 关闭稳固档案压缩
sc<chr>[obj] 设置指定的字符串
sfx[name] 创建SFX档案
si[name] 从标准输入读取数据
sl<size> 处理文件的大小小于指定的值
sm<size> 处理文件的大小大于指定的值
t 压缩后测试文件
ta<date> 处理修改日期为指定日期之后的文件,<date>格式: YYYYMMDDHHMMSS
tb<date> 处理修改日期为指定日期之前的文件,<date>格式: YYYYMMDDHHMMSS
tk 保持档案最初的时间
tl 设置档案时间为据现在最近的文件时间
tn<time> 处理比指定时间新的文件
to<time> 处理比指定时间旧的文件
ts<m,c,a>[N] 保存或存储文件时间(修改,创建,访问)
u 更新文件
v 创建自动大小的卷或列出所有卷
v<size>[k,b] 创建指定大小的卷size=<size>*1000 [*1024, *1]
ver[n] 文件版本控制
vn 使用旧的卷命名体系
vp 在每个卷之前暂停
w<path> 指定工作目录
x<file> 排除指定文件
x@ 排除从标准输入中读取的文件名称
x@<list> 从指定列表文件中指定要排除的文件
y 设定所有回答为yes
z[file] 从文件中读取压缩档案的备注
第一步:导出当前iptables运行值
sudo sh -c "iptables-save > /etc/network/iptables"
如果不想导出可以跳过(可以直接按第二步的方式重新创建默认配置)
第二步:编辑配置文件/etc/network/iptables(默认没有需要自己创建)
sudo vi /etc/network/iptables
下面是提供只开放22号TCP端口的配置文件(仅供参考)
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
第三步:应用刚才所编写的iptables配置文件
sudo iptables-apply
Applying new ruleset... done.
Can you establish NEW connections to the machine? (y/N)
然后按Y进行确认。否则回滚之前状态。
4.查看防火墙状态
sudo ufw status
2.启用
sudo ufw enable
sudo ufw default deny
运行以上两条命令后,开启了防火墙,并在系统启动时自动开启。关闭所有外部对本机的访问,但本机访问外部正常。
3.开启/禁用
sudo ufw allow|deny [service]
规则
#双向
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许本机
iptables -A INPUT -i lo -j ACCEPT
#FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#www 80
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#13306 映射转发到 mysql数据库 3306
iptables -A PREROUTING -p tcp --dport 13306 -j REDIRECT --to-ports 3306 -t nat
#3306 mysql数据库
#iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
#memache
#iptables -A INPUT -p tcp --dport 11211 -j ACCEPT
#对于OUTPUT规则,因为预设的是ACCEPT,所以要添加DROP规则,减少不安全的端口链接。
iptables -A OUTPUT -p tcp --sport 31337 -j DROP
iptables -A OUTPUT -p tcp --dport 31337 -j DROP
#丢弃坏的TCP包
iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
#处理IP碎片数量,防止攻击,允许每秒100个
#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
#设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包
#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
#防止外部的ping和SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 100/s --limit-burst 100 -j ACCEPT
#ping洪水攻击,限制每秒的ping包不超过10个
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j ACCEPT
#防止各种端口扫描,将SYN及ACK SYN限制为每秒钟不超过200个
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT
#最后规则拒绝所有不符合以上所有的
iptables -A INPUT -j DROP
在编程语言中,循环语句是最基本的语法之一,在Shell(这里是Bash)中也不例外,再把以前自己写过的相关内容整理一下吧。
这里包括for/while/until循环,以及变量自增的语法实例。
Shell(以Bash为例)中的循环语句一般有for、while、until这几种,偶尔还有写错语法的时候,这里结合实例来自己总结一下。也为今后使用提供一个快捷的资料获取渠道。
一、for循环语句
实例1.1 最基本的for循环: (传统的形式,for var in …)
复制代码 代码如下:
#!/bin/bash
for x in one two three four
do
echo number $x
done
注:”for” 循环总是接收 “in” 语句之后的某种类型的字列表。在本例中,指定了四个英语单词,但是字列表也可以引用磁盘上的文件,甚至文件通配符。
实例1.2 对目录中的文件做for循环
复制代码 代码如下:
#!/bin/bash
for x in /var/log/*
do
#echo "$x is a file living in /var/log"
echo $(basename $x) is a file living in /var/log
done
注:这个$x获得的是绝对路径文件名;可以使用 “basename” 可执行程序来除去前面的路径信息。如果只引用当前工作目录中的文件(例如,如果输入 “for x in *”),则产生的文件列表将没有路径信息的前缀。
实例1.3 对位置参数做for循环
复制代码 代码如下:
#!/bin/bash
for thing in "$@"
do
echo you typed ${thing}.
done
实例1.4 for循环中用seq产生循环次数,加上C语言形式的for循环语句
复制代码 代码如下:
#!/bin/bash
echo "for: Traditional form: for var in ..."
for j in $(seq 1 5)
do
echo $j
done
echo "for: C language form: for (( exp1; exp2; exp3 ))"
for (( i=1; i<=5; i++ ))
do
echo "i=$i"
done
注:对于固定次数的循环,可以通过seq命令来实现,就不需要变量的自增了;这里的C语言for循环风格是挺熟悉的吧。
二、while循环语句
实例2.1 循环输出1到10的数字
复制代码 代码如下:
#!/bin/bash
myvar=1
while [ $myvar -le 10 ]
do
echo $myvar
myvar=$(( $myvar + 1 ))
done
注:只要特定条件为真,”while” 语句就会执行
三、until循环语句
实例3.1 循环输出1到10的数字
“Until” 语句提供了与 “while” 语句相反的功能:只要特定条件为假,它们就重复。下面是一个与前面的 “while” 循环具有同等功能的 “until” 循环。
复制代码 代码如下:
#!/bin/bash
myvar=1
until [ $myvar -gt 10 ]
do
echo $myvar
myvar=$(( $myvar + 1 ))
done
Linux Shell中写循环时,常常要用到变量的自增,现在总结一下整型变量自增的方法。
我所知道的,bash中,变量自增,目前有五种方法:
1. i=`expr $i + 1`;
2. let i+=1;
3. ((i++));
4. i=$[$i+1];
5. i=$(( $i + 1 ))
可以实践一下,简单的实例如下:
复制代码 代码如下:
#!/bin/bash
i=0;
while [ $i -lt 4 ];
do
echo $i;
i=`expr $i + 1`;
# let i+=1;
# ((i++));
# i=$[$i+1];
# i=$(( $i + 1 ))
done
在shell中常用的特殊符号罗列如下:
# ; ;; . , / \ 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `command`{} [] [[]] () (()) || && {xx,yy,zz,...}~ ~+ ~- & \<...\> + - %= == !=
输出/输入重导向
> >> < << : > &> 2&> 2<>>& >&2
# 井号 (comments)
这几乎是个满场都有的符号,除了先前已经提过的"第一行"
#!/bin/bash
井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行。
# This line is comments.
echo "a = $a" # a = 0
由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就行了。这常用在撰写过程中。
#echo "a = $a" # a = 0
如果被用在指令中,或者引号双引号括住的话,或者在倒斜线的后面,那他就变成一般符号,不具上述的特殊功能。
~ 帐户的 home 目录
算是个常见的符号,代表使用者的 home 目录:cd ~;也可以直接在符号后加上某帐户的名称:cd ~user
或者当成是路径的一部份:~/bin;~+ 当前的工作目录,这个符号代表当前的工作目录,她和内建指令 pwd 的作用是相同的。
# echo ~+/var/log~- 上次的工作目录,这个符号代表上次的工作目录。
# echo ~-/etc/httpd/logs
; 分号 (Command separator)
在 shell 中,担任"连续指令"功能的符号就是"分号"。譬如以下的例子:cd ~/backup ; mkdir startup ; cp ~/.* startup/.
;; 连续分号 (Terminator)
专用在 case 的选项,担任 Terminator 的角色。
case "$fop" inhelp) echo "Usage: Command -help -version filename" ;;version) echo "version 0.1" ;;esac
. 逗号 (dot)
在 shell 中,使用者应该都清楚,一个 dot 代表当前目录,两个 dot 代表上层目录。
CDPATH=.:~:/home:/home/web:/var:/usr/local
在上行 CDPATH 的设定中,等号后的 dot 代表的就是当前目录的意思。
如果档案名称以 dot 开头,该档案就属特殊档案,用 ls 指令必须加上 -a 选项才会显示。除此之外,在 regular expression 中,一个 dot 代表匹配一个字元。
'string' 单引号 (single quote)
被单引号用括住的内容,将被视为单一字串。在引号内的代表变数的$符号,没有作用,也就是说,他被视为一般符号处理,防止任何变量替换。
heyyou=homeecho '$heyyou' # We get $heyyou
"string" 双引号 (double quote)
被双引号用括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引数的处理方式不同。
heyyou=homeecho "$heyyou" # We get home
`command` 倒引号 (backticks)
在前面的单双引号,括住的是字串,但如果该字串是一列命令列,会怎样?答案是不会执行。要处理这种情况,我们得用倒单引号来做。
fdv=`date +%F`echo "Today $fdv"
在倒引号内的 date +%F 会被视为指令,执行的结果会带入 fdv 变数中。
, 逗点 (comma)
这个符号常运用在运算当中当做"区隔"用途。如下例
#!/bin/bashlet "t1 = ((a = 5 + 3, b = 7 - 1, c = 15 / 3))"echo "t1 = $t1, a = $a, b = $b"
/ 斜线 (forward slash)
在路径表示时,代表目录。
cd /etc/rc.dcd ../..cd /
通常单一的 / 代表 root 根目录的意思;在四则运算中,代表除法的符号。
let "num1 = ((a = 10 / 2, b = 25 / 5))"
\ 倒斜线 (
)
在交互模式下的escape 字元,有几个作用;放在指令前,有取消 aliases 的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令的最末端,表示指令连接下一行。
# type rmrm is aliased to `rm -i'# \rm ./*.log
上例,我在 rm 指令前加上 escape 字元,作用是暂时取消别名的功能,将 rm 指令还原。
# bkdir=/home# echo "Backup dir, \$bkdir = $bkdir"Backup dir, $bkdir = /home
上例 echo 内的 \$bkdir,escape 将 $ 变数的功能取消了,因此,会输出 $bkdir,而第二个 $bkdir 则会输出变数的内容 /home。
| 管道 (pipeline)
pipeline 是 UNIX 系统,基础且重要的观念。连结上个指令的标准输出,做为下个指令的标准输入。
who | wc -l
善用这个观念,对精简 script. 有相当的帮助。
! 惊叹号(negate or reverse)
通常它代表反逻辑的作用,譬如条件侦测中,用 != 来代表"不等于"
if [ "$?" != 0 ]thenecho "Executes error"exit 1fi
在规则表达式中她担任 "反逻辑" 的角色
ls a[!0-9]
上例,代表显示除了a0, a1 .... a9 这几个文件的其他文件。
: 冒号
在 bash 中,这是一个内建指令:"什么事都不干",但返回状态值 0。
:
echo $? # 回应为 0
: > f.$$
上面这一行,相当于 cat /dev/null > f.$$。不仅写法简短了,而且执行效率也好上许多。
有时,也会出现以下这类的用法
: ${HOSTNAME?} ${USER?} ${MAIL?}
这行的作用是,检查这些环境变数是否已设置,没有设置的将会以标准错误显示错误讯息。像这种检查如果使用类似 test 或 if 这类的做法,基本上也可以处理,但都比不上上例的简洁与效率。
除了上述之外,还有一个地方必须使用冒号
PATH=$PATH:$HOME/fbin:$HOME/fperl:/usr/local/mozilla
在使用者自己的HOME 目录下的 .bash_profile 或任何功能相似的档案中,设定关于"路径"的场合中,我们都使用冒号,来做区隔。
? 问号 (wild card)
在文件名扩展(Filename expansion)上扮演的角色是匹配一个任意的字元,但不包含 null 字元。
# ls a?a1
善用她的特点,可以做比较精确的档名匹配。
* 星号 (wild card)
相当常用的符号。在文件名扩展(Filename expansion)上,她用来代表任何字元,包含 null 字元。
# ls a*a a1 access_log
在运算时,它则代表 "乘法"。
let "fmult=2*3"
除了内建指令 let,还有一个关于运算的指令 expr,星号在这里也担任"乘法"的角色。不过在使用上得小心,他的前面必须加上escape 字元。
** 次方运算
两个星号在运算时代表 "次方" 的意思。
let "sus=2**3"echo "sus = $sus" # sus = 8
$ 钱号(dollar sign)
变量替换(Variable Substitution)的代表符号。
vrs=123echo "vrs = $vrs" # vrs = 123
另外,在 Regular Expressions 里被定义为 "行" 的最末端 (end-of-line)。这个常用在 grep、sed、awk 以及 vim(vi) 当中。
${} 变量的正规表达式
bash 对 ${} 定义了不少用法。以下是取自线上说明的表列
${parameter:-word} ${parameter:=word} ${parameter:?word} ${parameter:+word} ${parameter:offset} ${parameter:offset:length} ${!prefix*} ${#parameter} ${parameter#word} ${parameter##word} ${parameter%word} ${parameter%%word} ${parameter/pattern/string} ${parameter//pattern/string}
$*引用script. 的执行引用变量,引用参数的算法与一般指令相同,指令本身为0,其后为1,然后依此类推。引用变量的代表方式如下:
$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, ${10}, ${11}.....
个位数的,可直接使用数字,但两位数以上,则必须使用 {} 符号来括住。
$* 则是代表所有引用变量的符号。使用时,得视情况加上双引号。
echo "$*"
还有一个与 $* 具有相同作用的符号,但效用与处理方式略为不同的符号。
$@
$@ 与 $* 具有相同作用的符号,不过她们两者有一个不同点。
符号 $* 将所有的引用变量视为一个整体。但符号 $@ 则仍旧保留每个引用变量的区段观念。
$#
这也是与引用变量相关的符号,她的作用是告诉你,引用变量的总数量是多少。
echo "$#"
$? 状态值 (status variable)
一般来说,UNIX(linux) 系统的进程以执行系统调用exit() 来结束的。这个回传值就是status值。回传给父进程,用来检查子进程的执行状态。
一般指令程序倘若执行成功,其回传值为 0;失败为 1。
tar cvfz dfbackup.tar.gz /home/user > /dev/nullecho "$?"$$
由 于进程的ID是唯一的,所以在同一个时间,不可能有重复性的 PID。有时,script. 会需要产生临时文件,用来存放必要的资料。而此script. 亦有可能在同一时间被使用者们使用。在这种情况下,固定文件名在写法上就显的不可靠。唯有产生动态文件名,才能符合需要。符号$$ 或许可以符合这种需求。它代表当前shell 的 PID。
echo "$HOSTNAME, $USER, $MAIL" > ftmp.$$
使用它来作为文件名的一部份,可以避免在同一时间,产生相同文件名的覆盖现象。
ps: 基本上,系统会回收执行完毕的 PID,然后再次依需要分配使用。所以 script. 即使临时文件是使用动态档名的写法,如果 script. 执行完毕后仍不加以清除,会产生其他问题。
() 指令群组 (command group)
用 括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组。如下面的例子:(cd ~ ; vcgh=`pwd` ; echo $vcgh),指令群组有一个特性,shell会以产生 subshell 来执行这组指令。因此,在其中所定义的变数,仅作用于指令群组本身。我们来看个例子
# cat ftmp-01#!/bin/basha=fsh(a=incg ; echo -e "\n $a \n")echo $a# ./ftmp-01incgfsh
除了上述的指令群组,括号也用在 array 变数的定义上;另外也应用在其他可能需要加上escape 字元才能使用的场合,如运算式。
(())
这组符号的作用与 let 指令相似,用在算数运算上,是 bash 的内建功能。所以,在执行效率上会比使用 let 指令要好许多。
#!/bin/bash(( a = 10 ))echo -e "inital value, a = $a\n"(( a++ ))echo "after a++, a = $a"
{} 大括号 (Block of code)
有时候 script. 当中会出现,大括号中会夹着一段或几段以"分号"做结尾的指令或变数设定。
# cat ftmp-02#!/bin/basha=fsh{a=inbc ; echo -e "\n $a \n"}echo $a# ./ftmp-02inbcinbc
这种用法与上面介绍的指令群组非常相似,但有个不同点,它在当前的 shell 执行,不会产生 subshell。
大括号也被运用在 "函数" 的功能上。广义地说,单纯只使用大括号时,作用就像是个没有指定名称的函数一般。因此,这样写 script. 也是相当好的一件事。尤其对输出输入的重导向上,这个做法可精简 script. 的复杂度。
此外,大括号还有另一种用法,如下
{xx,yy,zz,...}
这种大括号的组合,常用在字串的组合上,来看个例子
mkdir {userA,userB,userC}-{home,bin,data}
我 们得到 userA-home, userA-bin, userA-data, userB-home, userB-bin, userB-data, userC-home, userC-bin, userC-data,这几个目录。这组符号在适用性上相当广泛。能加以善用的话,回报是精简与效率。像下面的例子
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
如果不是因为支援这种用法,我们得写几行重复几次呀!
[] 中括号
常出现在流程控制中,扮演括住判断式的作用。if [ "$?" != 0 ]thenecho "Executes error"exit 1fi
这个符号在正则表达式中担任类似 "范围" 或 "集合" 的角色
rm -r 200[1234]
上例,代表删除 2001, 2002, 2003, 2004 等目录的意思。
[[]]
这组符号与先前的 [] 符号,基本上作用相同,但她允许在其中直接使用 || 与 && 逻辑等符号。
#!/bin/bashread akif [[ $ak > 5 || $ak < 9 ]]thenecho $akfi
|| 逻辑符号
这个会时常看到,代表 or 逻辑的符号。
&& 逻辑符号
这个也会常看到,代表 and 逻辑的符号。
& 后台工作
单一个& 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作。
tar cvfz data.tar.gz data > /dev/null &
\<...\> 单字边界
这组符号在规则表达式中,被定义为"边界"的意思。譬如,当我们想找寻 the 这个单字时,如果我们用
grep the FileA
你将会发现,像 there 这类的单字,也会被当成是匹配的单字。因为 the 正巧是 there 的一部份。如果我们要必免这种情况,就得加上 "边界" 的符号
grep '\' FileA
+ 加号 (plus)
在运算式中,她用来表示 "加法"。
expr 1 + 2 + 3
此外在规则表达式中,用来表示"很多个"的前面字元的意思。
# grep '10\+9' fileB109100910000910000931010009#这个符号在使用时,前面必须加上 escape 字元。
- 减号 (dash)
在运算式中,她用来表示 "减法"。
expr 10 - 2
此外也是系统指令的选项符号。
ls -expr 10 - 2
在 GNU 指令中,如果单独使用 - 符号,不加任何该加的文件名称时,代表"标准输入"的意思。这是 GNU 指令的共通选项。譬如下例
tar xpvf -
这里的 - 符号,既代表从标准输入读取资料。
不过,在 cd 指令中则比较特别
cd -
这代表变更工作目录到"上一次"工作目录。
% 除法 (Modulo)
在运算式中,用来表示 "除法"。
expr 10 % 2
此外,也被运用在关于变量的规则表达式当中的下列
${parameter%word}${parameter%%word}
一个 % 表示最短的 word 匹配,两个表示最长的 word 匹配。
= 等号 (Equals)
常在设定变数时看到的符号。
vara=123echo " vara = $vara"
或者像是 PATH 的设定,甚至应用在运算或判断式等此类用途上。
== 等号 (Equals)
常在条件判断式中看到,代表 "等于" 的意思。
if [ $vara == $varb ]
...下略
!= 不等于
常在条件判断式中看到,代表 "不等于" 的意思。
if [ $vara != $varb ]
...下略
^
这个符号在规则表达式中,代表行的 "开头" 位置。
在写while循环的时候,发现了一个问题,在while循环内部对变量赋值、定义变量、数组定义等等环境,在循环外面失效。
一个简单的测试脚本如下:
#!/bin/bash
echo "abc xyz" | while read line
do
new_var=$line
done
echo new_var is null: $new_var?
执行结果证明,$new_var的结果是空值。
问题出在管道上。先看看下面的内容。
while循环的写法有好几种,它的语法结构为:
while test_cmd_list; do cmd_list; done
但更经常地,while循环更多地用于读取标准输入的内容来实现循环。有以下几种写法:
写法一:使用管道传递内容,这是用的最多、但却最烂的写法
echo "abc xyz" | while read line
do
...
done
写法二:
while read line
do
...
done <<< "abc xyz"
写法三:从文件中读取内容
while read line
do
...
done </path/filename
方法四:采用进程替换
while read var
do
...
done < <(cmd_list)
方法五:改变标准输入
exec <filename
while read var
do
...
done
尽管写法有多种,但它们并不等价。
陷阱一:
方法一中使用的是管道符号,这使得while语句在子shell中执行,这意味着while语句内部设置的变量、数组、函数等在循环外部都不再生效。这正是文章开头所说的陷阱。更简单的:echo haha | a=5,在命令执行结束后,变量a的值也不再是5。其余4种写法,while语句都不在子shell中执行,因此都不会出现文章开头所说的问题。
例如,使用写法二的here string代替写法一:
#!/bin/bash
while read line
do
new_var=$line
done <<< "abc xyz"
echo new_var is null: $new_var?
或者使用写法四的进程替换:
#!/bin/bash
while read line
do
new_var=$line
done < <(echo "abc xyz")
echo new_var is null: $new_var?
陷阱二:
关于这几种while循环的写法,还有一点要注意:写法一和写法四传递数据的源都是一个单独的进程,它们传递的数据一被while循环读取,所有数据就丢弃了,而以实体文件作为重定向传递的数据,while读取了之后并不会丢弃。更标准一些的说法是,当标准输入是非实体文件时(如管道传递的、独立进程产生的)只供一次读取;当标准输入是直接重定向实体文件时,可供多次读取,但只要某一次读取了该文件的全部内容就无法再提供读取。
举个例子,老师让我们听写10个单词,而我记忆力比较烂,他念完10个单词时我可能只写出了3个,剩余的7个因为记不住就没法再写出来。但如果我有小抄,我就可以慢悠悠的一个一个写,写了一个还可以等一段时间再写第二个,但当我写完10个之后,小抄这种东西就应该销毁掉。
回到IO重定向上,无论什么数据资源,只要被读取完毕或者主动丢弃,那么该资源就不可再得。①对于独立进程传递的数据(管道左侧进程产生的数据、进程替换产生的数据),它们都是"虚拟"数据,要不被一次读取完毕,要不读一部分剩余的丢弃,这是真正的一次性资源。②而实体文件重定向传递的数据,只要不是一次性被全部读取,它就是可再得资源,直到该文件数据全部读取结束,这是"伪"一次性资源。其实①是进程间通信时数据传递的现象,只不过这个问题容易被人忽略。
大多数时候,独立进程传递的数据和文件直接传递的数据并没有什么区别,但有些命令可以标记当前读取到哪个位置,使得下次该命令的读取动作可以从标记位置处恢复并继续读取,特别是这些命令用在循环中时。据我到目前的总结,这样的命令有"head -n N"和"grep -m",经测试,tail并没有位置标记的功能。
说了这么多,现在终于开始验证。下面的循环中,本该head每次读取2行,但实际执行结果中总共就只读取了一次2行。
[root@xuexi ~]# i=0
[root@xuexi ~]# cat /etc/fstab | while head -n 2 ; [[ "$i" -le 3 ]];do echo $i;let ++i;done
使用进程替换的结果是一样的。
[root@xuexi ~]# i=0
[root@xuexi ~]# while head -n 2; [[ "$i" -le 3 ]];do echo $i;let ++i;done < <(cat /etc/fstab)
但如果是直接将实体文件进行重定向传递给head,则结果和上面的不一样。
[root@xuexi ~]# i=0;while head -n 2 ; [[ "$i" -le 3 ]];do echo $i;let ++i;done < /etc/fstab
# /etc/fstab
# Created by anaconda on Thu May 11 04:17:44 2017
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / xfs defaults 0 0
UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot xfs defaults 0 0
可以看到结果中每次读取两行并echo一次"$i",而且每次读取的两行是不同的,后一次读取的两行是从前一次读取结束的地方开始的,这是因为head有"读取到指定行数后做上位置标记"的功能。
要确定命令、工具是否具有做位置标记的能力,只需像下面例子一样做个简单的测试。以head和sed为例,即使sed的"q"命令能让sed匹配到内容就退出,但却不做位置标记,而且数据资源使用一次就丢弃。
[root@xuexi ~]# (head -n 2;head -n 2) </etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu May 11 04:17:44 2017
[root@xuexi ~]# (sed -n /default/'{p;q}' ;sed -n /default/'{p;q}') </etc/fstab
UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / xfs defaults 0 0
其实在实际应用过程中,这根本就不是个问题,因为搜索和处理文本数据的工具虽然不少,但绝大多数都是用一次文本就"丢"一次,几乎不可能因此而产生问题。之所以说这么多废话,主要是想说上面的5种while写法中,使用最广泛的写法一虽然最简单、方便,但其实是最烂的一种。
rsync -rPz --bwlimit=100 --rsh="ssh -i /root/.ssh/id_rsa" [email protected]:/home/backup/2016/01 /home/data
选项
-v, --verbose 详细模式输出。
-q, --quiet 精简输出模式。
-c, --checksum 打开校验开关,强制对文件传输进行校验。
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-r, --recursive 对子目录以递归模式处理。
-R, --relative 使用相对路径信息。
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀。
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
-l, --links 保留软链结。
-L, --copy-links 想对待常规文件一样处理软链结。
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。
--safe-links 忽略指向SRC路径目录树以外的链结。
-H, --hard-links 保留硬链结。
-p, --perms 保持文件权限。
-o, --owner 保持文件属主信息。
-g, --group 保持文件属组信息。
-D, --devices 保持设备文件信息。
-t, --times 保持文件时间信息。
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间。
-n, --dry-run现实哪些文件将被传输。
-w, --whole-file 拷贝文件,不进行增量检测。
-x, --one-file-system 不要跨越文件系统边界。
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
-e, --rsh=command 指定使用rsh、ssh方式进行数据同步。
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
--delete 删除那些DST中SRC没有的文件。
--delete-excluded 同样删除接收端那些被该选项指定排除的文件。
--delete-after 传输结束以后再删除。
--ignore-errors 及时出现IO错误也进行删除。
--max-delete=NUM 最多删除NUM个文件。
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
--force 强制删除目录,即使不为空。
--numeric-ids 不将数字的用户和组id匹配为用户名和组名。
--timeout=time ip超时时间,单位为秒。
-I, --ignore-times 不跳过那些有同样的时间和长度的文件。
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0。
-T --temp-dir=DIR 在DIR中创建临时文件。
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份。
-P 等同于 --partial。 --progress 显示备份过程。
-z, --compress 对备份的文件在传输时进行压缩处理。
--exclude=PATTERN 指定排除不需要传输的文件模式。
--include=PATTERN 指定不排除而需要传输的文件模式。
--exclude-from=FILE 排除FILE中指定模式的文件。
--include-from=FILE 不排除FILE指定模式匹配的文件。
--version 打印版本信息。
--address 绑定到特定的地址。
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
--port=PORT 指定其他的rsync服务端口。
--blocking-io 对远程shell使用阻塞IO。
-stats 给出某些文件的传输状态。
--progress 在传输时现实传输过程。
--log-format=formAT 指定日志文件格式。
--password-file=FILE 从FILE中得到密码。
--bwlimit=KBPS 限制I/O带宽,KBytes per second。
-h, --help 显示帮助信息。
echo 'content test' | mail -s "title test" [email protected]
在ubuntu更新时,出现错误E: Some index files failed to download, they have been ignored, or old ones used inst
http://www.ilovn.com/topic/ubuntu-updat … used-inst/
在ubuntu更新时
执行命令
sudo apt-get update
出现错误E: Some index files failed to download, they have been ignored, or old ones used instead
可以将目录下/var/lib/apt/lists/partial/所有的文件清掉
$ sudo rm /var/lib/apt/lists/* -vf
再次运行apt-get update
关于本脚本:
一键安装 ShadowsocksR 服务端。
ShadowsocksR 协议插件文档
默认配置:
服务器端口:自己设定(如不设定,默认为 8989)
密码:自己设定(如不设定,默认为 teddysun.com)
加密方式:自己设定(如不设定,默认为 aes-256-cfb)
协议(Protocol):自己设定(如不设定,默认为 origin)
混淆(obfs):自己设定(如不设定,默认为 plain)
客户端下载:
https://github.com/iMeiji/shadowsocks_i … s/tag/0.13
使用方法:
使用root用户登录,运行以下命令:
wget --no-check-certificate https://raw.githubusercontent.com/teddy … wsocksR.sh
chmod +x shadowsocksR.sh
./shadowsocksR.sh 2>&1 | tee shadowsocksR.log
安装完成后,脚本提示如下:
Congratulations, ShadowsocksR server install completed!
Your Server IP :your_server_ip
Your Server Port :your_server_port
Your Password :your_password
Your Protocol :your_protocol
Your obfs :your_obfs
Your Encryption Method:your_encryption_method
Welcome to visit:https://shadowsocks.be/9.html
Enjoy it!
卸载方法:
使用 root 用户登录,运行命令:./shadowsocksR.sh uninstall
安装完成后即已后台启动 ShadowsocksR ,运行:/etc/init.d/shadowsocks status
可以查看 ShadowsocksR 进程是否已经启动。
本脚本安装完成后,已将 ShadowsocksR 自动加入开机自启动。
使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status
配置文件路径:/etc/shadowsocks.json
日志文件路径:/var/log/shadowsocksr.log
代码安装目录:/usr/local/shadowsocks
如果你想修改配置文件,请参考:
https://github.com/iMeiji/shadowsocks_i … ig.json.md
配置文件各项说明
各选项说明(注意,你应该修改使用initcfg.sh脚本初始化后的user-config.json):
Name Explanation 中文说明
server the address your server listens 监听地址
server_ipv6 the ipv6 address your server listens ipv6地址
server_port server port 监听端口
local_address the address your local listens 本地地址
local_port local port 本地端口
password password used for encryption 密码
timeout in seconds 超时时间
udp_timeout in seconds UDP链超时时间
udp_cache cache size UDP链缓冲区大小
method default: "aes-256-cfb", see Encryption 加密方式
protocol default:"origin" 协议插件,默认"origin"
protocol_param default:"" 协议插件参数,默认""
obfs default:"tls1.2_ticket_auth_compatible" 混淆插件,默认"tls1.2_ticket_auth_compatible"
obfs_param default:"" 混淆插件参数,默认""
redirect default:"" 重定向参数,默认""
dns_ipv6 default:false 是否优先使用IPv6地址,有IPv6时可开启
fast_open use TCP_FASTOPEN, true / false 快速打开(仅限linux客户端)
workers number of workers, available on Unix/Linux 线程(仅限linux客户端)
verbose display verbose debug info 显示调试信息
connect_verbose_info display connection verbose info 显示连接信息
forbidden_ip forbidden IP set for outbound 阻止连接到此IP列表
forbidden_port forbidden port set for outbound 阻止连接到此端口列表
ignore_bind not bind the IP set 不绑定的IP列表
out_bind force bind this IPv4 IP 强制绑定此IPv4地址
out_bindv6 force bind this IPv6 IP 强制绑定此IPv6地址
additional_ports additional ports for multiuser mode 多用户模式下配置额外端口
speed_limit_per_con rate limit for each connection 单连接限速,单位KB
speed_limit_per_user rate limit for each user 单用户限速,单位KB
其中各protocol与obfs介绍参见:
注:客户端的protocol和obfs配置必须与服务端的一致,除非服务端配置为兼容插件。
redirect参数说明:
值为空字符串或一个列表,若为列表示例如 "redirect":["bing.com", "cloudflare.com:443"], 作用是在连接方的数据不正确的时候,把数据重定向到列表中的其中一个地址和端口(不写端口则视为80),以伪装为目标服务器。
dns_ipv6参数说明:
为true则指定服务器优先使用IPv6地址。仅当服务器能访问IPv6地址时可以用,否则会导致有IPv6地址的网站无法打开。
一般情况下,只需要修改以下五项即可:
"server_port":8388, //端口
"password":"password", //密码
"protocol":"origin", //协议插件
"obfs":"http_simple", //混淆插件
"method":"aes-256-cfb", //加密方式
多端口配置
如果要多个用户一起使用的话,请写入以下配置:
{
"server":"0.0.0.0",
"server_ipv6": "[::]",
"local_address":"127.0.0.1",
"local_port":1080,
"port_password":{
"80":"password1",
"443":"password2"
},
"timeout":300,
"method":"aes-256-cfb",
"protocol": "auth_sha1_compatible",
"protocol_param": "",
"obfs": "http_simple_compatible",
"obfs_param": "",
"redirect": "",
"dns_ipv6": false,
"fast_open": false,
"workers": 1
}
按照格式修改端口和密码:
"80":"password1", //端口和密码1
"443":"password2" //端口和密码2
},
如果要为每个端口配置不同的混淆协议,请写入以下配置:
{
"server":"0.0.0.0",
"server_ipv6":"::",
"local_address":"127.0.0.1",
"local_port":1080,
"port_password":{
"8388":{"protocol":"auth_simple", "password":"abcde", "obfs":"http_simple", "obfs_param":""},
"8389":{"protocol":"origin", "password":"abcde"}
},
"timeout":300,
"method":"aes-256-cfb",
"protocol": "auth_sha1_compatible",
"protocol_param": "",
"obfs": "http_simple_compatible",
"obfs_param": "",
"redirect": "",
"dns_ipv6": false,
"fast_open": false,
"workers": 1
}
按格式修改端口、密码以及混淆协议。也可以和以前的格式混合使用,如果某个端口不配置混淆协议,则会使用下面的默认"obfs"配置。
注意事项:
本脚本没有对防火墙(IPv4 是 iptables,IPv6 是 ip6tables)进行任何设置。
因此,在安装完毕,如果你发现连接不上,可以尝试更改防火墙设置或关闭防火墙。
Python3 安装
yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
yum install -y libffi-devel openssl zlib*
wget https://www.python.org/ftp/python/3.7.2 … 7.2.tar.xz
tar -xvJf Python-3.7.2.tar.xz
cd Python-3.7.2
编辑:Modules/Setup 去掉第211到214行中的# (内容是SSL)
./configure --prefix=/usr/local/python3 --enable-optimizations --with-ssl
make && make install
ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
pip3 install --timeout=3600 Pillow pylibmc captcha jinja2 sqlalchemy psd-tools django-pylibmc django-simple-captcha
mkdir /home/seafile
tar -xzf seafile-server_*
mv seafile-server_* /home/seafile
./setup-seafile-mysql.sh
/home/seafile/seafile-server-latest/seafile.sh restart
/home/seafile/seafile-server-latest/seahub.sh restart