马哥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; };

                ...   

        }

  

===============================================

第十周作业(老王视频)

1、实现sshd免密登录(点此链接)

  

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

 

 

===============================================

第六周作业(老王视频)

1、总结IP地址规划(点此链接)

 

2、总结常见网络管理命令

ifconfig命令详解(点此链接)

route命令详解(点此链接)

netstat命令详解(点此链接)

ip命令详解(点此链接)

ss命令详解(点此链接)

ping命令详解(点此链接) 

tcpdump命令详解(点此链接)

 

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

Linux计划任务详解(点此链接)

 

===============================================

第五周作业(老王视频)

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目录(点此链接)

3、简述TCP链接建立和断开过程(点此链接)

4、简述TCP和UDP的区别(点此链接)

    

 

===============================================

第四周作业(老王视频)

1、查找/var目录下不属于root、ip、gdm的所有文件

答:

# find /var -not -user root -a -not -user ip -a -not -user gdm

find命令用法详解

 

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

grep命令用法详解

sed命令用法详解

 

3、利用sed取出ifconfig命令中本机的IPv4地址

答:# ifconfig|sed -nr '/\<inet\>/p' | sed -r 's@.*inet (addr:)?@@' | sed 's@ .*@@'

适用于CentOS6和CentOS7,取出来的包含了本地回环地址

 

4、总结yum的配置和使用,包括yum仓库的创建

yum命令用法详解

 

5、编写系统初始化脚本reset.sh,包括别名,提示符颜色,yum仓库配置文件

系统初始化脚本初级 

 

6、安装tree、ftp、lftp、telnet等包

答:

# yum -y install tree ftp lftp telnet

 

7、在CentOS7上编译安装apache2.4源码包,并启动此服务

 apache httpd2.4编译安装

 

===============================================

第三周作业(老王视频)

1、总结vim命令行模式常见快捷方式,以及vim查找,替换的方法

2、总结脚本中运算符、逻辑运算以及用法

 

===============================================

第二周作业 (老王视频)

1、描述linux目录结构以及目录结构命名规定

 

===============================================

第一周作业(老王视频)

1、常见Linux的发行版有哪些?并描述不同发行版之间的联系与区别

2、打印显示当前时间,格式是:20181209211008 

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'

posted on 2019-08-12 16:28  强叔Linux  阅读(356)  评论(0)    收藏  举报