第4周作业

1. 通过网络配置命令,让主机可以上网。 ip, netmask, gateway, dns,主机名。相关命令总结,最终可以通过这些配置让你的主机上网。

  • ip 命令
ip link		#查看链路层信息
ip link set eth1 down #禁用网卡
ip link set eth1 name eth1-test
ip address show eth0	#查看网卡
ip address add 10.0.0.150/24 dev eth0	#向设备添加IP地址
ip address del 10.0.0.150/24 dev eth0   #删除IP
ip a flush dev eth1		#清空网卡上所有IP
  • 修改网卡配置文件(rocky)
vim /etc/sysconfig/network-scrips/ifcfg-eth0
DEVICE=eth0
NAME=con-eth0
IPADDR=10.0.0.151
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.2
DNS2=114.114.114.114
#重启端口
nmcli con reload;nmcli con down con-eth0;nmcli con up con-eth0
#CentOS 7版本
systemctl restart network

  • 修改网卡配置文件(ubuntu)
vim /etc/netplan/eth0.yaml
network:
  ethernets:
    eth0:
      addresses: [10.0.0.159/24]
      routes: [{to: default,via: 10.0.0.2}]
      nameservers: 
      	addresses: [10.0.0.2, 114.114.114.114]
  version: 2
#生效配置
netplan apply

2. 解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式。

配置项变量名和值解释
接口类型TYPE=Ethernet以太网接口
IP地址IPADDR=192.168.10.100指定静态IP地址
IP地址类型BOOTPROTO=static静态地址
子网掩码NETMASK=255.255.255.024位
网关GATEWAY=192.168.10.200提供跨网段通信功能
默认路由DEFROUTE=yes
连接名NAME=eth0
UUIDUUID=1186fa68-5dfd-4257-ab26-ccb6d99961ae唯一标识符
设备名DEVICE=eth0
网卡设备是否开机启用ONBOOT=no禁用

3. 基于配置文件或命令完成bond0配置

  • 添加两块网卡-仅主机模式
  • 创建配置文件 (rocky)
# 创建bond 配置文件
vim /etc/sysconfig/network-scripts/ifcfg-bond0

NAME=bond0
TYPE=bond
DEVICE=bond0
BOOTPROTO=none
IPADDR=192.168.10.200
PREFIX=24
BONDING_OPTS="mode=1 miimon=100 fail_over_mac=1"

#创建网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-eth1

NAME=eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes

vim /etc/sysconfig/network-scripts/ifcfg-eth2

NAME=eth2
DEVICE=eth2
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
  • 查看
root@rocky154 network-scripts]# nmcli conn reload;nmcli conn
NAME   UUID                                  TYPE      DEVICE 
bond0  ad33d8b0-1f7b-cab9-9447-ba07f855b143  bond      bond0  
eth2   3a73717e-65ab-93e8-b518-24f5af32dc0d  ethernet  eth2   
eth0   c4a24c39-7ac1-485b-b642-d95b1015609f  ethernet  eth0   
eth1   9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04  ethernet  eth1 

4. 通过ifconfig命令结果找到ip地址.

#ifconfig eth0 查看信息
[root@rocky154 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.154  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fe98:3e2a  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:98:3e:2a  txqueuelen 1000  (Ethernet)
        RX packets 1768141  bytes 2398123395 (2.2 GiB)
        RX errors 0  dropped 431  overruns 0  frame 0
        TX packets 258044  bytes 19920985 (18.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# ip地址位于第2行,以空白符分隔的第2列,可以使用awk 通过管道符接收ifconfig eth0的输出结果,匹配行号等于2的行,并打印输出以空白符为分隔符的第2列,即IP地址。

ifconfig eth0 | awk 'NR==2{print $2}'

Alt

5. 使用脚本判断 你主机所在网络内在线的主机IP有哪些? ping通则在线。

#创建一个脚本
vim for_ping_host.sh
-----------------------------------------------------------------

#!/bin/bash

#主机所在网络为10.0.0.0/24
#初始化网络位变量
NET=10.0.0

#使用for循环遍历本网段内所有主机
for HOST in {1..254};do
        {
                #ping主机,将标准输出和错误都重定向且不显示。
                ping -c1 -w1 $NET.$HOST &>/dev/null &&

                #ping的通则输出 $NET.$HOST is up,并将输出结果记录到文件
                echo -e "\E[1;32m${NET}.${HOST} is up \E[0m" | tee -a host_list.log ||
                
                #ping不通则输出 $NET.$HOST is down
                echo -e "\E[1;31m${NET}.${HOST} is down \E[0m"
        
        #}后边跟 & 表示并发执行
        }&
done
wait
---------------------------------------------------------------------
#添加可执行权限,并执行
chmod a+x for_ping_host.sh
./for_ping_host.sh

执行结果,在线的主机被记录到 host_list.log
在这里插入图片描述

6. 使用while read line和/etc/passwd,计算用户id总和。

创建脚本文件:
vim total_user_id.sh
----------------------------------------------------
#!/bin/bash

#功能:统计给定文件的总行数,不包括空行和注释行。
#初始化计数器
SUM_USERID=0

#循环读取文件的每一行
while read line; do
        # 使用:分隔每列,并取第三2上字段(用户ID)
        USERID=$(echo $line | cut -d: -f3)
        #累加用户ID
        SUM_USERID=$((SUM_USERID + USERID))
done < /etc/passwd

#输出结果
echo "Total user ID sum: $SUM_USERID"
--------------------------------------------------------
#增加可执行权限,并执行脚本
chmod a+x total_user_id.sh
./total_user_id.sh

输出结果。(其中nobody的用户ID是65534)
在这里插入图片描述

7. 总结索引数组和关联数组,字符串处理,高级变量使用及示例。

1. 索引数组和关联数组
  • 索引数组
    • 声明数组:可以不事先 声明,直接使用。
      • declare -a NEWBOO
    • 数组赋值:
      • weekdays[0]=“sunday” #一次只赋值一个元素
      • NEWBOO=(“77” “ying” “kong” ) #一次赋值全部元素
    • 显示所有数组:declare -a
    • 引用数组:
      • echo ${NEWBOO[2]}
      • 遍历数组:for i in ${NEWBOO[*]};do echo $i; done;
      • 数组的长度,即数组中元素的个数:echo ${#arr[*]}
      • 数组的所有下标: echo ${!arr[*]}
    • 删除数组:
      • unset arr[2] —— 删除数组中的元素
      • unset arr —— 删除整个数组
    • 数组数据处理:
      • 数组切片: ${arr[*]:offset:number}
      • 范例: ${arr[*]:2:3} ——跳过2个元素,取出3个元素
      • 向数组中追加元素: arr[${#arr[@]}]= m arr[8]=n
  • 关联数组
    • 索引数据和关联数组的区别
      • 关联数据要先声明,才能使用,索引数组可以不用声明
      • 索引数组:使用数字作为索引,默认从0开始递增
      • 关联数组:使用字符串作为索引,允许自定义下标
2. 字符串处理及示例
  • 基于偏移量取字符串
1.${#var}                  #返回长度
2.${var:offset}            #从左边开始跳过几个字符开始取
3.${var:offset:number}     #从左边跳过几个字符取几个字符
4.${var:  -length}         #取最右侧的几个字符,:号后有空格
5.${var:offset: -length}   #左边跳过几个字符,右边去掉几个字符取中间
6.${var:  -length:-offset} #先从最右侧向左取length个字符开始,再向右取到距离最右侧offset个字符之前的内容。
#注意:length 必须大于 offset

在这里插入图片描述

  • 基于模式取子串
1.懒惰模式
a.${str#*word}     #删除到第一个word(包括word)之间的部分
b.${str#word}      #删除以word开头的部分
2.贪婪模式
a.${str##*word}    #删除最后一次word之间的内容
b.${str##word}     #删除word开头的字符
3.保留文件名:
a.nginx_url=http://nginx.org/download/nginx-1.20.2.tar.gz
b.echo ${nginx_url##*/}
c.结果显示的为文件名”nginx-1.20.2.tar.gz“

在这里插入图片描述

  • 查找替换
1.懒惰模式
a.${var/pattern/substr}        只替换第一次匹配到的字符串
2.贪婪模式
a.${var//pattern/substr}        替换所有匹配到的字符串
3.行首替换
a.${var/#pattern/substr}        替换行首被匹配到的字符串
4.行尾替换
a.${var/%pattern/substr}        替换以pattern结尾的字符串,换成 substr.

在这里插入图片描述

  • 查找并删除
1.懒惰模式
a.${var/pattern}        只删除第一次匹配到的字符串
2.贪婪模式
b.${var//pattern}        删除所有匹配到的字符串
3.行首替换
c.${var/#pattern}    删除行首被匹配到的字符串
4.行尾替换
d.${var/%pattern}    删除pattern结尾的字符串

在这里插入图片描述

  • 字符大小写转换
1.${var^^}         #小写转大写
2.${var,, }        #大写转小写

在这里插入图片描述

  • 变量扩展
i.模糊匹配变量名
1.${!str*}        #定义了str1,str3,str5

在这里插入图片描述

3. 高级变量使用及示例
a.高级变量赋值
i.str1=abc; echo ${str1-xyz}. 当str1没有配置值时,显示xyz。

b.高级变量用法-有类型变量
1.declare -a arr1        #定义一个普通数组
2.declare -A arr2        #定义一个关联数组
3.declare -i int1        #定义一个整型变量
4.declare -l lower1      #定义一个小写变量
5.declare -r             #显示所有只读变量
6.declare -r r2=123      #只读变量在定义时就要赋值
7.-f     显示函数和函数体
8.-F    仅显示函数名
9.-p    显示变量属性及值
c.变量间接引用
i.eval 命令        
1.对变量进行两次扫描,适用于一次扫描无法实现其功能的变量
2.CMD=whoami
3.echo  $CMD      显示  whoami
4.eval  $CMD      显示  whoami 执行的结果 root
5.两次展开: eval echo {1..$n1}

8. 求10个随机数的最大值与最小值。

#创建脚本
vim rand.sh
---------------------------------------------
#!/bin/bash

declare -i min max
declare -a nums

for((i=0;i<10;i++));do
        nums[$i]=$RANDOM

        if [ $i -eq 0 ];then
                min=${nums[0]}
                max=${nums[0]}
        else
          if [ ${nums[$i]} -gt $max ]; then
                  max=${nums[$i]}
          fi

          if [ ${nums[$i]} -lt $min ]; then
                  min=${nums[$i]}
          fi
        fi
done

echo "All numbers  are ${nums[*]}"
echo "Max is $max"
echo "Min is $min"
---------------------------------------------
#增加可执行权限,并执行脚本
chmod a+x rand.sh
./rand.sh

#输出结果
在这里插入图片描述

9. 使用递归调用,完成阶乘算法实现。

#!/bin/bash
# 阶乘公式:n!=1x2x3x....x(n-1)n
# 0!=1  n!=(n-1)!n

fac(){
    if [ $1 -gt 1 ];then
        echo $[$1 * $(fac $[$1-1])]
    else
        echo 1
    fi  
}

fac $1
#给脚本添加执行权限,执行脚本输出结果
chmod a+x fac.sh
./fac.sh 5
./fac.sh 6

在这里插入图片描述

10. 解析进程和线程的区别? 解析进程的结构。

  • 进程和线程的区别主要体现在以下几个方面:‌

    • 资源分配‌:‌
      进程是操作系统资源分配的基本单位,‌拥有独立的内存空间和系统资源;‌而线程是处理器任务调度和执行的基本单位,‌共享进程的资源,‌但拥有独立的执行栈和程序计数器‌
    • 开销与效率‌:‌
      进程创建和销毁的开销较大,‌因为系统需要为其分配和回收资源;‌线程切换的开销较小,‌因为线程共享进程资源,‌使得线程间的通信和数据共享更加高效‌
    • 独立性‌:‌
      进程间相互独立,‌一个进程的崩溃通常不会影响其他进程;‌而线程是进程的一部分,‌一个线程的崩溃可能导致整个进程的崩溃‌
    • 并发性‌:‌
      进程和线程都可以实现并发执行,‌但线程的并发性更高,‌因为线程间的切换开销小,‌能够更频繁地切换执行‌。‌
  • 解析进程的结构

    • 内核把进程存放在叫做任务队列(task list)的双向循环链表中
    • 链表中的每一项都是类型为task_struct,称为进程控制块(Processing Control Block),PCB中包含一个具体进程的所有信息。
    • PCB中包含的信息:
      • 进程ID,用户ID和组ID
      • 程序计数器
      • 进程的状态
      • 进程切换时需要保存和恢复的CPU寄存器的值
      • 描述虚拟地址空间的信息
      • 描述控制终端的信息
      • 当前工作目录
      • 文件描述符表,包含很多指向 file 结构体的指针
      • 进程可以使用的资源上限(ulimit -a 查看)

11. 结合进程管理命令,说明进程各种状态。

  • 进程状态的分类

    • R:运行状态,并不意味着程序在运行中,它表明进程要么是在运行中要么在运行队列里。
    • S:休眠状态,意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)。
    • D:磁盘休眠状态,有时候也叫做不可中断睡眠状态,在这个状态中进程通常会等待IO结束。
    • T:停止状态,可以通过发送SIGSTOP信号来停止进程,这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。
    • X:死亡状态,这个状态只是一个返回状态,你不会在列表中看到这个状态。
    • Z:僵尸状态,一种濒临死亡的状态。
  • 范例

    • R状态: cpu在处理 run_queue的时候,所有在排队的进程,都处于R状态。
      写一个死循环的程序,执行。运行后打开另一个终端查看进程: 在这里插入图片描述
      此时该进程是一个 R+状态,+表示在前台运行。

    • S与D状态

      • S状态表示进程在等待队列(wait_queue)。当进程等待的资源就绪后,进程重新加入run_queue进入R状态。 S——>R 即唤醒
      • 写一个循环一起输出内容到显示器终端,运行后进程处理S+状态,因为echo 是对外设-显示器输出,显示器比较慢,等待其就绪需要时间,test大部分时间处于 S+状态,只有少部分时间处于 R状态。
      • 处于D状态的进程 是不能被 Ctrl+C终止的
      • 在这里插入图片描述
    • T 状态

      • 程序处于暂停状态,此时信息没有任何更新,是完全的暂停。
        运行循环输出,查看进程信息是 S状态。此时 使用 kill -19 进程ID 来暂停进程。 再次查看进程信息,是T状态。
        在这里插入图片描述
      • 执行kill -18 查看进程信息是 S状态,此时通过ctrl+c 不能杀掉该进程,此时程序在后台运行,只能通过 kill -9 来终止
        在这里插入图片描述
    • Z 状态
      僵尸状态,即濒死状态。
      范例:创建一个父进程和其子进程,先使父进程休眠然后杀死子进程,由于没有父进程收回子进程的资源,子进程进入Z状态,成为孤儿进程。

12. 说明IPC通信和RPC通信实现的方式。

  • IPC通信实现‌:‌

    • 同一主机--------------------------------------------------------------------------------------
      • pipe:管道,单向传输
      • Memory-maped file:文件映射,将文件中的一段数据映射到物理内存,多个进程共享这片内存。
      • she shared memory:共享内存‌,通过映射同一块物理内存实现进程间通信。‌
      • signal:信号量‌,主要用于进程间的同步,‌也可传递简单信息。‌
      • socket:套接字‌文件,双工通信,支持不同主机间的进程通信,‌也可用于同一主机。‌
      • Lock:对资源上锁,如果资源已被某进程锁住,则其它进程想使用,都会被阻塞,直到锁打开
      • semaphore:信号量,一种计数器
    • 不同主机:-----------------------------------------------------------------------------------
      • MQ:消息队列‌,发送进程将消息发送到队列,‌接收进程从队列中读取。‌生产者和消费者,如:Kafka,RabbitMQ
      • RPC:remote procedure call
      • ActiveMQ
  • RPC通信实现‌:‌

    • 客户端调用‌:‌发起远程过程调用请求。‌
    • 服务端响应‌:‌接收请求,‌执行相应过程并返回结果。‌
    • 通信机制‌:‌通常采用TCP/IP协议,‌确保数据传输可靠性。‌
    • 序列化/反序列化‌:‌数据在传输前后需进行序列化与反序列化处理。‌
  • 范例

    • 利用管道文件实现 ipc
      在这里插入图片描述

13. 总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换。

  • 前台作业:通过终端启动,且启动后一直占据终端
  • 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
  • 前台和后台中进行状态转换:
    • 让运行中的作业切换到后台: Ctrl+z
    • 让尚未启动的作业在后台运行: ping 127.1 &
    • 剥离作业与终端的关系:终端关闭后作业会在后台继续运行
      • nohup ./test.sh &>/dev/null &
      • screen; ./test1.sh
      • tmux; ./test.sh (需要安装 tmux )
    • 作业控制,调出后台进程:fg ; fg 1
    • 作业控制,让后台stop进程继续运行:bg ; bg 1
    • 用信号切换后台进程状态:killall -19 ./test.sh (发送stop信号)
    • 用信号切换后台进程状态:killall -18 ./test.sh (发送 running信号)

14. 实现定时任务,每日凌晨1点,删除指定文件(自己创建即可)

#编辑当前用户的定时任务
crontab -e
-----------------------------------------------------------------------
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/go/bin
SHELL=/bin/bash

0 1 * * * /root/0901/deltmp.sh
-----------------------------------------------------------------------
#编写指定路径下的脚本文件,并添加可执行权限
vim /root/0901/deltmp.sh
chmod a+x /root/0901/deltmp.sh
-----------------------------------------------------------------------
#!/bin/bash

#功能:删除 /tmp目录下的文件,不包括目录。不关心错误和标准输出
rm -f /tmp/* &> /dev/null

15. 实现定时任务每月月初对指定文件进行压缩(自己创建文件)

#编辑当前用户的定时任务
crontab -e
-----------------------------------------------------------------------
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/go/bin
SHELL=/bin/bash

0 0 1 * * /root/0901/archive_file.sh
-----------------------------------------------------------------------
#编写指定路径下的脚本文件,并添加可执行权限
vim /root/0901/archive_file.sh
chmod a+x /root/0901/archive_file.sh
-----------------------------------------------------------------------
#!/bin/bash

#创建名称为当前日期的文件夹
DATE_NOW=$(date +%Y%m%d)
mkdir -pv /root/backup/$DATE_NOW

#压缩指定目录及文件到上面创建的文件夹下,并以当前日期为压缩文件的后缀作为区分
tar -czvf /root/backup/$DATE_NOW/archive_audit$DATE_NOW.tar.gz /var/log/audit
----------------------------------------------------------------
#执行脚本查看结果
./archive_file.sh

输出结果:显示创建了对应的目录及压缩文件,文件大小由32MB压缩至1.1MB
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值