linux中Shell脚本编程终极实战项目(扫描|监控|FTP)

🏡作者主页:点击!****

🛠️Shell编程专栏:点击!****

⏰️创作时间:2024年12月2日16点3分

🀄️文章质量:95分


目录

项目需求

实验环境

[1. MAC 记录与端口扫描脚本](#1. MAC 记录与端口扫描脚本)

测试

2.系统监控脚本

测试

定时执行

[3. FTP服务器实战](#3. FTP服务器实战)

实验需求

实验环境

实验步骤

[1.创建脚本 并且赋予可执行的权限](#1.创建脚本 并且赋予可执行的权限)

2.系统初始化脚本 (sysfirst.sh)

3.FTP安装脚本(install_ftp.sh)

测试

普通下载用户

管理用户(admin)

扩展知识:


本文将介绍如何通过Shell脚本在CentOS环境中实现自动化的网络管理,重点包括记录局域网中主机的MAC地址、检测匿名FTP服务及监控系统性能。

我们将提供实用的脚本示例,帮助读者提高网络管理效率,确保系统的稳定与安全。无论是初学者还是经验丰富的管理员,本文都将为您提供有价值的指导。

项目需求

实验环境

两台Centos7 192.168.14.111 192.168.14.112

一台Centos8 192.168.14.100

均关闭防火墙 Selinux 静态IP地址 本地YUM (根据你环境自我判断)

1. MAC 记录与端口扫描脚本

1.编写名为 system.sh 的脚本,记录局域网中各主机的 MAC 地址,保存到/etc/ethers 文件中;

若此文件已存在,应先转移进行备份;每行一条记录,第1 列为IP 地址,第2列为对应的 MAC 地址。

  1. 检查有哪些主机开启了匿名 FTP 服务,扫描对象为/etc/ethers 文件中的所有IP地址,扫描的端口为 21。

因为我只有两个主机就不扫描整个网段了 等待时间太久

bash 复制代码
#!/bin/bash

# 1. 定义变量
TARGETS=("192.168.14.112" "192.168.14.100")  # 目标主机数组
FILE="/etc/ethers"   # MAC地址记录文件

# 2. 备份已存在的文件
if [ -f $FILE ]; then
    /bin/cp -f $FILE $FILE.old
fi

# 3. 扫描目标主机并记录MAC地址
for TARGET in "${TARGETS[@]}"; do
    echo "Scanning $TARGET..."
    arping -c 2 -w 1 $TARGET &> /dev/null
    if [ $? -eq 0 ]; then
        echo "Host $TARGET is online. Recording MAC address..."
        # 记录IP和MAC地址
        arp -n | grep $TARGET | awk '{print $1,$3}' >> $FILE
    else
        echo "Host $TARGET is offline."
    fi
done

# 4. 检测FTP服务
echo "以下主机已开放匿名FTP服务:"
for IP in "${TARGETS[@]}"; do
    wget ftp://$IP/ &> /dev/null
    if [ $? -eq 0 ]; then
        echo $IP
        rm -rf index.html
    fi
done

# 5. 输出记录的MAC地址
echo "记录的MAC地址:"
cat $FILE
复制代码
添加权限并且执行 会扫描
chmod +x system.sh
./system.sh
测试

扫描整个网段的脚本命令如下

可参考 修改网段执行脚本即可

bash 复制代码
#!/bin/bash

# 1. 定义变量
NADD="192.168.4."    # 网段地址
FILE="/etc/ethers"   # MAC地址记录文件

# 2. 备份已存在的文件
if [ -f $FILE ]; then
    /bin/cp -f $FILE $FILE.old
fi

# 3. 扫描网段内的主机
HADD=1
while [ $HADD -lt 254 ]; do
    # 发送ARP请求
    arping -c 2 -w 1 ${NADD}${HADD} &> /dev/null
    if [ $? -eq 0 ]; then
        # 如果主机存在,记录其IP和MAC地址
        arp -n | grep ${NADD}${HADD} | awk '{print $1,$3}' >> $FILE
    fi
    let HADD++
done

# 4. 检测FTP服务
echo "以下主机已开放匿名FTP服务:"
while read -r IP; do
    # 检查FTP服务
    wget --spider ftp://$IP/ &> /dev/null
    if [ $? -eq 0 ]; then
        echo $IP
    fi
done < <(awk '{print $1}' $FILE)

# 5. 清理
rm -f index.html

自己执行测试 需要扫描整个网段 请耐心等待!!!

2.系统监控脚本

  1. 编写名为 sysmon.sh 的 Shell 监控脚本。
  2. 监控内容包括 CPU 使用率、内存使用率、根分区的磁盘占用率。
  3. 百分比只需精确到个位,如 7%、12%、23%等。
  4. 出现以下任一情况时告警:磁盘占用率超过 90%、CPU 使用率超过80%、内存使用率超过 90%,告警邮件通过 mail 命令发送到指定邮箱。
  5. 结合 crond 服务,每半小时执行一次监控脚本。
bash 复制代码
vim sysmon.sh 


#!/bin/bash

# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 定义阈值(可根据需求调整)
DISK_THRESHOLD=90
CPU_THRESHOLD=80
MEM_THRESHOLD=90

# 获取系统信息的函数
get_disk_usage() {
    df -h | grep "/$" | awk '{print $5}' | sed 's/%//'
}

get_cpu_usage() {
    top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}'
}

get_memory_usage() {
    free | grep Mem | awk '{print ($3/$2) * 100}'
}

# 获取系统指标
DISK_USAGE=$(get_disk_usage)
CPU_USAGE=$(get_cpu_usage)
MEM_USAGE=$(get_memory_usage)

# 打印标题
echo -e "\n${BLUE}═══════════════════════════════════════${NC}"
echo -e "${BLUE}           系统资源监控报告           ${NC}"
echo -e "${BLUE}═══════════════════════════════════════${NC}"

# 打印时间
echo -e "\n${YELLOW}监控时间:${NC} $(date '+%Y-%m-%d %H:%M:%S')"

# 打印系统资源使用情况
echo -e "\n${YELLOW}系统资源使用情况:${NC}"
echo -e "--------------------------------"

# 检查并显示磁盘使用率
if [ $(echo "$DISK_USAGE >= $DISK_THRESHOLD" | bc) -eq 1 ]; then
    echo -e "${RED}[警告] 磁盘使用率: ${DISK_USAGE}% (超过阈值 ${DISK_THRESHOLD}%)${NC}"
else
    echo -e "${GREEN}[正常] 磁盘使用率: ${DISK_USAGE}%${NC}"
fi

# 检查并显示CPU使用率
if [ $(echo "$CPU_USAGE >= $CPU_THRESHOLD" | bc) -eq 1 ]; then
    echo -e "${RED}[警告] CPU使用率: ${CPU_USAGE}% (超过阈值 ${CPU_THRESHOLD}%)${NC}"
else
    echo -e "${GREEN}[正常] CPU使用率: ${CPU_USAGE}%${NC}"
fi

# 检查并显示内存使用率
if [ $(echo "$MEM_USAGE >= $MEM_THRESHOLD" | bc) -eq 1 ]; then
    echo -e "${RED}[警告] 内存使用率: ${MEM_USAGE}% (超过阈值 ${MEM_THRESHOLD}%)${NC}"
else
    echo -e "${GREEN}[正常] 内存使用率: ${MEM_USAGE}%${NC}"
fi

# 显示详细的磁盘使用情况
echo -e "\n${YELLOW}磁盘使用详情:${NC}"
echo -e "--------------------------------"
df -h | grep -v "tmpfs" | grep -v "devtmpfs"

# 显示内存详细信息
echo -e "\n${YELLOW}内存使用详情:${NC}"
echo -e "--------------------------------"
free -h

# 显示系统负载
echo -e "\n${YELLOW}系统负载:${NC}"
echo -e "--------------------------------"
uptime

# 显示占用CPU最多的前5个进程
echo -e "\n${YELLOW}CPU占用TOP 5进程:${NC}"
echo -e "--------------------------------"
ps aux --sort=-%cpu | head -6

# 显示占用内存最多的前5个进程
echo -e "\n${YELLOW}内存占用TOP 5进程:${NC}"
echo -e "--------------------------------"
ps aux --sort=-%mem | head -6

echo -e "\n${BLUE}═══════════════════════════════════════${NC}"
echo -e "${BLUE}           监控报告结束           ${NC}"
echo -e "${BLUE}═══════════════════════════════════════${NC}\n"
测试
定时执行
bash 复制代码
[root@localhost ~]# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 一 2024-12-02 13:28:37 CST; 36min ago
 Main PID: 999 (crond)
   CGroup: /system.slice/crond.service
           └─999 /usr/sbin/crond -n

12月 02 13:28:37 localhost.localdomain systemd[1]: Started Command Scheduler.
12月 02 13:28:37 localhost.localdomain crond[999]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 69% if used.)
12月 02 13:28:37 localhost.localdomain crond[999]: (CRON) INFO (running with inotify support)
Hint: Some lines were ellipsized, use -l to show in full.

##编辑定时任务加入以下内容(每30分钟执行一次)
crontab -e
*/30 * * * * /root/sysmon.sh

##查看定时任务是否加入成功
[root@localhost ~]# crontab -l
*/30 * * * * /root/sysmon.sh

3. FTP服务器实战

实验需求

要求写一个自动化部署的Shell 脚本来完成这些任务,并通过 Shell 脚本来完成 FTP 的安装和配置。

1. Shell 脚本要求

只在 A 上运行,完成所有脚本任务。

2. 磁盘管理

在 B 上对 /dev/sdb 磁盘进行分区、格式化并挂载到 /data 目录。

3. 系统初始化要求

  1. 软件包安装:安装 wgetvimlrzsznet-toolsgcc
  2. 文件描述符:修改至 65535。
  3. 系统编码:检查并设置为 en_US.UTF8
  4. SSH 端口:修改默认端口 22 为 63008。
  5. 用户管理:
  • 禁用 root 登录。
  • 添加用户 bdqn,密码 bdqn2019,配置 sudo 权限。
  • 行为审计:记录用户操作及时间。
  • 防火墙配置:(脚本有 到那时我是关闭的)
  • 仅允许公网 IP 2.2.2.2 连接 SSH、6000 和 873 端口。
  • 内网 192.168.14.0/24 不限制,外部网络禁 ping。

4. vsftpd 安装及用户管理

  • 在 A 上安装 vsftpd:
    • 添加 admin 用户。
    • 循环添加 10 个只可下载的用户。
    • 确保 vsftpd 正常启动并提供服务。
    • 虚拟用户不允许登录系统,使用 FTP 时锁定在指定目录。
实验环境

|-------|-------------------|----------------|------------|
| 主机用途 | 操作系统 | 主机名/IP 地址 | 主要软件 |
| 服务器 A | CentOS 7.3-x86_64 | 192.168.14.112 | expect、ftp |
| 服务器 B | CentOS 7.3-x86_64 | 192.168.14.111 | expect |

实验步骤
1.创建脚本 并且赋予可执行的权限
复制代码
# 在A主机(192.168.14.112)上执行:
cd /root
touch sysfirst.sh install_ftp.
chmod +x sysfirst.sh install_ftp.sh 

我这里多创建了一个文件忽略即可

2.系统初始化脚本 (sysfirst.sh)
复制代码
#!/bin/bash

# 检查是否为B主机执行
if [ $# -eq 1 ] && [ $1 == "b" ]; then
    # B主机磁盘操作
    mkdir -p /data
    echo -e "n\np\n1\n\n\nw" | fdisk /dev/sdb
    mkfs.ext4 /dev/sdb1
    mount /dev/sdb1 /data
    echo "/dev/sdb1 /data ext4 defaults 0 0" >> /etc/fstab
fi

# 安装常用软件包
yum -y install epel-release
yum -y install wget vim lrzsz net-tools gcc

# 修改文件描述符
echo "ulimit -n 65535" >> /etc/profile
source /etc/profile

# 检查并设置系统编码
current_lang=$(locale | grep LANG | cut -d= -f2)
if [ "$current_lang" != "en_US.UTF-8" ]; then
    localectl set-locale LANG=en_US.UTF-8
fi

# 修改SSH配置
sed -i 's/#Port 22/Port 63008/' /etc/ssh/sshd_config
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

# 添加普通用户并配置sudo权限
useradd bdqn
echo "bdqn2019" | passwd --stdin bdqn
echo "bdqn ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

# 配置行为审计
mkdir -p /var/log/audit/
cat >> /etc/profile << 'EOF'
HISTTIMEFORMAT="%F %T `who am i | awk '{print $1,$2}'` "
export HISTTIMEFORMAT
EOF

# 配置防火墙
systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services

# 配置iptables规则
cat > /etc/sysconfig/iptables << EOF
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.14.0/24 -j ACCEPT
-A INPUT -s 2.2.2.2 -p tcp --dport 63008 -j ACCEPT
-A INPUT -p tcp --dport 6000 -j ACCEPT
-A INPUT -p tcp --dport 873 -j ACCEPT
-A INPUT -p icmp -j DROP
COMMIT
EOF

systemctl restart iptables
systemctl enable iptables

操作内容:

  1. 安装了基础软件包
  2. 修改了文件描述符限制
  3. 设置了en_US.UTF-8编码
  4. 修改SSH端口为63008
  5. 禁用root登录
  6. 创建bdqn用户并配置sudo权限
  7. 配置了行为审计
  8. 设置了防火墙规则
3.FTP安装脚本(install_ftp.sh)
复制代码
#!/bin/bash

# 安装vsftpd
yum -y install vsftpd

# 创建virtual用户和组
useradd -s /sbin/nologin virtual

# 备份原配置
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

# 创建虚拟用户存储目录
mkdir -p /var/ftp/virtual
chmod 755 /var/ftp/virtual

# 创建虚拟用户列表
cat > /etc/vsftpd/vuser.txt << EOF
admin
admin123
EOF

# 添加10个下载用户
for i in {1..10}
do
    echo "download$i" >> /etc/vsftpd/vuser.txt
    echo "download123" >> /etc/vsftpd/vuser.txt
done

# 安装db4-utils(在CentOS 7中包名为libdb-utils)
yum -y install libdb-utils

# 生成虚拟用户数据库
db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
chmod 600 /etc/vsftpd/vuser.db

# 配置PAM认证
cat > /etc/pam.d/vsftpd.virtual << EOF
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
EOF

# 配置vsftpd
cat > /etc/vsftpd/vsftpd.conf << EOF
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd.virtual
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vuser_conf
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
chroot_local_user=YES
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
EOF

# 创建虚拟用户配置目录
mkdir -p /etc/vsftpd/vuser_conf

# 配置admin用户权限
cat > /etc/vsftpd/vuser_conf/admin << EOF
local_root=/var/ftp/virtual/admin
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
EOF

# 配置下载用户权限
for i in {1..10}
do
    cat > /etc/vsftpd/vuser_conf/download$i << EOF
local_root=/var/ftp/virtual/download$i
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
EOF
done

# 创建用户目录并添加测试文件
mkdir -p /var/ftp/virtual/admin
echo "Welcome to admin directory" > /var/ftp/virtual/admin/welcome.txt

for i in {1..10}
do
    mkdir -p /var/ftp/virtual/download$i
    echo "Welcome to download$i directory" > /var/ftp/virtual/download$i/welcome.txt
done

# 设置目录权限
chown -R virtual:virtual /var/ftp/virtual
chmod -R 755 /var/ftp/virtual

# 设置SELinux权限
yum -y install policycoreutils-python
semanage fcontext -a -t public_content_rw_t "/var/ftp/virtual(/.*)?"
restorecon -R -v /var/ftp/virtual

# 配置SELinux布尔值
setsebool -P ftpd_full_access on
setsebool -P allow_ftpd_full_access on

# 如果需要关闭SELinux(可选)
# setenforce 0
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 配置防火墙(如果启用)
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=30000-31000/tcp
firewall-cmd --reload

# 重启服务
systemctl restart vsftpd
systemctl enable vsftpd

echo "FTP服务安装配置完成!"

主要修改和增加的内容:

  1. 添加了SELinux相关配置
  2. 添加了被动模式端口范围配置
  3. 创建了测试文件
  4. 添加了防火墙配置
  5. 调整了目录权限

验证步骤

bash 复制代码
# 1. 检查服务状态
systemctl status vsftpd

# 2. 检查目录权限
ls -l /var/ftp/virtual/
ls -l /var/ftp/virtual/admin/

# 3. 检查SELinux上下文
ls -Z /var/ftp/virtual/

# 4. 测试FTP连接
#找客户端测试即可
ftp -p 192.168.14.112
# 用户名:admin
# 密码:admin123
测试
普通下载用户

(download1-download10)

  • 账号:download1 到 download10
  • 密码:download123
  • 权限:
    • 只能下载文件
    • 不能上传、修改或删除文件
    • 仅具有读取权限
管理用户(admin)
  • 账号:admin
  • 密码:admin123
  • 权限:
    • 可以上传文件
    • 可以下载文件
    • 可以创建文件夹
    • 可以修改和删除文件
    • 完全的读写权限

扩展知识:

如果想要在别的主机上执行该命令 并且不需要输入密码 做(免密登录) ,所有的操作配置一模一样 (根据你后期的需求来修改)只需要修改免密即可

执行该脚本 就会从A主机 复制到B主机 并且完成一系列的操作 直接搭建好FTP和其他所有的用户权限配置

复制代码
#!/bin/bash

# 定义变量
B_HOST="192.168.14.111"
B_PASS="123"    # 修改为正确的密码

# 安装expect
yum -y install expect

# 复制初始化脚本到B主机
/usr/bin/expect << EOF
set timeout 30
spawn scp sysfirst.sh root@${B_HOST}:/root/
expect {
    "(yes/no)?" { send "yes\r"; exp_continue }
    "password:" { send "${B_PASS}\r" }
}
expect eof
EOF

# 复制FTP安装脚本到B主机
/usr/bin/expect << EOF
set timeout 30
spawn scp install_ftp.sh root@${B_HOST}:/root/
expect {
    "(yes/no)?" { send "yes\r"; exp_continue }
    "password:" { send "${B_PASS}\r" }
}
expect eof
EOF

# 在B主机执行初始化脚本
/usr/bin/expect << EOF
set timeout 30
spawn ssh root@${B_HOST}
expect {
    "(yes/no)?" { send "yes\r"; exp_continue }
    "password:" { send "${B_PASS}\r" }
}
expect "#"
send "bash /root/sysfirst.sh b\r"
expect "#"
send "bash /root/install_ftp.sh\r"
expect "#"
send "exit\r"
expect eof
EOF

# 在A主机执行初始化和FTP安装
bash sysfirst.sh
bash install_ftp.sh

echo "所有操作已完成!"

这个脚本的主要作用是自动化地在两台服务器之间进行文件的复制和执行初始化操作。

相关推荐
A小辣椒19 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式