bash 脚本.note

noteId: WEBcf651118bf53c9e9ca9b5bd8e84ec443 · 原始路径:/ALL/Bash 脚本编程/练习/25-7-14 练习/bash 脚本.note · 图片:132 · 附件待处理:0

 
1、监控 CPU、内存:
apt install -y mailutils bc
 
·代码解释:
# 代码解释:
这里使用 bc -l  来进行大小比对,因为 if [ -ge ] 不能进行浮点数的大小写比较
(bc -l 的输出是返回值,0 或 1,依靠它来让if 语句判断是否执行操作)
 
·测试:
先将 disk_usage 值改为 98.123 来进行测试:
bash 1-montior_cpu.sh
 
cat /var/mail/root
 
 
2、批量创建新用户并要求首次登录修改密码:
创建用户列表:
mkdir ./data
touch data/user.list
 
 
 
·代码解释:
# 代码解释:
使用 passwd --expire [用户名] 设置用户的密码立即过期,这样就能够使它在首次登录时强制修改密码
 
 
·测试:
bash 2-add_user.sh
 
 
 
3、定期清理日志:
touch -d "31 days ago" /var/log/before/30day.log
touch /var/log/before/import.log
 
 
·测试:
 
 
4、自动备份文件和数据库:
apt install -y mariadb-server
mkdir mysql_backup
 
 
# 配置crontab来实现每天凌晨自动执行:
vim /etc/crontab
每天0点自动执行:
 
每天3点自动执行:
 
每分钟执行一次:
 
每小时执行一次:
 
修改完后重启 cron 重新读取 /etc/crontab 文件:
systemctl restart cron
 
·测试:
 
 
 
5、统计日志中访问Web次数最高的IP地址和次数:
 
 
 
·代码解释:
awk 读取 /var/log/apache2/access.log 日志中的访问信息,print $1 表示仅输出IP地址
sort 输出进行排序(如果不排序就会导致一个IP地址在后续的输出中有多行,不精准)
uniq -c 统计每个IP出现的此时
sort -nr 按照大小进行排序(最大的值在最上方)
awk '{print $1}' 输出IP访问的次数
awk '{print $2}' 输出IP地址
head -n 1 仅获取第一行的内容(仅获取访问次数最多的内容)
 
 
 
6、写一个终端闹钟脚本。能够在后台运行,在指定时间点持续发出声音,能够使用选项终止闹钟。(提示:使用echo -e "\a" 发声,使用kill or pkill等结束进程)
 
输入enable参数发出铃声
输入任意参数终止脚本
 
 
·测试:
或者使用命令调用 tty2终端执行脚本:
chmod +x /bash_scripts/6-call.sh enable
openvt -c 2 -f -- bash /bash_scripts/6-call.sh enable
 
终止脚本:
输入任意参数:
 
 
 
7、监控某个网站能否正常访问,不能则邮件警告。(提示:Linux下命令行的http浏览器: curl lynx w3m elinks)
 
 
·测试:
停止Web站点:
systemctl stop apache2
 
执行脚本后能够查看到邮件:
 
 
 
 
8、安全加固,禁用不必要的服务:
 
  
 
 
 
 
9、写一个脚本跟踪网页源代码的变更,如果网页发生了改变,则发送邮件警告。(可以在本地监控一个文件夹的文件内容来模拟) (提示:mtime 或者 md5 或者 diff)
 
·测试:
运行三次脚本,没有邮件生成:
 
 
修改网页内容,再次运行脚本:
 
有邮件发送:
 
 
10、在指定的目录中,如果发现.sh结尾的文件,就给它可执行的权限:
mkdir exec_dir
touch exec_dir/123.sh
touch exec_dir/666.sh
 
·测试:
执行脚本前:
 
执行脚本后:
 
 
11、自动监控系统的日志文件,如果发现关键字(比如error)出现在日志文件中,发送邮件给管理员。
 
·测试:
我们手动输入 error 到日志中:
echo error >> /var/log/kern.log
然后运行脚本,查看邮件:
 
 
12、文件批量改名(提示:tr mv rename):
 
(1)在每个文件的后面添加统一扩展名(比如.txt);
 
·测试:
 
 
(2)按文件被修改的时间为文件添加序列号,(比如,最早被修改的文件名应该被修改为1_filename.txt:
 
 
·代码解释:
ls -t     //按照文件被修改的时间排序,最新修改的在最上方,修改时间最远的在最下方
((count--)) 与pythobn中的 num -= 1 是一样的,就是每次循环都减1
·测试:
 
 
 
(3)将所有文件的文件名大小写替换(大写替换成小写):
apt install -y rename
 
mkdir test_dir
touch test_dir/ABCd.txt
touch test_dir/Hello.TXT
注意这里结尾要使用 *
 
·测试:
 
 
(4)将file1,file2 …… file50 改为file01,file02 ... file50:
cd test_dir
for i {1..9}; do touch file$i ; done
 
 
·代码解释:
s    //执行替换操作
\d    //匹配单个数字 0-9
()    //将匹配的内容保存为  $1
() + \d 组合起来 = (\d)    //匹配单个数字 0-9,将匹配的内容保存为 $1
$    //表示结尾,前面跟 \d 表示以任意一个数字结尾的(如果不是file + 一个数字结尾的就不匹配)
 
·测试:
 
 
(5)编写针对某个应用的日志切割脚本
使用 logrotate
apt install -y rsyslog
apt install -y logrotate
 
cd /etc/logrotate.d
cp rsyslog test
vim test
systemctl restart logrotate
 
编辑脚本执行日志轮转命令即可:
 
·测试:
while true; do echo $(date) >> /var/log/test.log && sleep 1 ; done &
执行日志轮转:
bash 12.5-file.sh
 
查看日志内容:
 
 
(6)写一个脚本,要求将目录中所有图片(扩展名是.jpg或者.png或.bmp,名字随机)的名字改成image-01.jpg .. png bmp
 
cd test_dir
touch abc.jpg  tt.png xy.jpg  012.jpg  66.png cc.bmp  12b.bmp 456.png  yum.bmp cc.jpg 12b.png
 
 
 
·测试:
 
 
(7)自动同步两个目录 (提示:rsync):
mkdir test1 test2
touch test1/123
touch test2/adflk
 
注意:路径末尾必须要有 / ,否则就会自动创建与源目录同名的目录
 
 
·测试:
 
 
13、批量添加samba用户, 要求: (提示:while read awk):
apt install -y samba
apt install -y quota
 
mkdir /share
cat >> /etc/samba/smb.conf <<EOF
[share]
path = /share
read only=no
EOF
 
touch username.txt
cat >> username.txt <<EOF
1 zhangsan 1001 440102199301012235
2 lisi 1002 436623199910102345
3 wangwu 1003 420706200110197765
EOF
systemctl restart smbd
vim /etc/fstab
quotacheck -avugm
quotaon -avug
 
 
 
·测试:
执行两次文件:
 
 
samba密码是身份证号
 
 
14、系统初始化(非交互式), 任务如下:
 
 
 
15、自动部署lamp架构:
 
apt install -y apache2 php8.2-fpm
 
 
·测试:
 
 
16、自动部署CA,自动签名证书,自动吊销过期证书:
apt install -y openssl
 
(1)部署CA脚本:
未完成的:
这里是使用openssl部署CA,但是最后需要输入密码,就没有完成,我们使用下面的方案:
 
完成的方法:
# 先手动创建CA:
cd /root
/usr/lib/ssl/misc/CA.pl -newca
 
然后编写脚本复制CA目录即可:
这里需要写一条sed 修改 ca根目录,下面签发证书时会使用它作为CA默认根目录
 
·测试:
 
 
(2)颁发CA证书脚本:
 
·测试:
第一次执行时创建证书,第二次执行时不会创建:
 
查看证书:
 
 
(3)吊销证书:
 
 
 
17、查找网站当中的无效链接, 并记录到文件; (提示:curl -I)
 
·测试:
先手动访问一遍,看看脚本是否运行正确
 
 
18、写一个脚本,去抓取指定网站页面上的所有的图片(或者邮箱地址)。
mkdir /data
 
# 开启目录流量(否则wget无法下载):
rm /var/www/html/index.*
 
# 在网站根目录中创建图片:
cd /var/www/html
touch 123.jpg
touch 123.png
 
 
·代码解释:
wget -r -l2 -nd -A jpg,jpeg,png,gif,bmp,webp -P /bash_scripts/data http://www.shanghai.org
 
-r: 递归下载
-l2: 最大递归深度为 2(可改大)
-nd: 不创建目录结构,所有文件放当前目录
-A: 限定文件扩展名(图片)
-P: 将文件下载到指定目录下
 
 
·测试:
 
 
 
19、编写系统防火墙的脚本(提示:iptables,firewalld,nftables):
 
·测试:
 
 
20、ssh防暴力破解的安全小脚本:
 
·测试:
 
 
192.168.1.2 再次访问时无法连接:
 
 
21、文件自动备份脚本: (find tar):
 
·测试:
多次执行,备份目录只保留两份文件:
 
成功上传到ftp目录:
 
 
22、数据库自动备份脚本: (mysqldump):
 
 
# 写入计划任务,每天执行一次:
chmod +x 22-mysql-backup.sh
vim /etc/crontab
 
·测试:
多次执行,备份目录只保留两份文件:
 
成功上传到ftp目录:
 
 
23、文件同步备份脚本:(rsync)
# 本机:
apt install -y sshpass rsync
mkdir /backup
touch /backup/test.txt
 
# 远程主机:
apt install -y rsync
mkdir /backup
echo "permitrootlogin yes" >> /etc/ssh/sshd_config
systemctl restart sshd
注意:两端都需要有rsync才行
 
·测试:
 
 
24、系统关键配置文件备份脚本:
 
 
·测试:
 
vim /backup/etc_backup_2025....
 
 
25、自动生成ssh密钥对,批量上传公钥到多台ssh server. (提示:自动交互expect)
# 本机安装:
apt install -y sshpass
 
# 所有机器安装:
apt install -y ssh
 
 
·测试:
 
 
 
 
26、批量部署web应用到多台服务器,自动配置虚拟主机,自动重启web服务。
# 本机:
apt install -y sshpass
 
# 所有机器:
apt install -y ssh
echo "permitrootlogin yes" >> /etc/ssh/sshd_config
systemctl restart sshd
 
 
·测试:
测试访问:
 
 
27、批量部署web应用数据到多台服务器。
# 本地创建 nfs共享,共享web目录:
apt install -y sshpass
 
# 所有机器:
apt install -y ssh
apt install -y nfs-client
echo "permitrootlogin yes" >> /etc/ssh/sshd_config
systemctl restart sshd
 
 
·测试:
 
 
 
 
 
28、批量测试多台服务器的网络连通性。
 
 
·测试:
正常可以ping通,执行脚本:
 
将 192.168.1.2 接口关闭,再次测试:
ifdown ens33
 
 
 
29、集群系统初始化脚本:
 
·测试: