当前位置: 首页 > article >正文

泷羽sec---shell作业

作业一 写计算器

使用bc命令

需要进行安装bc

代码如下:

#!/bin/bash
echo "-----------------------------------"
echo "输入  f  退出"
echo "可计算小数和整数"
echo "用法如:1.1+2.2"
echo "-----------------------------------"
while true; do
    read -p "请输入需要计算的表达式: " expression
    if [ "$expression" == "f" ]; then
        break
    fi
    result=$(echo "$expression" | bc)
    echo "您输入的值是: $result"
done

在这里插入图片描述

使用(())

#!/bin/bash
echo "---------------------------------"
echo "输入  f   退出"
echo "运算符前后请以空格隔开"
echo "用法如:1 + 2"
echo "---------------------------------"
while true
do
        read -p "请输入需要计算的表达式: " expression
        if [ "$expression" == "f" ]; then
                break
        fi
        result=$(($expression))
        echo "您输入的值是: $result"

done

在这里插入图片描述

或者这里还可以使用case对接收的运算符进行判断,然后在每个分支进行对应的操作即可

作业二 阶乘

#/bin/bash
echo "-------------------------------"
echo "输入   f   退出"
echo "计算阶乘"
echo "-------------------------------"

summerize(){
        result=$(($1 * result))
}
while true
do
        read -p "请输入一个数字: " num
        if [ "$num" == "f" ];then
                break
        fi
        if [ "$num" == "0" ];then
                echo "阶乘为0"
                break
        fi
        result=1
        for ((;num>0;num--))
        do
                summerize num
        done
        echo "阶乘为: $result"
done

在这里插入图片描述

扩展一 获取eth0网卡IP

使用grep

#!/bin/bash

for i in $(seq 0 10)
do
        result=$(ip addr show eth$i 2>/dev/null | grep -Eo "inet [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}"|grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}")
        if [ -n "$result" ];then
                echo "eth$i的IP是:$result"
        fi
done

ip addr show eth0表示只显示网卡eth0的信息

grep中的用法很多

  1. -A 2 "eth0" 表示显示包括eth0所在行的后面2行
  2. -E使用正则表达式
  3. -o表示只显示匹配到的

正则表达式中很多

  1. ^a 表示以a开头的

  2. .* 贪婪匹配,就是匹配任何东西

  3. q$ 表示以q结尾

    grep -Eo "^a.*q$" 表示只显示以a开头,以q结尾的字段

  4. [1-9] 表示数字1-9的任意一个

  5. {1,3} 表示匹配范围,长度

    [1-9]{1,3} 表示匹配1-9中的任意一个数字,数字范围在1-3

在这里插入图片描述

使用awk

#!/bin/bash
for i in $(seq 0 10)
do
        result=$(ip addr show eth$i 2>/dev/null | awk '$1 == "inet" && $2 !~ /:/  {print $2}')
        if [ -n "$result" ];then
                echo "eth$i的IP是:$result"
        fi
done
  1. /inet / 这是匹配模式,当字段中有inet加空格时,定位到这里
  2. {print $2} 表示定位到inet这一行地方时,输出第二个字符,空格隔开为字符终止
  3. 所以这里的$1是inet,$2是inet后面的一段字符
  4. $1 == "inet"这个条件用于匹配输出中每行的第一个字段等于inet的情况
  5. !~不匹配
  6. $2!~ /:/这里是判断每行的第二个字段(也就是我们实际要获取的 IPv4 地址部分)不匹配包含:的正则表达式,以此来排除 IPv6 地址。
  7. -F'/' 表示分割,这里是以/进行分割字符,如果有的话。
    若是多分割,可以采用数组形式-F'[,/]'

在这里插入图片描述

扩展二 设置定时任务

使用crontab

crontab -e进入定时任务的编写

在其中的下面已经给出提示,时间顺序是分钟(m) 、小时(h)、天(dom)、月(m)、星期(dow)、命令(command)

crontab -l查看当前定时任务

这里是把网卡ethn系列的IP信息输出到文本中

在这里插入图片描述

使用at

at命令一般可能没安装,需要先进行安装

at命令比较灵活,可以使用now + 2 minutes -f [脚本]表示现在开始两分钟后执行脚本,还可以设置

at 12:00 tommory表示明天12点执行

at 8am+3 days表示三天后的早上8点执行

等等

还可以与EOF联合使用,EOF算是标识符,可以使得命令不止一行,甚至可以在里面执行多条命令,开头EOF,结尾EOF中间就是前面命令执行的,所以好用,推荐

在这里插入图片描述

扩展三 无限重启

首先了解重启的命令,在linux系统中,两个命令可以重启计算机

  1. reboot
  2. init 6

知道重启命令后,就可以直接在一个脚本中编写,使得重启

在这里插入图片描述

其次,需要知道自启动目录在哪,或者文件在哪

可以试想一下,平常在启动某项服务的时候,使用的systemctl命令,以及这个命令可以实现服务的开机启动。不过就是需要高权限才能使用该命令。

那么该命令是通过哪些文件来让这些服务启动的呢

/etc/systemd/system/目录,这个目录是系统服务单元文件的存放位置。所以可以在这个文件中编写。

可以查看这个目录下的文件

在这里插入图片描述

基本上是以.service为结尾,这是一种服务,查看文件

在这里插入图片描述

以下面简单的框架描述

[Unit]
Description=IP Script Service
After=network.target

[Service]
ExecStart=/bin/bash /home/kali/test/ip.sh
Type=oneshot

[Install]
WantedBy=multi - user.target

[Unit]部分

  • Description:这是对服务的一个简单描述,用于在查看服务信息时能够识别服务的用途。
  • After:指定在哪个系统目标(target)之后启动这个服务。在这里,network.target表示在网络相关的服务启动之后再启动这个服务,因为你的脚本可能依赖于网络连接(例如获取 IP 地址相关的操作)。

[Service]部分

  • ExecStart:定义了服务启动时要执行的命令,这里是执行/bin/bash /home/kali/test/ip.sh脚本。
  • Typeoneshot表示这个服务只执行一次,执行完后就结束。这适用于像脚本这种只需要运行一次的情况,而不是像守护进程那样一直运行。

[Install]部分

  • WantedBy:指定这个服务应该被哪个系统目标所依赖。multi - user.target是一个常见的目标,它表示在多用户模式下启动这个服务。

/etc/systemd/system目录下创建一个re.service文件,并编写内容

[Unit]
Description=reboot

[Service]
ExecStart=/bin/bash /home/kali/test/re.sh
Type=oneshot

[Install]
WantedBy=multi-user.target

然后使用systemctl enable [服务名]来使得服务开机自启动

在这里插入图片描述

这时候输入systemctl start re.service会直接进行重启

这时候计算机到这个界面就会重启,根本到不了登录界面

在这里插入图片描述


http://www.kler.cn/a/414936.html

相关文章:

  • 虚拟机ubuntu-20.04.6-live-server搭建OpenStack:Victoria(三:安装服务-controller node)
  • 68000汇编实战01-编程基础
  • 抓包之OSI七层模型以及TCPIP四层模型
  • Django+Nginx+uwsgi网站Channels+redis+daphne多人在线聊天实现粘贴上传图片
  • vs 项目属性表
  • Unity shaderlab 实现LineSDF
  • JVM系列之OOM实战
  • 【论文阅读】Federated learning backdoor attack detection with persistence diagram
  • idea新建springboot web项目
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-autobatch.py
  • 【UE5 C++课程系列笔记】05——组件和碰撞
  • Ubuntu nvidia-cuda-toolkit 升级
  • Chrome://常用的内部页面地址
  • java回文数
  • MySQL 启动失败问题分析与解决方案:`mysqld.service failed to run ‘start-pre‘ task`
  • 在 Ubuntu 18.04 上安装 MySQL 5.7和MySQL 8
  • 【网络安全 | 漏洞挖掘】绕过SAML认证获得管理员面板访问权限
  • Python知识分享第九天补充
  • rocylinux9.4安装prometheus监控
  • js:循环、数组
  • 网络技术-VRRP(虚拟路由冗余协议)部署介绍
  • Element UI Collapse 折叠面板和表格结合高度闪动问题
  • daos源码编译
  • Redis 可观测最佳实践
  • 变换矩阵左乘与右乘的区别和应用
  • Linux开发者的CI/CD(11)jenkins变量