跳至内容

博客列表

Python--机器人自动备份文件到自动递增ZIP

项目背景: 将/app/config 目录下的配置文件备份一下,免得一会更新代码搞坏了。 于是熟练地敲下:tar -czvf config_bak_20260318.tar.gz /app/config。 过了半小时,因为改错地方需要再备份一次只能再敲一次,并且小心翼翼地把文件名改成 config_bak_20260318_v2.tar.gz,生怕覆盖了上一个版本。 解决方案: 通过Python编写’自动备份机器人‘;只需要告诉他要备份哪个文件夹,即可自动扫描里面所有文件并递自动增生成版本号,将其安全压缩成 ZIP 文件 准备: Python自带的两个强大标准库: os:用于进入文件夹 ,遍历文件,检查文件是否存在 zipfile:用于创建和写入 ZIP 压缩包 流程图: 接收文件夹路径 ==> 检查当前目录 ==> 备份并剔除重复文件名 代码及解释: import zipfile import os def backupToZip(folder): # 1. 确保传入的文件夹路径是绝对路径 folder = os.path.abspath(/root/frp) # 提取文件夹的名字,比如 '/var/log/nginx' 会提取出 'nginx' folder_name = os.path.basename(folder) # 2. 自动判定版本号 (核心逻辑) number = 1 while True: # 拼接即将生成的 ZIP 文件名 zip_filename = f'{folder_name}_backup_V{number}.zip' # 如果这个文件不存在,说明我们找到了一个可用的新版本号!跳出循环 if not os.path.exists(zip_filename): break # 如果存在,编号加 1,继续找下一个 import zipfile import os #import sys def backupToZip(folder): """ 将整个文件夹的内容备份到一个带有递增版本号的 ZIP 文件中。 """ # 1. 确保传入的文件夹路径是绝对路径 folder = os.path.abspath(folder) # 提取文件夹的名字,比如 '/var/log/nginx' 会提取出 'nginx' folder_name = os.path.basename(folder) # 2. 自动判定版本号 (核心逻辑) number = 1 while True: # 拼接即将生成的 ZIP 文件名 zip_filename = f'{folder_name}_backup_{number}.zip' # 如果这个文件不存在,说明我们找到了一个可用的新版本号!跳出循环 if not os.path.exists(zip_filename): break # 如果存在,编号加 1,继续找下一个 number = number + 1 # 3. 创建 ZIP 压缩文件 print(f'备份机器人正在创建备份归档: {zip_filename} ...') backup_zip = zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) # 4. 遍历目录树并添加到 ZIP 文件中 # os.walk 会像剥洋葱一样,一层层遍历文件夹里的所有内容 for foldername, subfolders, filenames in os.walk(folder): print(f'正在添加文件夹: {foldername} ...') # 把当前文件夹本身加进压缩包 backup_zip.write(foldername) # 把当前文件夹里的所有文件加进压缩包 for filename in filenames: # 安全防范:防止脚本把刚刚生成的 ZIP 包自己也打包进去(无限套娃) if filename.startswith(f'{folder_name}_backup_') and filename.endswith('.zip'): continue # 获取文件的绝对路径并写入压缩包 file_path = os.path.join(foldername, filename) backup_zip.write(file_path) # 5. 收工关门 backup_zip.close() print(f'报告老板,备份完成!已成功生成:{zip_filename}') # ================= 运行区 ================= if __name__ == '__main__': # if len(sys.argv) < 2: # print("用法错误!请在命令后面加上你要备份的文件夹路径。") # print("例如: python backup.py /var/log/nginx/error.log") # target_folder = sys.argv[1] # 假设我们要备份有/root/aaa这个路径文件夹 target_folder = '/root/aaa' if os.path.exists(target_folder): backupToZip(target_folder) else: print(f"找不到文件夹: {target_folder},请检查路径!") 注意:sys库可以让别人引用脚本变得方便

更多 →

March 19, 2026

电话号码和 E-mail 提取器

提取电话和邮箱 导入库 import re, pyperclip 创建手机号正则表达式(手机号格式) phoneRegex = re.compile(r'\d{3}\S?\d{4}\S?\d{4}') 创建邮箱正则表达式(邮箱格式) emailRegex = re.compile(r'''( [a-zA-Z0-9._%+-] + # 用户名部分 \S # @ 符号 [a-zA-Z0-9.-] + # 域名部分 (\.[a-zA-Z]{2,4}) # 最后的后缀 (.com/.cn) )''', re.VERBOSE) 从剪贴板获取文本 text = str(pyperclip.paste()) 提取匹配项 matches = [] for groups in phoneRegex.findall(text): matches.append(groups) #纯文本内容,所有全部加入 for groups in emailRegex.findall(text): matches.append(groups[0]) #最外层大括号内容全部加入 将结果存回剪贴板 if len(matches) > 0: pyperclip.copy('\n'.join(matches)) print('提取成功,已存入剪贴板!') else: print('未发现电话或邮箱。')

更多 →

March 19, 2026

内存告急,快加swap!!!

内存不足创建swap空间 痛点:云服务器的内存太小,又想要极致性价比 解决方案: 创建swapfile的大文件放在swap下 - 创建swap空间: - - 创建swapfile空间 ==> 转为swap ==> 激活swap并加入linux ==> 配置永久挂载 - if - - input file - - of - - output file - bs - - block size 每次读取多少 - - count - - 读取次数 - dd if=/dev/zero of=/tmp/swapfile bs=1M count=1000 - - - mkswap /tmp/swapfile - - free -h - - chmod 600 /tmp/swapfile - - mkswap /tmp/swapfile - - swapon /tmp/swapfile - free -h - - - 先卸载当前的 Swap 文件 - - swapoff /tmp/swapfile - - 使用 swapon -a 命令(它会读取 /etc/fstab 中的所有 swap 条目并尝试挂载) - - swapon -a - vim /etc/fstab(修改) - /swapfile swap swap defaults 0 0 - free -h - 再次查看挂载情况

更多 →

March 17, 2026

SSH 配置踩坑

SSH服务—Github 远程连接报错排查 远程连接到github时出现报错,不能连接 估计是公钥路径不对,git不能在基础目录~/.ssh/ 下看到相关文件 尝试: 删除原来的公钥,重新建一个在正确目录下 ssh-keygen -t ed25519 -C "xxx@xxx.com" 填自己邮箱,生成ssh密钥 将公钥内容复制到github中的ssh管理页面中添加公钥 成功后页面会有提示 - 痛点:用add一个个添加推出文件重新加载是容易重新输入造成记忆压力 - 解决痛点: - - 用git bash在 ~/.ssh/ 下创建config路由表以此管理不同密钥 - 后续管理多个免密钥服务时非常方便,强烈推荐使用!!! 用私钥测试是否匹配: ssh -T -i ~/.ssh/id_rsa git@github.com 用git bash写在~/.ssh/config的内容: — 第 1 把钥匙:专门给个人的 GitHub 用 —Host github.com HostName github.com User git # 填入你刚才测试成功的,属于 GitHub 的私钥路径(不要带 .pub) IdentityFile ~/.ssh/id_ed25519

更多 →

March 15, 2026

Github Pages绑定域名

Github Pages绑定域名并用cloudFlare加速 - 假设域名为: - github.fighting.top - 需要在github ==> Settings ==> pages ==> 添加域名:github.fighting.top - - 随即官方会给您发需要在您的域名厂商那添加的: record 和 txt记录;用于身份验证 - 你需要提前在cloudFlare托管好自己的根域名,并且添加需要绑定Pages的三级域名(github.fighting.top) - 三级域名添加: - - 用CNAME记录,加github前缀,后面写用户名.github.io - 注意:先不开小黄云 - 再添加一个TXT类型,用于身份验证: - - 提供官方给的信息: - - CNAME record number - 两个添加完成后需要等github官方授权,或者自己可以先用绑定的域名查看网站要用http协议,因为https需要等dns验证完后在仓库的setting选项栏点强制https后才生效 - - 有的浏览器会有cookie等信息记录强制指定到https导致网页打不开,这时候需要使用无痕页面查看网站 - - 注意:Pages绑定域名后需要在config_yaml中把baseurl和url修改;否则会指向错误页面 - 一段时间后可以在github的仓库中的setting和头像页的setting查看dns检查情况,成功验证后即可勾选https和dns的verity

更多 →

March 12, 2026

NFS挂载文件系统

操作步骤: - NFS原理: - NFS <==> RPC <==> Client - - RPC服务: port mapper - Server(配置): - dnf install rpcbind nfs-utils - - 安装相关软件 - systemctl enable rpcbind/nfs-server - - systemctl start rpcbind/nfs-server - - rpcinfo -p - - vim /etc/export(写入挂载信息): - - /data 10.0.0.0/24(rw,all_squash) - rw 表示读写 | all_squash表示压缩所有客户端用户为nfsnobody - systemctl reload nfs - 平滑重载nfs,避免restart 60s 夯住 - - mkdir -p /data/ - 递归创建目录(挂载目录) - - ls -ld /data/ - 查看目录属性 - - id nfsnobody - 查看用户uid和gid - - chown -R nfsnobody.nfsnobody /data/ - 设置用户,用户组所属 - - df -h - 产看磁盘挂载情况 - 配置文件: - /etc/exports - /var/lib/nfs/etab - Client(配置): - showmount -e 10.0.0.61 - 查看挂载情况 - - useradd nfsnobody - - exportfs -arv - - 刷新配置 - - mount -t nfs 10.0.0.61:/data/ /mnt/ - - df -h /mnt/ - 查看挂载情况 - - install nfs-utils -y - - touch /mnt/ababa.txt - - - df -h - - 查看挂载情况 - rpcinfo -p - - 打印中转详细信息 - 可尝试在/mnt/下写文件,注意:服务器需要开启!!! - umount -lf /mnt/ - - 强制卸载挂载的磁盘 - 配置文件: - - /etc/rc.local - /proc/mounts - nfs永久挂载(配置前先启动服务端): - vim /etc/fstab(写在文件里): - - 10.0.0.61:/data/ /mnt/ nfs defaults 0 0

更多 →

March 12, 2026

用Nginx搭建站点

一、基础站点配置 1. 站点信息 域名(server_name):buy.fighting.top 站点根目录(root):/app/code/buy/ 首页文件:/app/code/buy/index.html 2. Nginx 配置 编辑配置文件: vim /etc/nginx/conf.d/buy.fighting.top.conf 写入: server { listen 80; server_name buy.fighting.top; root /app/code/buy; location / { index index.html; } location /admin/ { allow 172.16.1.0/24; deny all; } } 3. 关键概念 URL http://buy.fighting.top/admin URI /admin/ URL = 域名 + URI Nginx 实际匹配的是 URI 创建测试文件 mkdir -p /app/code/buy/admin/ echo “购物网站” > /app/code/buy/index.html echo “admin” > /app/code/buy/admin/index.html 5. 本地测试 curl -H “Host: buy.fighting.top” http://127.0.0.1 curl -H “Host: buy.fighting.top” http://127.0.0.1/admin/ 二、进阶:静态资源缓存优化

更多 →

March 12, 2026

Nginx--网站搭建

先挑选一个自己喜欢的云服务器: 阿里云/腾讯云/。。。 - cloudFlare配置name server: - 常规配置: - A策略 二级域名开头 ip - 二级域名可单独配置一个: - A策略 @ ip - ==公网server防火墙一定要放行,否则不显示页面!!!== - firewall-cmd --permanent --add-service=http - firewall-cmd --permanent --add-service=https - 平缓重载: - firewall-cmd --reload - 最后检查: - firewall-cmd --list-all - Nginx(不同下载方式file/dir可能不同): - 主配置文件: - 修改:/etc/nginx/nginx.conf - server { listen 80 server_name **自己的域名**; root **网站目录**; location / { /是基于网站目录结构 index index.html; } } - 检查配置是否错误: - nginx -t - 平滑重载: - systemctl reload nginx - 创建目录: - mkdir -p /.../ - 创建首页文件: - touch /.../index.html - echo "Welcome to my website" >> /.../index.html - 要在两个文件中添加的内容 "你的ip 你的域名" - windows下面win键+r 输入drivers 访问etc下的hosts - 若提示权限不足可通过hosts文件属性修改administrator权限 - linux: /etc/hosts - 即可访问您的域名 注意:如果是自己的真实域名不用改hosts文件,但要注意防火墙放行 && cloudFlare的子域名添加,以及cloudFlare中设置为flexible

更多 →

March 8, 2026

Rsync远程同步文件时的排错流程

配置Rsync服务: Server(10.0.0.5): dnf install rsync -y dnf list installed | grep rsync vim /etc/rsync.conf fake super = yes uid = rsync gid = rsync use chroot = no max connections = 2000 log file = /var/log/rsyncd.log read only = false list = false ignore errors = yes hosts allow = 10.0.0.210/24 #hosts deny = 0.0.0.0/24 auth users = rsync_backup secrets file = /etc/rsyncd.passwd ##################################### [data] path = /data comment = test module useradd -s /sbin/nologin -M rsync 创建虚拟用户来启动Rsync进程 - echo 'rsync_backup:123456' > /etc/rsyncd.passwd - chmod 600 /etc/rsyncd.passwd - mkdir -p /data/ - chown -R rsync:rsync /data/ - 创建模块路径对应文件名 - -R递归更改 - rsync --daemon - 旨在将rsync升级为后台守护进程,监听文件传输,端口为873 - systemctl enable rsyncd - systemctl start rsyncd - systemctl status rsyncd 本地测试: - touch ./a.txt - rsync -Paz ./a.txt rsync_backup@10.0.0.5::data Client(10.0.0.210): - echo '123456' > /etc/client.passwd - 文件名及位置无硬性要求 - chmod 600 /etc/client.passwd - touch ./asd.txt - rsync -Paz ./asd.txt rsync_backup@10.0.0.5::data - rsync -paz /etc/hostname rsync_backup@10.0.0.5::data --password-file /etc/client.passwd - 使用密码文件传输,减少手输密码 - /var/log/rsync.log 日志非常重要,可以多开一个窗口查看错误输出

更多 →

March 5, 2026

Rocky9忘记密码--紧急救援

5分钟紧急救援RHEL-Root密码 原理:在系统未完全启动强行中断引导程序(此时未加载密码验证模块),进入内核的紧急救援模式,从而越过密码 步骤: - 重启时出现内核选项前迅速上下按键停止倒计时,按下e进入编辑 - 找到以 linux 开头且在 initrd 前输入 rd.break;然后按下Ctrl+X进入紧急救援 - 随后进入到switch_root:/# 下,依次输入以下5个命令: - mount -o remount,rw /sysroot 重新挂载根目录可读写 - chroot /sysroot 切换到系统根目录(真实root) - 提示符会变成sh-4.2# - passwd root 修改root密码 - touch /.autorelabel - 自动重新标记,**这一步非常重要** - 因为RHEL的SElinux安全机制,修改密码文件会导致安全标签错乱,这段命令为了让系统下次重启时重新认领这些文件,不用担心文件在重启后会自动删除 - exit 退出chroot环境 - exit - 退出紧急救援模式 - 随后系统开始自动重启

更多 →

March 4, 2026