首页 文章 精选 留言 我的

精选列表

搜索[Linux],共10000篇文章
优秀的个人博客,低调大师

Linux基础之bash脚本进阶篇-循环语句(for,while,until)

20160909 补充break与continue的区别 什么是循环语句、死循环? 循环语句:将一段代码重复执行0、1或多次。 到底要重复运行多少次?以及我们如何设定循环语句的重复次数? 为了解决上面的问题于是就有了进入条件与退出条件。 进入条件:条件满足时进入循环。 退出条件:不符合条件退出循环。 一种特殊的循环:死循环 死循环:在编程中,一个无法靠自身的控制终止的循环称为"死循环"。死循环的出现有两种情况: 1、因程序需要刻意写的;2、因程序员的失误造成的。 第二种的死循环通常会造成比较严重的程序错误,甚至会因此而影响物理机。因此死循环的使用需要合理的设计。 实验环境CentOS7.2 本文重要的三个循环语句:for、while、until ……………………………………………………………………………………………………………………… for循环 for语句的使用格式: forNAME in LIST(列表);do 循环体 done 列表生成方式: (1)整数列表 {start..end} $(seq start [[step]end]) (2)glob /etc/rc.d/rc3.d/K* (3)命令 ……………………………………………………………………………………………………………………… 下面以一个例子看看for的具体作用 示例:计算1+2+...+10的值 1 2 3 4 5 6 7 8 9 #!/bin/bash #sumthevalueof"1+2+...+10" #authorchawan #date:20160906 declare -i sum =0 for x in {1..10}; do let sum +=$x done echo "Thesumis:$sum" 运行脚本0906-1结果如下 1 2 [root@dockerhmworks] #sh0906-1 The sum is:55 上面使用了第一种的整数列表中的第一种形式,这里如果是“1+2+...+n”这种形式那么{start..end}就不再适用,此时就只能使用$(seq start [[step]end])。下面再举一个例子说明 示例:计算“1+2+...+n”的值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/bash #sum“1+2+...+n” #authorchawan #date:20160906 declare -i sum =0 #以交互的方式输入一个正整数 read -p "Pleaseinsetanumber:" num #判断输入的数是否为空,为空则提示并退出 [-z$num]&& echo "Pleaseinputanumber!" && exit 1 #判断输入的是否是正整数,若是则执行循环,若不是提示输入正整数并退出 if [[$num=~^[1-9][0-9]{0,}$]]; then for i in {1..$num}; do #foriin`seq1$num`;do let sum +=$i #sum=$[$sum+$i]这种方式也可以不过不够简练 done else echo "Error:pleaseinputapositiveinteger" && exit 2 fi #显示最后的和 echo "Thesumis:$sum" 下面执行该脚本 1 2 3 4 [root@dockerhmworks] #sh0906-2 Pleaseinsetanumber:8 0906-2:行14: let : sum +={1..8}:语法错误:期待操作数(错误符号是 "{1..8}" ) The sum is:0 该结果说明{start..end}形式不适用于有变量出现的情况,既然这个不行就来试试$(seq start [[step]end]) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/bash #sum“1+2+...+n” #authorchawan #date:20160906 declare -i sum =0 #以交互的方式输入一个正整数 read -p "Pleaseinsetanumber:" num #判断输入的数是否为空,为空则提示并退出 [-z$num]&& echo "Pleaseinputanumber!" && exit 1 #判断输入的是否是正整数,若是则执行循环,若不是提示输入正整数并退出 if [[$num=~^[1-9][0-9]{0,}$]]; then for i in ` seq 1$num`; do let sum +=$i #sum=$[$sum+$i] done else echo "Error:pleaseinputapositiveinteger" && exit 2 fi #显示最后的和 echo "Thesumis:$sum" 执行该脚本 1 2 3 4 5 6 [root@dockerhmworks] #sh0906-2 Pleaseinsetanumber:10 The sum is:55 [root@dockerhmworks] #sh0906-2 Pleaseinsetanumber:100 The sum is:5050 该结果表明$(seq start [[step]end])适用性更好,因此一般建议使用它。 列表的glob与命令这两种就不再具体演示。大家感兴趣可以自己尝试下做个实验体会体会。 ……………………………………………………………………………………………………………………… while循环 while语句使用格式: whileCONDITION;do 循环体 done CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环; 因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正; 进入条件:CONDITION为true; 退出条件:CONDITION为false ……………………………………………………………………………………………………………………… 示例:计算1+2+...+10的值 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash #sumthevalueof"1+2+...+10"while #authorchawan #date:20160906 #为了严谨起见,事先声明变量sum及i为整数型 declare -i sum =0 declare -ii=1 while [$i- le 10]; do let sum +=$i #sum=$[$sum+$i]的简写形式 let i++ #不断修正变量体 done echo "Thesumis:$sum" 执行脚本,查看其是否正确执行 1 2 [root@dockerhmworks] #sh0906-3 The sum is:55 while与for的不同在于: 1、不需要列表,因此可以大大节省内存空间,因为for如果列表很大会占用较多内容空间,对系统性能会造成影响,所以此时while的优越性就显现出来,它不需要占用很多内存空间,只需要两个变量的空间及做加法即可。 2、while需要修正体来不断修正变量,最终在符合退出条件时结束循环。 ……………………………………………………………………………………………………………………… until循环 until语句使用格式: untilCONDITION;do 循环体 done CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“false”,则执行一次循环;直到条件测试状态为“true”终止循环; 因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正; 进入条件:CONDITION为false; 退出条件:CONDITION为true until的用法同while,唯一的区别在于进入循环与退出循环的条件相反。 以相同的例子来体会二者的区别 ……………………………………………………………………………………………………………………… 示例:计算1+2+...+10的值 1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash #sumthevalueof"1+2+...+10"until #authorchawan #date:20160906 declare -i sum =0 declare -ii=1 until [$i-gt10]; do let sum +=$i let i++ done echo "Thesumis:$sum" 执行脚本,查看结果是否正确输出 1 2 [root@dockerhmworks] #sh0906-4 The sum is:55 通过比较while与until的唯一差别就在于判断条件。这两者其实算是同一种循环语句,只是进入及退出循环的条件正好相反。 循环控制语句(用于循环体中) 1、continue[N]:提前结束第N层的本轮循环,而直接进入下一轮判断; 其使用格式: whileCONDTIITON1;do CMD1 ... ifCONDITION2;then continue fi CMDn ... done ……………………………………………………………………………………………………………………… 示例:求100以内所有偶数之和;要求循环遍历100以内的所正整数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash #求100以内所有偶数之和;要求循环遍历100以内的所正整数 #authorchawan #date:20160906 declare -ii=1 declare -i sum =0 while [$i- le 100]; do let i++ #如果为奇数则跳过该循环 if [$[${i}%2]- eq 1]; then continue fi let sum +=$i done echo "Theevennumbersum:$sum" 执行脚本,查看结果是否正确显示 1 2 [root@dockerhmworks] #sh0906-5 Theevennumber sum :2550 之前我写这个脚本时是这么写的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash #求100以内所有偶数之和;要求循环遍历100以内的所正整数 #authorchawan #date:20160906 declare -ii=1 declare -i sum =0 while [$i- le 100]; do let sum +=$i #如果为奇数则跳过该循环,直接进入下一轮判断后面的程序不再执行 if [$[${i}%2]- eq 1]; then continue fi let i++ done echo "Theevennumbersum:$sum" 这就是我个人由于对continue的理解不够准确而造成的死循环。 由于continue是跳过其所在循环,直接进入下一轮判断,后面的语句都不再执行。 当时没注意这点所以错误地把i++放在后面,这就导致若i起始值为奇数那么它就一直在重复执行。 这里只要将let sum+=$i与let i++调换为止即可正确执行。 ……………………………………………………………………………………………………………………… 2、break[N]:提前结束循环; 其使用格式: whileCONDTIITON1;do CMD1 ... ifCONDITION2;then break fi CMDn ... done break的使用通常是与死循环同时出现的,下面来介绍如何创建死循环 创建死循环: whiletrue;do 循环体 done untilfalse;do 循环体 done ……………………………………………………………………………………………………………………… 示例:每隔3秒钟到系统上获取已经登录的用户的信息;如果docker登录了,则记录于日志中,并退出; 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash #每隔3秒钟到系统上获取已经登录的用户的信息;如果docker用户登录,则记录于日志中,并退出脚本 #authorchawan #date:20160906 while true ; do if who | grep "^docker\>" $> /dev/null ; then break fi sleep 3 echo "dockerisnotlogin" done echo "dockerloggedon." >> /tmp/user .log 运行脚本 1 2 3 4 5 6 7 [root@dockerhmworks] #sh0906-6 dockerisnotlogin dockerisnotlogin dockerisnotlogin dockerisnotlogin dockerisnotlogin dockerisnotlogin 为了验证该脚本,下面我们使用docker用户登陆 docker用户登陆后查看/tmp/user.log文件 ######################################################################################### break与continue语句的区别: break语句和continue语句都可以位于各种循环体内,用于控制当前的循环流程。但,break语句是直接退出当前的循环结构,转向执行循环体后面的语句;而continue语句则只是跳过当前循环体中continue语句后面的语句,转向当前循环体的起始位置,重新执行下一次循环,并没有退出当前的循环结构。 这是两者最本质的区别:break跳出当前循环,continue没有跳出当前循环。 循环语句的特殊用法(while及for) while循环的特殊用法(遍历文件的每一行): 其使用格式: whileread line;do 循环体 done< /PATH/FROM/SOMEFILE 依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line ……………………………………………………………………………………………………………………… 示例:找出其ID号为偶数的所有用户,显示其用户名及ID号; 1 2 3 4 5 6 7 8 9 10 #!/bin/bash #找出其ID号为偶数的所有用户,显示其用户名及ID号 #authorchawan #date:20160906 while read line; do if [$[` echo $line| cut -d:-f3`%2]- eq 0]; then echo -e-n "username:`echo$line|cut-d:-f1`\t" echo "uid:`echo$line|cut-d:-f3`" fi done < /etc/passwd 运行脚本 ……………………………………………………………………………………………………………………… for循环的特殊格式: for((控制变量初始化;条件判断表达式;控制变量的修正表达式));do 循环体 done 控制变量初始化:仅在运行到循环代码段时执行一次; 条件判断表达式:在什么条件下进行循环; 控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断; 示例:求100以内所正整数之和 1 2 3 4 5 6 7 8 9 #!/bin/bash #求100以内所正整数之和 #authorchawan #date:20160906 declare -i sum =0 for ((i=1;i<=100;i++)); do let sum +=$i done echo "Thesumis:$sum" 运行脚本,查看结果是否正确 1 2 [root@dockerhmworks] #sh0906-8 The sum is:5050 for的这种格式减少了代码量,看着更简洁,不过其限制是只适用于有数字出现的循环,若是对某目录下的所有文件进行某种循环的执行就不适应了。 循环嵌套 在本文的最后再以一题体会下循环嵌套的神奇 示例:打印九九乘法表 1 2 3 4 5 6 7 8 9 10 #!/bin/bash #打印九九乘法表 #authorchawan #date:20160906 for ((j=1;j<=9;j++)); do for ((i=1;i<=j;i++)) do echo -e-n "${i}X${j}=$[$i*$j]\t" done echo done 我在刚刚接触循环嵌套时各种晕,循环嵌套不是没有目的的乱用,而是根据自己的需求有目的的使用,比如要打印99乘法表,开始要分析99乘法表的规律,分析后我们发现它横行是连续的,因此要用到一个循环(通常在遇到连续的内容都会用到循环)它的列也是连续的,因此又用到一个循环,而99乘法表又是由两个变化的量构成,综上我们就可以确定,需要使用两个变量,这两个变量分别要用到循环,而一个变量又受到另一个变量的限制,因此这个受限的变量就是被嵌套的主。问题分析到这里,我们解决这个问题要用到的工具都找出来了:两个变量,每个变量对应一个循环,同时一个变量受到另一个变量的限制,也就是说它需要在其循环内进行嵌套。 下面就是靠自己去使用工具解决问题了。我相信大家这点应该都不成问题,问题就分析到这里。 小结: 本文主要介绍什么是循环,死循环,bash常用的三种循环语句for、while、until及循环控制语句continue、break 在本文结尾又介绍了while的特殊用法(遍历文件中的每一行),for的c语言格式。 至于什么时候用for什么时候用while需要自己在实际写脚本中细细比较,鉴于本人也是新手,这里就算想细说也只能望洋兴叹。 本文转自 紫色的茶碗 51CTO博客,原文链接:http://blog.51cto.com/chawan/1847024,如需转载请自行联系原作者

优秀的个人博客,低调大师

linux命令练习:通过修改用户文档手动添加用户

手动添加用户hive,基本组为hive(5000),附加组为mygroup 1、vim /etc/group 手动在组配置文档中添加hive组信息,并把mygroup作为hive用户的附加组 mygroup:x:5001:hive 把hive添加到mygroup组信息后面,作为附加组 hive:x:5000: 添加hive组信息 2、vim /etc/gshadow 手动在组密码配置文档中添加hive组信息 hive:!:: 添加hive组密码信息 3、vim /etc/passwd 手动在用户配置文档中添加hive用户信息 hive:x:5000:5000:HIVE:/home/hive:/bin/bash 添加hive用户信息 4、vim /etc/shadow 手动在用户密码配置文档中添加hive用户信息 hive:!!:17088:0:99999:7::: 此处17088的计算方法下面有说明 附:如何把最后一次密码修改日期变成天数方法如下 [root@xuelinux ~]# date +%s 先把当天日期以秒数显示出来 1476431406 [root@xuelinux ~]# bc 计算器命令 bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 1476431406/86400 用当天的日期的秒数除以一天的秒数,一天24*3600秒=86400秒 17088 计算出当天日期距离1970年的天数为17088 5、cp -R /etc/skel /home/hive 建立hive用户的家目录 [root@xuelinux test]# cp -R /etc/skel /home/hive [root@xuelinux test]# ls -l /home drwx------. 3 donggen donggen 4096 9月 13 23:26 donggen drwxr-xr-x. 3 root root 4096 10月 14 15:56 hive hive家目录已经建好 6、chown -R hive.hive /home/hive 把hive家目录及其内的内容的用户和组都修改为hive [root@xuelinux test]# chown -R hive.hive /home/hive [root@xuelinux test]# ls -la /home/hive drwxr-xr-x. 3 hive hive 4096 10月 14 15:56 . drwxr-xr-x. 7 root root 4096 10月 14 15:56 .. -rw-r--r--. 1 hive hive 18 10月 14 15:56 .bash_logout -rw-r--r--. 1 hive hive 176 10月 14 15:56 .bash_profile -rw-r--r--. 1 hive hive 124 10月 14 15:56 .bashrc drwxr-xr-x. 2 hive hive 4096 10月 14 15:56 .gnome2 7、chmod -R go= /home/hive 把hive家目录的组和其他人的权限设置为空 [root@xuelinux test]# chmod -R go= /home/hive [root@xuelinux test]# ls -al /home/hive drwx------. 3 hive hive 4096 10月 14 15:56 . drwxr-xr-x. 7 root root 4096 10月 14 15:56 .. -rw-------. 1 hive hive 18 10月 14 15:56 .bash_logout -rw-------. 1 hive hive 176 10月 14 15:56 .bash_profile -rw-------. 1 hive hive 124 10月 14 15:56 .bashrc drwx------. 2 hive hive 4096 10月 14 15:56 .gnome2 至此hive用户就手动添加成功,但是此时还无法通过终端登录hive用户,需给hive设置密码 可以通过passwd设置,这里说下如何通过手动添加密码到shadow文档中。 8、手动添加hive密码信息到shadow用户密码配置文档中 先通过openssl passwd -1 -salt 先通过openssl命令生成密码加密字符串-1此处为数字1 openss1 passwd -l -salt [root@xuelinux test]# openssl passwd -1 -salt '12345678' Password: $1$12345678$0ME5N6oDyoEAwUp7b5UDM/ [root@xuelinux test]# vim /etc/shadow hive:$1$12345678$0ME5N6oDyoEAwUp7b5UDM/:17088:0:99999:7::: 把生成的密码加密字符串复制到用户密码配置文档中 至此完整的hive用户就手动添加成功,并能通过远程登录。 本文转自wang650108151CTO博客,原文链接:http://blog.51cto.com/woyaoxuelinux/1861960,如需转载请自行联系原作者

优秀的个人博客,低调大师

Linux运维工程师笔试题第十三套

这套题的出处是http://blog.51cto.com/nolinux/1670406 ,看到了周末闲着没事就做一做,答案都是我结合自己的工作得到的,不一定百分百准确,现在拿出来跟各位分享一番。 1、请写出五种系统性能分析工具,并简述其作用和特点 [我的答案] top、free、vmstat、iostat、perf等等等等,如果你想装逼,可以回答fio,blktrace,oprofile。 具体的作用和特点这里不多说了,但是我着重要推荐vmstat,很实用很棒的一个命令。可以去移步看看https://rorschachchan.github.io/2018/01/03/从vmstat命令里看服务器瓶颈/这篇文章。 2、请写出web服务器的调优要点 [我的答案]以nginx为例,个人总结有如下几个要点: 1)尽可能的少用http,因为http是有开销的; 2)尽可能的使用CDN; 3)添加Expire/Cache-Control头,这个头是缓存用的,可以缓存图片和flash那样不轻易更改的文件,减少访问时间; 4)启动gzip压缩,这个没啥好说的了; 5)尽可能少的重定向,重定向是需要时间的,增加一次重定向就会多一次web需求; 6)如果可以,把ajax也做缓存; 7)减少dns查询,很多网页会有外站的广告,这些广告也是会启动dns查询的,所以如果不缺钱,减少这种广告; 8)调好服务器里的TCP协议栈,这个无论是web服务器还是应用服务器都是必须的; 3、请写出你知道或使用过的nginx扩展模块(注意标注知道和使用) [我的答案] 随便说几个我使用过的,这玩意到时候结合工作过的情况说说吧: Nginx负载均衡模块:nginx-upstream-fair 非阻塞访问redis模块:redis2-nginx-module 分布式图片实时动态压缩:ngx-fastdfs4、请简述你了解的自动化配置管理工具特点和运行原理 [我的答案]我用的最多的就是ansible和saltstack,这俩都是python的,对于我这个半路出家的更亲切。 ansible基于SSH协议传输数据,不用装agent,配置比较简单,对windows支持惨不忍睹; saltstack使用消息队列zeroMQ传输数据,如果1000台以上的话它速度比ansible还要快,要安装agent,对windows支持同样惨不忍睹; 5、目前,有一个文件,内容如下:172.16.100.1172.16.100.2172.16.100.3172.16.100.4 请使用while和ssh命令,登录文件内的ip并执行hostname命令 [我的答案]这个还真没有什么思路,不过我觉得是要搭配“<”输入重定向的吧。 PS,为啥不用ansible...哪怕pssh也可以啊! 6、请使用awk命令将如下两份文件中名字相同的两行合并起来 A文件:大广州 21岁广州大 23岁州广大 22岁广州大 24岁 B文件:广州大 男大广州 男州广大 男广州大 男 输出效果:`大广州 21岁 男` [我的答案]#awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}'B文件名A文件名 PS,做完这道题,我已经不认识“广”“州”这两个字了...7、请使用绘图的方式简述TCP/IP三次握手和四次断开的交互过程 [我的答案]这种图满大街都是了,我这个灵魂画师在这里就不污染各位的眼睛,不过这里推荐各位去看一篇文章:https://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==&mid=2651160450&idx=2&sn=1128438fa5287b6cee503880698642b2&scene=21 对原理讲的浅显易懂。 多说一句,网易招聘java的时候也问这个问题,不过他们问的是“为什么要三次握手?” 8、请根据你的理解,简述高可用服务体系的相关组件,并列举该组件的具体实现服务名字 [我的答案] 我觉得这个题是要问一些架构上的东西,以我工作环境为例: 统一配置:zookeeper、Consul、Etcd+Confd(这俩比较常见于动态管理nginx) 前端展示:nginx 消息队列:activemq、kafka 读写分离中间件:atlas 日志分析:elk 简述我就不简了,自己百度一下。9、请根据你的理解,简述负载均衡的实现方式 [我的答案]负载均衡主要分为两种,硬件(F5)和软件(NGINX、Haproxy、LVS),硬件效果比较牛逼,它是把4-7层的负载均衡功能做到一个硬件里面,但是价格昂贵最近用的越来越少了。 软件的负载均衡又分两种,四层和七层:四层是在IP/TCP协议栈上把网络包的IP地址和端口进行修改,达到转发的目的;七层就是在应用层里把HTTP请求、URL等具体的应用数据发送到具体的服务器上。四层的效率比七层的高,四层一般安排在架构的前端,七层一般就是在具体服务器的前端。 软件负载均衡比较常见的几个分配方式如下: 轮询:访问请求依序分发给后端服务器; 加权轮询:访问请求依序分发后端服务器,服务器权重越高被分发的几率也越大; 最小连接数: 将访问请求分发给当前连接数最小的一台后端服务器,服务器权重越高被分发的几率也越大;10、请根据你的理解,简述数据迁移工具和数据存储服务有哪些以及相关特点 [我的答案]由于我公司主要都放在了阿里云,数据库用过的就这么几个:mysql、redis和elasticsearch。对于Storm和Hadoop这俩我还是初学者。 mysql:关系型数据库; elasticsearch:全文检索框架,这玩意逐渐向一个数据库靠拢了; redis:键值储存数据库; mysql的数据迁移最常见的就是mysqldump,但是要注意使用不当会锁表; redis的数据迁移最稳妥的方法就是主从同步:在slave端启动redis,然后执行#slaveof master机器IP地址 6379,然后使用#info的时候查看#master_link_status如果是up那就是OK了,再执行#slaveof no one,提示OK就是OK了; Elasticsearch的数据迁移工具就是Elasticsearch-Exporter,不过我对它仅仅只是了解,用的并不多; 最后的最后,如果您觉得本文对您升职加薪有帮助,那么请不吝赞助之手,刷一下下面的二维码,赞助本人继续写更多的博文! 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/2058818

优秀的个人博客,低调大师

查找谁在破解你linux服务器的密码?

首先知道,系统的用户登陆日志文件是/var/log/secure,所以分析统计这文件就可以 #tail -n50 secure-20161219 (可以看到大量Failed password的记录) Dec 19 03:41:35 localhost sshd[9014]: Failed password for root from 59.63.166.84 port 26368 ssh2 Dec 19 03:41:36 localhost sshd[9014]: Failed password for root from 59.63.166.84 port 26368 ssh2 Dec 19 03:41:37 localhost sshd[9014]: Failed password for root from 59.63.166.84 port 26368 ssh2 Dec 19 03:41:37 localhost sshd[9014]: Failed password for root from 59.63.166.84 port 26368 ssh2 Dec 19 03:41:38 localhost sshd[9014]: Failed password for root from 59.63.166.84 port 26368 ssh2 Dec 19 03:41:38 localhost sshd[9014]: error: maximum authentication attempts exceeded for root from 59.63.166.84 port 26368 ssh2 [preauth] Dec 19 03:41:38 localhost sshd[9014]: Disconnecting: Too many authentication failures [preauth] Dec 19 03:41:39 localhost sshd[9016]: Failed password for root from 59.63.166.84 port 32555 ssh2 我们要过滤出Failed行并显示对他的ip地址做统计排序,找到攻击最大的几个 #awk '/Failed password/{print $(NF-3)}' secure-20161219|sort|uniq -c|sort -nrk1|head -20 68652 218.65.30.25 34326 218.65.30.53 21201 218.87.109.154 18065 112.85.42.103 17164 112.85.42.99 17163 218.87.109.151 17163 218.87.109.150 17163 218.65.30.61 17163 218.65.30.126 17163 218.65.30.124 17163 218.65.30.123 17163 218.65.30.122 17163 182.100.67.120 17163 182.100.67.119 17163 112.85.42.124 17163 112.85.42.107 3289 222.186.50.206 3265 219.133.29.16 3206 111.73.46.156 2479 117.21.226.189 (解释下# awk '/Failed password/{print $(NF-3)}' secure-20161219|sort|uniq -c|sort -nrk1|head -20) awk根据Failed password匹配出了破解记录,然后取倒数第四列的ip,取到的结果先进行排序(目的是为了下一个uniq函数),uniq -c去重并计算数目(只支持比较连续的行所以前面用sort),对去重后的数据按照第一列(-k1)进行数字(n)倒序(r),最后只取前20行 第二种方法(awk数组方式): #awk '/Failed password/{d[$(NF-3)]++}END{for(i in d) print i,d[i]}' secure-20161219|sort -nrk2|head -20 218.65.30.25 68652 218.65.30.53 34326 218.87.109.154 21201 112.85.42.103 18065 112.85.42.99 17164 218.87.109.151 17163 218.87.109.150 17163 218.65.30.61 17163 218.65.30.126 17163 218.65.30.124 17163 218.65.30.123 17163 218.65.30.122 17163 182.100.67.120 17163 182.100.67.119 17163 112.85.42.124 17163 112.85.42.107 17163 222.186.50.206 3289 219.133.29.16 3265 111.73.46.156 3206 117.21.226.189 2479

优秀的个人博客,低调大师

笔记:Linux下MooseFS1.6特点、原理图、生产设计

MooseFS1.6文件系统有以下特点: 分布式存储 方便容量扩充,可以通过增加硬盘或数据存储服务器(Trunk server)实现 元数据服务器(Master Server)的高可用性(用MetaLogger服务器实现) 文件对象级的高可用性(可以任意设定一个文件的拷贝份数),提高读并发数 支持文件对象的回收站功能,已删除的文件在指定的时间内可以恢复 支持快照功能,这个功能一般只在高端存储设备上才会有 对于小文件的读性能更好 架构示图: 生产中我们设计: 一台独立的性能强健的元数据服务器,一台元数据日志服务,若干台存储块服务器。出于元数据服务器的高可用考虑,可以增加一台元数据服务器的备机,手动去切换,或者通过Drbd+Corosync+Pacemaker实现自动切换。 出于安全性考虑,服务器只接内网。 要考虑服务器的监控,可以通过自带的微型服务器程序mfscgiserver来实现。 并不是所有的业务都适合MFS,因为增加存储块服务器的时候,单一客户端的读写性能都有下降。并发客户端的读写性能都有所提升。 关于异地备份,还不是很清楚。 本文转自xiaoyuwang 51CTO博客,原文链接:http://blog.51cto.com/wangxiaoyu/536907,如需转载请自行联系原作者

优秀的个人博客,低调大师

linux查找所有文件中某个字符串

查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xargs grep -ri "IBM" -l (1)find命令的一般形式 find pathname -options [-print -exec -ok] pathname :find命令所查找的目录路径。如用"."来表示当前的目录,用/来表示系统根目录 -print :find命令将匹配的文件输出到标准输出 -exec: find命令对匹配的文件执行该参数所给出的shell命令,相应的命令形式为 'command'{} \; (注意{}和\之间的空格) -ok 和 -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 options有如下几种: -name :按照文件名查找文件 -perm :按照文件权限来查找文件 -user :按照文件属主来查找文件 -group :按照文件所属的组来查找文件 -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项,但它们都和-mtime选项相似。 -size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。 -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在 -newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件 -depth 先查找指定目录有无匹配文件,若无则再在子目录中查找 -type 查找某一类型的文件,如 b :块设备文件 d:目录 e:字符设备文件 p;管道文件 l:符号链接文件 f:普通文件 (3)find命令举例 find -name "*.txt" -print 查找txt结尾的文件并输出到屏幕上 find /cmd ".sh" -print 查找/cmd目录下所有sh文件,并输出 find . -perm 755 -print 查找当前目录下权限为755的文件,并输出 find `pwd` -user root -print 查找当前目录下属主为root的文件,并输出 find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件 find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件 find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件 find /var -newer "myfile1" ! -newer "myfile2" -print 查找/var目录下比myfile1新,但是比myfile2旧的所有文件。 find /var -type d -print 查找/var目录下所有目录 find /var -type l -print 查找/var目录下所有的符号链接文件。 find . -size +1000000c -print 查找当前目录下大于1000000字节的文件 find / -name "con.file" -depth -print 查找根目录下有无"con.file",若无则在其子目录中查找 find . -type f -exec ls -l {} \; 查找当前目录下是否有普通文件,若有则执行ls -l (4)xargs命令 在 使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec。不幸的是,有些系统对能够传递给exec的命 令长度有限制,这样find命令运行几分钟之后就算出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs的用处所在,特别是与 find命令一起使用,exec会发起多个进程,而xargs会多个,只有一个 find ./ -perm -7 -print | xargs chmod o-w 查找权限为7的文件并传递给chmod处理 (5)grep介绍.如果你想在当前目录下 查找"hello,world!"字符串,可以这样: grep -rn "hello,world!" * * : 表示当前目录所有文件,也可以是某个文件名 -r 是递归查找 -n 是显示行号 -R 查找所有文件包含子目录 -i 忽略大小写 下面是一些有意思的命令行参数: grep -i pattern files :不区分大小写地搜索。默认情况区分大小写, grep -l pattern files :只列出匹配的文件名, grep -L pattern files :列出不匹配的文件名, grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’), grep -C number pattern files :匹配的上下文分别显示[number]行, grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行, grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。 这里还有些用于搜索的特殊符号: \< 和 \> 分别标注单词的开始与结尾。 例如: grep man * 会匹配 ‘Batman’、‘manic’、‘man’等, grep '\<man' * 匹配‘manic’和‘man’,但不是‘Batman’, grep '\<man\>' 只匹配‘man’,而不是‘Batman’或‘manic’等其他的字符串。 '^':指匹配的字符串在行首, '$':指匹配的字符串在行尾, (6),xargs配合grep查找 find -type f -name '*.php'|xargs grep 'hello,world!'

优秀的个人博客,低调大师

解决Linux 下ping不通百度的解决方法

今天在学习DNS的时候遇到了一个问题,我的虚拟机能够ping通ip地址,却ping不通www.baidu.com www.qq.com等域名,先是出现了以下报错: 折腾了几个小时终于找到解决办法 1、首先查看虚拟机能否ping通外网可以ping网关试一下 ping 172.17.0.1 [plain]view plain copy 2、确保网关设置了 [plain]view plain copy vim /etc/sysconfig/network-scripts/ifcfg-eth1 [plain]view plain copy GATEWAY=172.17.0.1 DNS1=172.17.0.1 修改之后需要重启网络服务。centos6 : service network restart 3、确保有可用的域名服务器 cat /etc/resolv.conf 没有的话可以自己编辑一份 [plain]view plain copy vim /etc/resolv.conf nameserver 172.17.0.1 nameserver 114.114.114.114 这样一般就没问题了 但是我还是遇到了问题 应该还是网络的问题,我重启了网络服务,还是不行 于是查看了路由表,发现缺少一条默认路由记录 那好办那就加一条路由记录 发现加不上 只好清空路有记录 然后重启网络服务,再增加默认路由,然后可以解析出地址了 完。

优秀的个人博客,低调大师

linux下五种常见的格式的文件解压缩

.zip压缩命令(压缩文件和目录没有任何毛病): 常用压缩格式:.zip .gz .bz2 .tar.gz .tar.bz2 格式:zip 压缩文件名(可以不写压缩名,但是严格意义上区分压缩文件名) 源文件名 zip -r 压缩文件名 源文件名 压缩目录 解压缩: unzip 压缩文件 .gz压缩(压缩目录下的所有子文件 目录并不会压缩) gzip 源文件(自动以.gz为后缀,压缩后源文件会消失) 那么可以压缩为gz源文件不消失吗?没有直接命令达到该效果 但是,可以通过以下方式实现 gzip -c 源文件 > 压缩文件 gzip -r 源文件 压缩目录 #压缩目录下的所有子文件 目录并不会压缩 .gz解压缩 gzip -d 压缩文件 gunzip 压缩文件 .bz2格式压缩(不能压缩目录) bzip2 源文件 #压缩 不保留源文件 bzip2 -k 源文件 #压缩后保留源文件 .bz2格式解压缩 bzip2 -d 压缩文件 bunzip2 压缩文件 ---------------------以下两种压缩格式用的多 .tar.gz(不删除源文件,先打包为tar,再压缩目录,解决了目录不能压缩的问题) 打包文件 tar -cvf 打包文件名(*.tar) 源文件 -c 打包 -t 测试 只查看 -v -f .tar.gz解压缩 tar -xvf 打包文件名 -x 解打包 tar -zcvf 压缩文件(*.tar.gz) 源文件 #打包并压缩 指定解压缩位置 tar -jxvf 压缩文件 -C 目录 压缩多个文件 以空格分隔 .tar.bz2压缩 tar -jcvf 压缩文件(*.tar.bz2) 源文件 .tar.bz2解压缩 tar -jxvf 压缩文件(*.tar.bz2) 源文件

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。