马哥linux作业
===============================================
第十一周作业(老王视频)
1、详细叙述ansible的工作原理
1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg 2. 加载自己对应的模块文件,如command 3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件 4. 给临时文件+x执行权限 5. 执行并返回结果 6. 删除临时py文件,sleep 0退出
2、使用ansible在多台机器上添加用户
#ansible all -m user -a "name=mysql system=yes"
3、用ansible-playbook编译安装nginx服务
--- - hosts: all remote_user: root tasks: - name: Install Depend packages yum: name=pcre-devel - name: Install Depend packages yum: name=openssl-devel - name: Create Nginx User user: name=nginx system=yes shell=/sbin/nologin create_home=no - name: Copy Nginx_install_file unarchive: src=/tmp/nginx-1.14.2.tar.gz dest=/tmp - name: Install Nginx shell: chdir=/tmp/nginx-1.14.2 ./configure --prefix=/usr/local/nginx-1.14.2 --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module && make && make install - name: Touch Link FIle file: path=/usr/local/nginx src=/usr/local/nginx-1.14.2 state=link - name: Env shell: echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh && source /etc/profile.d/nginx.sh - name: Start Service shell: /usr/local/nginx/sbin/nginx - name: Enable Service shell: echo '/usr/local/nginx/sbin/nginx' >> /etc/rc.d/rc.local && chmod +x /etc/rc.d/rc.local
4、描述域名劫持的解决方法
第一步:关闭域名的泛解析,我们必须要有域名的管理帐号和密码,否则只能通过域名服务商的客服来解决了,当然后面一种办法比较浪费时间。进入了域名管理后台之后就可以点击我们的域名找到带*号的域名解析,删除掉就可以了。
第二步:举报大量垃圾页面,因为我们站长心里也清楚,那些垃圾页面都会成为我们网站的死链。所以我们要把这些死链都解决掉,我们在页面举报内容处写上网站被恶意泛解析就可以了,好的情况就是百度会迅速关注你的站点从而帮你大量的删除,不好的情况恐怕只能我们把那些垃圾页面一个个的举报掉了。
第三步:看到网站整体代码是否有改动,最后一步也就是解决了域名劫持之后,对自己的网站进行大检查,从而做到彻底的清楚垃圾页面,保证网站的安全性。
5、描述dns的递归查询
递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机
迭代查询:本地域名服务器(LDNS)向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次(LDNS)都是以客户机的身份去各个服务器查询
6、DNS工作原理详细解析
1、访问www.baidu.com域名时,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。 2、如果hosts里没有这个域名的映射,则查找本地DNS缓存,是否有这个网址映射关系,如果有,则直接返回,完成域名解析。 3、如果hosts与本地DNS缓存都没有相应的网址映射关系,首先会找网卡配置中TCP/IP参数的首选DNS服务器查询。 如果要查询的域名包含在DNS配置区域中,则返回解析结果给客户端,完成域名解析,此解析具有权威性。 如果要查询的域名不在DNS配置区域解析,但在该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。 4、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询。 如果未开启转发模式,本地DNS就把请求发至“根DNS服务器”,“根DNS服务器”收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP,本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找baidu.com域服务器,重复上面的动作,进行查询,直至找到www.baidu.com主机。 如果开启转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。 5、不管是本地DNS服务器使用的是转发还是根提示来查询,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
7、dns区域转发与全局转发区别与实现方法
正常情况下,当域名服务器无法在本地解析域名时,会向根域名服务器申请迭代查询。如果希望在本地没有查询到,而转向指定服务器进行查询时,就必须定义域名服务器的转发。需要注意的是被转发的域名服务器必须允许为当前服务器做递归。
域名服务器定义转发规则还分为两种转发,第一种为区域转发,第二种为全局转发。
- 区域转发
区域转发实际上就是转发对某特定区域的解析请求,例如在子域bj.ysu.com.这个子域下配置对ysu.com.域名的解析全部转发到ysu.com.域名服务器中
zone "ysu.com." IN {
type forward;
forward { first };
forwarders { 192.168.0.200 };
};
配置中,type类型必须定义为forward;forward类型可定义为first或者only,first表示首先转发,当转发的服务器不响应时,自行去迭代查询,only表示仅转发;forwarders类型定义需要转发到的域名服务器IP地址。
- 全局转发
全局转发主要针对除本地没有通过zone定义的区域查询请求,全部转发给某服务器。实际上这是对域名服务器的一个全局定义,所以应该配置在/etc/named.conf中。格式为
options {
...
forward {first|only};
forwarders { SERVER_IP; };
...
}
===============================================
第十周作业(老王视频)
3、实现单个用户及用户组使用sudo执行所有命令
答:以wang用户为例,增加权限
# visudo
wang ALL=(root) ALL
4、简述rsync用于那些场景,并对比scp有什么优点?
答:
scp支持远程复制文件。如果复制的源文件和目标文件同名,会直接覆盖
rsync也支持远程复制文件。如果复制的源文件和目标文件同名。会检查该文件的各种属性信息(如时间戳,权限等)。如果属性相同,会直接跳过,不进行复制;如果不同则进行替换复制。
===============================================
第九周作业(老王视频)
1、判断UID是否大于等于500,如果为真就显示为普通用户,如果为假就显示为系统或管理用户
#!/bin/bash if id -u $1 &> /dev/null;then if [ `id -u $1` -ge 500 ];then echo "$1 is common user" else echo "$1 is system user" fi else echo "$1 is not existed" fi
======================================
使用方法
# ./user_judge.sh root #$1变量位置接用户名
2、显示用户id为奇数的用户
#!/bin/bash while read line;do user_name=`echo $line | awk -F: '{print $1}'` user_id=`echo $line | awk -F: '{print $3}'` if [ $(($user_id%2)) -eq 1 ];then echo $user_name fi done < /etc/passwd
3、统计web服务访问日志中的ip访问量
方法1: # awk '{print $1}' /var/log/httpd/access_log | sort | uniq -c | sort -nr
方法2:# awk '{host[$1]++}END{for (n in host) print host[n],n}' access_log | sort -nr
===============================================
第八周作业(老王视频)
1、用shell脚本实现自动登录机器
# vim ./denglu.sh #!/usr/bin/expect set ip [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2] spawn ssh $user@$ip expect { "yes/no" {send "yes\n";exp_continue} "password" {send "$password\n"} } interact ====================================== 使用方法 # ./denglu.ssh 172.16.101.225 root 123456
2、shell 判断一个值bone是否在数组arrayZ=( one two three four five five )中
# cat./in_array.sh
#!/bin/bash arrayZ=( one two three four five five ) for((i=0;i<${#arrayZ[@]};i++));do if [ "$1" == ${arrayZ[$i]} ];then echo "The value is in arrayZ" exit 0 else continue fi done echo "The value isn't in arrayZ" ======================================= #脚本使用方法 #./in_array.sh bone
3、用命令或者脚本实现 0057AF051EFF 变为 00:57:AF:05:1E:FF 。
# cat./mac.sh
#!/bin/bash
#check_mac检查mac格式是否是12位,并且由0-9A-F组成,错误退出 check_mac(){ if [ ${#str} -eq 12 ];then if [[ $str =~ ^[0-9A-F]+$ ]];then : else echo "The Mac Address is Wrong" exit 2 fi else echo "The Mac Address is Wrong" exit 1 fi } str=`echo $1 | tr a-z A-Z` check_mac $str
mac="" for((i=2;i<=10;i+=2));do
#通过字符串切片一次获取str2个字符,并将取出的字符添加到mac串中,并加上: mac=$mac${str:$i:2}":" done
#通过字符串切片去掉最后一个:
echo ${mac::-1}
=======================================
#脚本使用方法
#./mac.sh 0057AF051EFF
4、a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0 \! \@ \# \$ \% \^ \& \* \( \) \- \_ \= \+ \\ \/ \' \" \; \: \[ \] \{ \} \, \. \?用以上字符,结合数组,实现一个随机生成20位密码的脚本
# cat ranpass.sh
if [[ $1 =~ [[:digit:]]+ ]];then NumOfPass=$1 else NumOfPass=20 fi #因为数组中不能直接把把*赋值给某个变量,此处采用*0的方式,最后将0去掉即可 ran=(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0 \! \@ \# \$ \% \^ \& \*0 \( \) \- \_ \= \+ \\ \/ \' \" \; \: \[ \] \{ \} \, \. \?) num=${#ran[@]} password="" for((i=1;i<=$NumOfPass;i++));do index=$(($RANDOM%$num)) password=$password${ran[$index]} done echo $password | sed 's@*0@*@g'
=======================================
#脚本使用方法
#./password.sh 30
#./password.sh
6、编写Nginx的systemd配置文件, 实现nginx进程开机启动
# vim /usr/lib/systemd/system/nginx.service [Unit] Description=The Nginx Server After=network.target [Service] Type=forking EnvironmentFile=/etc/nginx/nginx.conf ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop [Install] WantedBy=multi-user.target ============================================== # systemctl daemon-reload # systemctl enable nginx
===============================================
第七周作业(老王视频)
1、编写脚本实现传入进程pid,查看对应进程/proc下的CPU、内存指标
# cat pid.sh
================================================================ #!/bin/bash #判断第一个参数是否是数字,不是退出 [[ $1 =~ [[:digit:]]+ ]] || { echo "$1 is not PID Number";exit; } dirname="/proc/" fullname=$dirname$1 if [ -d $fullname ];then cat $fullname/status else echo "PID $1 progress is not exist." fi
===============================================================
#脚本使用方法,脚本后直接跟pid的号码
# ./pid.sh 1
2、编写脚本实现每分钟检查一个主机端口是否存活(提示使用nmap),如果检查到端口不在线,sleep 10s,如果如果三次都不存在,记录到日志
# cat port_test.sh
===============================================================
#!/bin/bash #exit code 1:IP地址不是由4部分数字组成 #exit code 2:IP地址不是数字组成的,包含其他字符 #exit code 3:IP地址数字范围不在0-255之间 #exit code 4:端口号不是数字主城的,包含其他字符 #exit code 5:端口号不在1-65535之间 #check_ip函数检查第一个参数是否为合格ip地址 check_ip(){ parts=`echo $1 | awk -F "." 'END{print NF}'` if [ $parts -ne 4 ];then echo "The ip address is wrong!" exit 1 fi ip_part=(`echo $1 | awk -F "." 'END{for(i=1;i<=NF;i++)print $i}'`) i=0 for ((i=0;i<4;i++));do if [[ ${ip_part[i]} =~ ^[[:digit:]]+$ ]];then if [ ${ip_part[i]} -gt 255 ] || [ ${ip_part[i]} -lt 0 ];then echo "The ip address is wrong!" exit 3 fi else echo "The ip address is wrong!" exit 2 fi done } #check_port函数检查第二个参数是否是合格端口号 check_port(){ if [[ $1 =~ ^[[:digit:]]+$ ]];then if [ $1 -gt 65535 ] || [ $1 -lt 1 ];then echo "Port Number must in 1 to 65535" exit 5 fi else echo "Port Number must in 1 to 65535" exit 4 fi } check_ip $1 check_port $2 count=1 while [ $count -le 3 ];do status=`nmap $1 -p $2 | awk '/tcp/{print $2}'` if [ "$status" == "open" ];then echo $1":"$2 is on exit 0 else echo $1":"$2 is off fi if [ $count -lt 3 ];then sleep 10 fi let count+=1 done echo $1":"$2 is off >> /tmp/test_port.log
===============================================================
#脚本使用方法,脚本后直接跟pid的号码
# ./port_test.sh ip地址 端口号
3、编写脚本/root/bin/excute.sh,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
# cat /root/bin/excute.sh
===============================================================
#!/bin/bash if [ -f $1 ] && [[ $1 =~ \.sh$ ]];then chmod +x $1 else echo "$1 is not script file" fi
===============================================================
#脚本使用方法,脚本后直接跟pid的号码
# /root/bin/excute.sh 文件名
4、编写/root/bin/nologin.sh和login.sh,实现禁止和允许普通用户登录系统
# cat /root/bin/nologin.sh #!/bin/bash [ -e /etc/nologin ] || touch /etc/nologin # cat /root/bin/login.sh #!/bin/bash [ -e /etc/nologin ] && mv /etc/nologin{,.bak-`date +%F`}
5、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中第10个用户和第20个用户的id之和。
# cat /root/bin/sumid.sh
===============================================================
#!/bin/bash line_number=`wc -l /etc/passwd | awk '{print $1}'` sum=0 while [ $# -gt 0 ];do if [[ $1 =~ ^[[:digit:]]+$ ]];then if [ $1 -ge 0 ] && [ $1 -le $line_number ];then uid=`sed -n "$1p" /etc/passwd |awk -F: '{print $3}'` let sum=$sum+$uid else echo "参数超出/etc/passwd行数范围" exit 1 fi else echo "参数必须为数字" exit 2 fi shift 1 done echo $sum
===============================================================
# 脚本使用方法,脚本接/etc/passwd文件行号
# /root/bin/sumid.sh 10 20
# 70
===============================================
第六周作业(老王视频)
2、总结常见网络管理命令
3、给定IP地址167.77.88.99和掩码255.255.255.192,子网号是什么?广播地址是什么?有效IP地址是什么?
答:
子网号:166.77.88.64/26
广播地址:166.77.88.127/26
有效地址:166.77.88.65/26 --- 166.77.88.126/26
4、添加IP地址192.168.2.2/24到eth0网卡上
答:有三种方法
(1)、使用ifconfig命令
增加ip地址 # ifconfig eth0:0 192.168.2.2/24
删除ip地址 # ifconfig eth0:0 down
(2)、使用ip命令
增加ip地址 # ip addr add 192.168.2.2/24 dev eth0 label eth0:0
删除ip地址 # ip addr del 192.168.2.2/24 dev eth0
(3)、修改配置文件
# vim /etc/sysconfig/network-scripts/ifcfg-eth0:0
DEVICE="eth0:0"
IPADDR=192.168.2.2
NETMASK=255.255.255.0
GATEWAY=X.X.X.X
DNS1=X.X.X.X
# service network restart
6、找出CPU占用最多的前10个进程
答:
1、使用top命令,默认排序为cpu占用率排序,查看前十项即可
7、crontab实现,在12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup
答:
# crontab -e
0 6-12/3 * 12 * /usr/bin/backup
===============================================
第五周作业(老王视频)
1、磁盘lvm管理,完成下面要求,并写出详细过程(点此链接):
1) 创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小 为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录
2) 扩展testlv至7G,要求archlinux用户的文件不能丢失
3) 收缩testlv至3G,要求archlinux用户的文件不能丢失
4) 对testlv创建快照,并尝试基于快照备份数据,验证快照的功能
2、创建一个可用空间为1G的RAID1设备,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录(点此链接)
===============================================
第四周作业(老王视频)
1、查找/var目录下不属于root、ip、gdm的所有文件
答:
# find /var -not -user root -a -not -user ip -a -not -user gdm
2、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)
答:
# egrep -o "[[:alpha:]]+" /etc/init.d/functions | sort | uniq -c | sort -nr | head
# sed -r "s#[^[:alpha:]]+#\n#g" /etc/init.d/functions |sort|uniq -c|sort -rn | head
3、利用sed取出ifconfig命令中本机的IPv4地址
答:# ifconfig|sed -nr '/\<inet\>/p' | sed -r 's@.*inet (addr:)?@@' | sed 's@ .*@@'
适用于CentOS6和CentOS7,取出来的包含了本地回环地址
4、总结yum的配置和使用,包括yum仓库的创建
5、编写系统初始化脚本reset.sh,包括别名,提示符颜色,yum仓库配置文件
6、安装tree、ftp、lftp、telnet等包
答:
# yum -y install tree ftp lftp telnet
7、在CentOS7上编译安装apache2.4源码包,并启动此服务
===============================================
第三周作业(老王视频)
1、总结vim命令行模式常见快捷方式,以及vim查找,替换的方法
===============================================
第二周作业 (老王视频)
===============================================
第一周作业(老王视频)
1、常见Linux的发行版有哪些?并描述不同发行版之间的联系与区别
if [[ $1 =~ [[:digit:]]+ ]];then NumOfPass=$1else NumOfPass=20fi
#因为数组中不能直接把把*赋值给某个变量,此处采用*0的方式,最后将0去掉即可ran=(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0 \! \@ \# \$ \% \^ \& \*0 \( \) \- \_ \= \+ \\ \/ \' \" \; \: \[ \] \{ \} \, \. \?)
num=${#ran[@]}password=""
for((i=1;i<=$NumOfPass;i++));do index=$(($RANDOM%$num)) password=$password${ran[$index]}done
echo $password | sed 's@*0@*@g'
浙公网安备 33010602011771号