05-13-shell作业

声明!

学习视频来自B站up主 泷羽sec ,有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!

文章为个人学习笔记。

1、⽤Shell写⼀个计算器

┌──(root㉿kali)-[~/work]
└─# chmod +x 2.sh
                    

注意 空格

┌──(root㉿kali)-[~/work]
└─# cat 1.sh
#!/bin/bash
echo "请输入的表达式为:5+3:"
read -p "数字1   +-*/  数字2 :" num1 fu_hao num2

case $fu_hao in
        '+')
                num=$(expr $num1 + $num2)
                ;;
        '-')
                num=$(expr $num1 - $num2)
                ;;
        '*')
                num=$(expr $num1 \* $num2)
                ;;
        '%')
                num=$(expr $num1 % $num2)
                ;;
        '/')
                if [ "$num2" == "0" ];then
                        echo "除数不能为0"
                        exit 1
                else
                        num=$(expr $num1 / $num2)
                fi
                ;;
        *)
                echo "不支持的运算符号:'$fu_hao'"
                echo "支持的运算符有:+, -, *, /"
                ;;
esac
echo "结果是:$num"
                                                                                                                         
┌──(root㉿kali)-[~/work]
└─# ./1.sh  
请输入的表达式为:5+3:
数字1   +-*/  数字2 :4 + 5
结果是:9
                                                                                                                           
┌──(root㉿kali)-[~/work]
└─# ./1.sh
请输入的表达式为:5+3:
数字1   +-*/  数字2 :8 - 6   
结果是:2
                                                                                                                           
┌──(root㉿kali)-[~/work]
└─# ./1.sh
请输入的表达式为:5+3:
数字1   +-*/  数字2 :9 * 4
结果是:36
                                                                                                                           
┌──(root㉿kali)-[~/work]
└─# ./1.sh
请输入的表达式为:5+3:
数字1   +-*/  数字2 :9 / 2
结果是:4
                                                                                                                           
┌──(root㉿kali)-[~/work]
└─# ./1.sh
请输入的表达式为:5+3:
数字1   +-*/  数字2 : 9 / 3   
结果是:3
                                                                                                                           
┌──(root㉿kali)-[~/work]
└─# ./1.sh
请输入的表达式为:5+3:
数字1   +-*/  数字2 :8 % 3
结果是:2
                                                                                                                           
┌──(root㉿kali)-[~/work]
└─# ./1.sh
请输入的表达式为:5+3:
数字1   +-*/  数字2 :6 / 0
除数不能为0
                                                                                                                           
┌──(root㉿kali)-[~/work]
└─# 

2、n阶的乘阶

┌──(root㉿kali)-[~/work]
└─# cat 2.sh

#!/bin/bash

fun(){
        local n=$1
		# local 局部变量
        local jie_guo=1

        if [ $n -lt 0 ]; then
                echo "负数没有阶乘"

        elif [ $n -eq 0 ]; then
                echo "0的阶乘是1"
                return 1
        else
                for ((i=1;i<=n;i++))
                do
                        jie_guo=$((jie_guo * i))
                        # let jie_guo=jie_guo * i
                        # jie_guo=$(expr $jie_guo \* $i)
                done
                echo $jie_guo
                return 0
        fi
}

read -p "输入一个非负的整数:" n

if [ $n -ge 0 ]; then
        num=$(fun $n)
        echo "n的阶乘是:$num"
else
        echo "输入错误,输入一个非负的整数"
fi

                                                                                                                                                       
┌──(root㉿kali)-[~/work]
└─# ./2.sh
输入一个非负的整数:5
n的阶乘是:120
                  

3、获取IP地址

终端的命令

┌──(root㉿kali)-[~/work]
└─# ip addr show eth0                                              
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:c9:0e:45 brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.145/24 brd 192.168.75.255 scope global dynamic noprefixroute eth0
       valid_lft 1264sec preferred_lft 1264sec
    inet6 fe80::20c:29ff:fec9:e45/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
          

  # ‘inet ’有空格                                                                                                                                            
┌──(root㉿kali)-[~/work]
└─# ip addr show eth0 | grep 'inet '                                 
    inet 192.168.75.145/24 brd 192.168.75.255 scope global dynamic noprefixroute eth0
                                                                                                                                                         
┌──(root㉿kali)-[~/work]
└─# ip addr show eth0 | grep "inet "                                 
    inet 192.168.75.145/24 brd 192.168.75.255 scope global dynamic noprefixroute eth0
           

                                                                           
┌──(root㉿kali)-[~/work]
└─# ip addr show eth0 | grep "inet " | awk '{print $2}'              

192.168.75.145/24


┌──(root㉿kali)-[~/work]
└─# ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -d/ -f1

192.168.75.145

1.Shell脚本筛选eth0网卡的IPv4地址

代码的内容

#!/bin/bash

# 获取eth0网卡的IPv4地址
ip_address=$(ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -d/ -f1)

# 输出IPv4地址
echo "IPv4地址为: $ip_address"
  1. ​ip addr show eth0​:这个命令用于显示名为 eth0​ 的网络接口的详细信息。

  2. ​grep "inet "​:这个命令用于搜索包含 inet ​ 字符串的行。inet ​ 是 IPv4 地址在 ip addr show​ 命令输出中的前缀,所以这个 grep​ 命令过滤出了包含 IPv4 地址的行。

  3. ​awk '{print $2}'​:awk​ 命令用于打印过滤后行的第二个字段。在这个上下文中,第二个字段通常是 IPv4 地址,后面跟着一个斜杠 /​ 和子网掩码。

  4. ​cut -d/ -f1​:cut​ 命令用于根据分隔符 /​ 来分割字符串,并只打印第一个字段。在这个上下文中,分隔符 /​ 用于分隔 IPv4 地址和子网掩码,所以 cut​ 命令只提取了 IPv4 地址部分。

  5. ​ip_address=$(...)​:这是一个命令替换,它将上述命令的输出赋值给变量 ip_address​。这意味着 ip_address​ 变量现在包含了 eth0​ 网络接口的 IPv4 地址。

整行代码的作用是:获取 eth0​ 网络接口的 IPv4 地址,并将其存储在变量 ip_address​ 中。

保存这个脚本为3.sh​,并给予执行权限:

chmod +x 3.sh

结果:

┌──(root㉿kali)-[~/work]
└─# vim 3.sh
                                                                                                                                                         
┌──(root㉿kali)-[~/work]
└─# chmod +x 3.sh    
                                                                                                                                                         
┌──(root㉿kali)-[~/work]
└─# ./3.sh
IPv4地址为: 192.168.75.145

2. 将脚本编辑到计划任务中

将这个脚本添加到计划任务中,并将输出重定向到一个固定文件中。

打开计划任务编辑器:

crontab -e

选择 2 vim编辑器,进行编辑。

┌──(root㉿kali)-[~/work]
└─# crontab -e
no crontab for root - using an empty one
Select an editor.  To change later, run select-editor again.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny

Choose 1-3 [1]: 2
crontab: installing new crontab
"/tmp/crontab.a04c5z/crontab":31: bad minute
errors in crontab file, can't install.
Do you want to retry the same edit? (y/n) y
crontab: installing new crontab
"/tmp/crontab.a04c5z/crontab":31: bad minute
errors in crontab file, can't install.
Do you want to retry the same edit? (y/n) y
crontab: installing new crontab
                                          

​crontab​ 文件的基本格式如下,每行代表一个定时任务,格式详解如下:

*     *     *   *    *        command-to-be-executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- 星期中的日子(0 - 6)(星期天=0)
|     |     |   +------- 月份(1 - 12)
|     |     +--------- 一个月中的日期(1 - 31)
|     +----------- 小时(0 - 23)
+------------- 分钟(0 - 59)

这个格式中,每个 *​ 或数字代表一个时间字段,具体含义如下:

  • 分钟:0 - 59​ 之间的任何整数,也可以用 */n​ 表示每 n​ 分钟执行一次。

  • 小时:0 - 23​ 之间的任何整数,也可以用 */n​ 表示每 n​ 小时执行一次。

  • 日期:1 - 31​ 之间的任何整数,也可以用 */n​ 表示每 n​ 天执行一次。

  • 月份:1 - 12​ 之间的任何整数,代表一年中的月份。

  • 星期:0 - 6​ 之间的任何整数,代表星期中的日子,其中 0​ 代表星期天。

文件内容

添加以下行到计划任务文件中

23 14 28 11 * /root/work/3.sh >> /root/work/ip_3.txt 2>&1

23 14 * 11 0 /root/work/3.sh >> /root/work/ip_3.txt 2>&1

crontab​ 配置代码定义了两个不同的定时任务。

第一行:23 14 28 11 * /root/work/3.sh >> /root/work/ip_3.txt 2>&1​
  • ​23​ 分钟:表示在每小时的第 23 分钟执行任务。

  • ​14​ 小时:表示在每天的下午 2 点(14 点)执行任务。

  • ​28​ 日期:表示在每个月的第 28 天执行任务。

  • ​11​ 月份:表示在每年的 11 月执行任务。

  • ​*​ 星期几:表示在星期天到星期六的任何一天都会执行任务,即不限制星期几。

  • ​/root/work/3.sh​:这是要执行的命令或脚本的路径。crontab​ 将会执行 /root/work/3.sh​ 这个脚本。

  • ​>> /root/work/ip_3.txt​:这是一个输出重定向操作,意味着 3.sh​ 脚本的标准输出(stdout)将被追加(>>​)到 /root/work/ip_3.txt​ 文件中。如果文件不存在,cron​ 将会创建它。

  • ​2>&1​:这是一个错误重定向操作,意味着 3.sh​ 脚本的标准错误(stderr)将被重定向到标准输出(stdout),这样标准错误和标准输出都会被追加到 /root/work/ip_3.txt​ 文件中。

第二行:23 14 * 11 0 /root/work/3.sh >> /root/work/ip_3.txt 2>&1​
  • ​23​ 分钟:表示在每小时的第 23 分钟执行任务。

  • ​14​ 小时:表示在每天的下午 2 点(14 点)执行任务。

  • ​*​ 日期:表示在每个月的任何一天都会执行任务,即不限制日期。

  • ​11​ 月份:表示在每年的 11 月执行任务。

  • ​0​ 星期几:0​ 代表星期天,所以这个任务会在每年的 11 月的每个星期天执行。

  • ​/root/work/3.sh​:这是要执行的命令或脚本的路径。crontab​ 将会执行 /root/work/3.sh​ 这个脚本。

  • ​>> /root/work/ip_3.txt​:这是一个输出重定向操作,意味着 3.sh​ 脚本的标准输出(stdout)将被追加(>>​)到 /root/work/ip_3.txt​ 文件中。如果文件不存在,cron​ 将会创建它。

  • ​2>&1​:这是一个错误重定向操作,意味着 3.sh​ 脚本的标准错误(stderr)将被重定向到标准输出(stdout),这样标准错误和标准输出都会被追加到 /root/work/ip_3.txt​ 文件中。

总结

第一行代码定义的任务会在每年的 11 月,每个月的第 28 天,每天下午 2 点 23 分钟执行,而不考虑星期几。

第二行代码定义的任务会在每年的 11 月的每个星期天,每天下午 2 点 23 分钟执行。

这两个任务都会将它们的输出(包括标准输出和标准错误)追加到 /root/work/ip_3.txt​ 文件中。

重定向
2>&1

2>&1 是一个在 Unix 和类 Unix 系统中常用的 shell 命令重定向操作符,用于将标准错误(stderr,文件描述符 2)重定向到标准输出(stdout,文件描述符 1)。

解释
  • ​2​:表示标准错误输出(stderr)。

  • ​>​:重定向操作符,用于将左侧的输出重定向到右侧的文件或位置。

  • ​&1​:表示标准输出(stdout)的位置,&​ 符号用来表示“与文件描述符相同”,所以 &1​ 就是指标准输出。

作用

当你在命令后面添加 2>&1​,意味着你希望将该命令的标准错误输出也发送到标准输出流。

查看 crontab​ 文件:

使用 crontab -l​ 命令可以列出当前用户的 crontab​ 文件内容。

┌──(root㉿kali)-[~/work]
└─# crontab -l
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and 


23 14 29 11 * /root/work/3.sh >> /root/work/ip_3.txt




┌──(root㉿kali)-[~/work]
└─# crontab -u root -l
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
23 14 29 11 * /root/work/3.sh >> /root/work/ip_3.txt
                                                               

删除 crontab​ 文件:

使用 crontab -r​ 命令可以删除当前用户的 crontab​ 文件,这会取消所有由该文件定义的定时任务。

┌──(root㉿kali)-[~/work]
└─# crontab -r                  
                                                                                                                                                         
┌──(root㉿kali)-[~/work]
└─# crontab -l      
no crontab for root
                           

查看 cron​ 服务状态:

使用 service cron status​ 或 systemctl status cron​ 命令可以查看 cron​ 服务的状态。

┌──(root㉿kali)-[~/work]
└─# service cron status  
● cron.service - Regular background program processing daemon
     Loaded: loaded (/usr/lib/systemd/system/cron.service; enabled; preset: enabled)
     Active: active (running) since Thu 2024-11-28 11:15:54 CST; 5min ago
 Invocation: 36a5bb1ecb0a4db7ae9f52def25cc7d0
       Docs: man:cron(8)
   Main PID: 16388 (cron)
      Tasks: 1 (limit: 4562)
     Memory: 356K (peak: 1.6M)
        CPU: 12ms
     CGroup: /system.slice/cron.service
             └─16388 /usr/sbin/cron -f

11月 28 11:15:54 kali systemd[1]: cron.service: Scheduled restart job, restart counter is at 1.
11月 28 11:15:54 kali systemd[1]: Started cron.service - Regular background program processing daemon.
11月 28 11:15:54 kali cron[16388]: (CRON) INFO (pidfile fd = 3)
11月 28 11:15:54 kali cron[16388]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
11月 28 11:17:01 kali CRON[17080]: pam_unix(cron:session): session opened for user root(uid=0) by root(uid=0)
11月 28 11:17:01 kali CRON[17081]: (root) CMD (cd / && run-parts --report /etc/cron.hourly)
11月 28 11:17:01 kali CRON[17080]: pam_unix(cron:session): session closed for user root



┌──(root㉿kali)-[~/work]
└─# systemctl status cron  
● cron.service - Regular background program processing daemon
     Loaded: loaded (/usr/lib/systemd/system/cron.service; enabled; preset: enabled)
     Active: active (running) since Thu 2024-11-28 11:15:54 CST; 9min ago
 Invocation: 36a5bb1ecb0a4db7ae9f52def25cc7d0
       Docs: man:cron(8)
   Main PID: 16388 (cron)
      Tasks: 1 (limit: 4562)
     Memory: 360K (peak: 1.6M)
        CPU: 20ms
     CGroup: /system.slice/cron.service
             └─16388 /usr/sbin/cron -f

11月 28 11:15:54 kali systemd[1]: Started cron.service - Regular background program processing daemon.
11月 28 11:15:54 kali cron[16388]: (CRON) INFO (pidfile fd = 3)
11月 28 11:15:54 kali cron[16388]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
11月 28 11:17:01 kali CRON[17080]: pam_unix(cron:session): session opened for user root(uid=0) by root(uid=0)
11月 28 11:17:01 kali CRON[17081]: (root) CMD (cd / && run-parts --report /etc/cron.hourly)
11月 28 11:17:01 kali CRON[17080]: pam_unix(cron:session): session closed for user root
11月 28 11:23:01 kali cron[16388]: (root) RELOAD (crontabs/root)
11月 28 11:25:01 kali CRON[21991]: pam_unix(cron:session): session opened for user root(uid=0) by root(uid=0)
11月 28 11:25:01 kali CRON[21992]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
11月 28 11:25:01 kali CRON[21991]: pam_unix(cron:session): session closed for user root
                                                                                                     

4.、制作一个无限重启脚本

代码内容

#!/bin/bash

# 无限循环
while true; 
do
    # 重启命令
    reboot
    # 等待重启完成,这里使用sleep等待10秒,实际可能需要根据实际情况调整
    sleep 10
done

保存这个脚本为4.sh​,并给予执行权限:

chmod +x 4.sh

启动脚本

sh 4.sh

./4.sh

设置自启动

要使脚本在系统启动时自动运行,可以将脚本添加到系统的启动脚本中。这通常涉及到修改/etc/rc.local​文件或创建一个systemd服务。

方法1:修改/etc/rc.local​(可以)

编辑/etc/rc.local​文件:

vim /etc/rc.local

在文件末尾添加以下行:

/root/work/4.sh &
  1. ​&​:这是后台执行操作符。当你在命令后面加上 &​,该命令会在后台执行,而不会阻塞终端,允许你继续在同一个终端窗口执行其他命令。

‍加权:

chmod +x rc.local

保存并退出。

方法2:创建systemd服务(可以使用)

创建一个新的systemd服务文件:

vim /etc/systemd/system/reboot.service

添加以下内容,保存并退出。

[Unit]
Description=Reboot Service

[Service]
ExecStart=/root/work/4.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
[Unit] 部分
  • ​Description=Reboot Service​:这一行提供了服务单元的描述,即 "Reboot Service"。

[Service] 部分
  • ​ExecStart=/root/work/4.sh​:这一行指定了当服务启动时执行的命令。在这里,它指定执行 /root/work/4.sh​ 脚本。

  • ​Restart=always​:这一行定义了服务失败时的重启策略。always​ 表示无论服务因为何种原因退出,都会尝试重启服务。

  • ​RestartSec=10​:这一行定义了重启服务前的等待时间,单位是秒。在这里,如果服务失败,系统将等待10秒后尝试重启服务。

[Install] 部分
  • ​WantedBy=multi-user.target​:这一行指定了服务应该被哪些 systemd 目标(target)所需要。multi-user.target​ 是一个常见的运行级别,它代表多用户图形环境。这意味着当系统达到多用户目标时,这个服务将被启动。

启用并启动服务:

开机启动;

┌──(root㉿kali)-[~]
└─# systemctl enable reboot.service                                
Created symlink '/etc/systemd/system/multi-user.target.wants/reboot.service' → '/etc/systemd/system/reboot.service'.
                                                                                 
┌──(root㉿kali)-[~]
└─# systemctl enable reboot.service
                                   

启动服务

systemctl start reboot.service

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值