声明!
学习视频来自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"
-
ip addr show eth0:这个命令用于显示名为 eth0 的网络接口的详细信息。
-
grep "inet ":这个命令用于搜索包含 inet 字符串的行。inet 是 IPv4 地址在 ip addr show 命令输出中的前缀,所以这个 grep 命令过滤出了包含 IPv4 地址的行。
-
awk '{print $2}':awk 命令用于打印过滤后行的第二个字段。在这个上下文中,第二个字段通常是 IPv4 地址,后面跟着一个斜杠 / 和子网掩码。
-
cut -d/ -f1:cut 命令用于根据分隔符 / 来分割字符串,并只打印第一个字段。在这个上下文中,分隔符 / 用于分隔 IPv4 地址和子网掩码,所以 cut 命令只提取了 IPv4 地址部分。
-
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 &
-
&:这是后台执行操作符。当你在命令后面加上 &,该命令会在后台执行,而不会阻塞终端,允许你继续在同一个终端窗口执行其他命令。
加权:
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