bash 脚本.note
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
EOFsystemctl 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、集群系统初始化脚本:

·测试:
