Python 远程抓取服务器日志最后 1000行
哈喽,大家好,我是木头左!
一、神奇的 Python 工具箱
1. SSH 连接的密钥——paramiko
paramiko 库提供了丰富的方法来处理 SSH 连接的各种细节。从创建连接对象,到执行远程命令,再到获取命令输出,它都能有条不紊地完成任务。例如,可以使用 paramiko.SSHClient()
来创建一个 SSH 客户端实例,然后通过 connect()
方法传入服务器的 IP 地址、用户名和密码等信息,就能成功建立连接。一旦连接建立,就可以使用 exec_command()
方法在远程服务器上执行各种命令,就像在本地终端输入命令一样自然。
2. 文本处理的利器——内置函数和方法
Python 本身就拥有许多强大的文本处理功能,这在截取日志文件特定行数的操作中起着关键作用。比如,字符串的分割方法 split()
可以将一行文本按照指定的分隔符拆分成多个部分;列表的切片操作 [start:end]
可以方便地获取列表中的一段元素,这在截取日志文件的最后 n 行时会大显身手。
此外,文件操作相关的函数如 open()
、read()
、write()
等也是实现目标的重要帮手。通过这些函数,可以打开本地和远程的文件,读取其中的内容,并将处理后的数据写入新的文件中。
二、踏上远程连接的征程
1. 搭建 SSH 桥梁
要用 paramiko 搭建起与远程服务器的 SSH 连接。下面是一段简洁而有效的代码示例:
import paramikodef create_ssh_connection(hostname, port, username, password):client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect(hostname, port, username, password)return clienthostname = 'your_server_ip'
port = 22
username = 'your_username'
password = 'your_password'
ssh_client = create_ssh_connection(hostname, port, username, password)
在这段代码中,定义了一个名为 create_ssh_connection
的函数,它接收服务器的 IP 地址、端口号、用户名和密码作为参数,并返回一个 SSH 客户端对象。通过调用这个函数,可以轻松地与远程服务器建立连接。需要注意的是,为了简化示例,这里采用了明文存储密码的方式,但在实际应用中,应该使用更安全的方式来管理密码,如环境变量或加密存储。
三、深入日志文件的迷宫
经过一番努力,终于成功地与远程服务器建立了连接,现在是时候深入服务器的文件系统,找到那个神秘的 /home/test.log
日志文件了。这就像是进入了一个充满宝藏的迷宫,需要准确地找到目标所在的房间。
1. 定位日志文件
在服务器的文件系统中,日志文件通常存放在特定的目录下。对于 /home/test.log
这个文件,它位于用户的主目录下的 test.log
文件中。可以使用 SSH 客户端提供的 exec_command()
方法来执行 Linux 系统的命令,从而找到并查看这个文件的内容。
以下是一个简单的代码片段,用于检查日志文件是否存在:
def check_file_exists(ssh_client, filepath):stdin, stdout, stderr = ssh_client.exec_command(f'ls {filepath}')if stdout.channel.recv_exit_status() == 0:return Trueelse:return Falsefilepath = '/home/test.log'
if check_file_exists(ssh_client, filepath):print("日志文件存在")
else:print("日志文件不存在")
在这段代码中,定义了一个 check_file_exists
函数,它接收 SSH 客户端对象和文件路径作为参数。通过执行 ls
命令并检查命令的退出状态,可以判断文件是否存在。如果文件存在,函数返回 True
,否则返回 False
。
2. 揭开日志文件
一种常见的方法是使用 Linux 系统的 tail
命令。tail
命令可以方便地显示文件的末尾部分内容。可以结合 Python 的 exec_command()
方法和 tail
命令来实现这一功能:
def get_last_n_lines(ssh_client, filepath, n):command = f'tail -n {n} {filepath}'stdin, stdout, stderr = shh_client.exec_command(command)lines = stdout.read().decode('utf-8').splitlines()return linesn = 100
lines = get_last_n_lines(ssh_client, filepath, n)
for line in lines:print(line)
在这段代码中,定义了 get_last_n_lines
函数,它接收 SSH 客户端对象、文件路径和要截取的行数 n 作为参数。通过构建 tail
命令并执行它,可以获取日志文件的最后 n 行内容,并将其作为一个字符串列表返回。然后,可以遍历这个列表,打印出每一行的内容。
四、将宝藏带回本地——下载日志文件
现在,已经成功地从远程服务器上截取了 /home/test.log
文件的最后 n 行内容,接下来就是将这些珍贵的“宝藏”下载到本地的 tesg.log
文件中了。
1. 搭建传输通道
要将远程服务器上的数据下载到本地,需要建立一个数据传输通道。在 Python 中,可以使用文件 I/O 操作来实现这一功能。在本地创建一个名为 tesg.log
的文件,并打开它准备写入数据。
以下是创建本地文件并打开它的代码示例:
local_filename = 'tesg.log'
with open(local_filename, 'w') as local_file:pass
在这段代码中,使用 open()
函数以写入模式(‘w’)打开或创建一个名为 tesg.log
的文件,并将文件对象赋值给 local_file
变量。这样,就可以通过这个文件对象将数据写入本地文件中了。
2. 传输数据的魔法时刻
有了本地文件和从远程服务器获取的数据,现在就可以开始数据传输了。将之前获取的日志文件最后 n 行的内容逐行写入本地文件中。
下面是完成数据传输的代码片段:
for line in lines:local_file.write(line + '
')
在这段代码中,遍历从远程服务器获取的每一行数据,并使用 write()
方法将其写入本地文件中。为了确保每行数据之间有正确的换行符,在每行数据后面添加了一个换行符 ' '
。
五、关闭连接与清理工作
1. 关闭 SSH 连接的大门
在使用完 SSH 客户端后,应该及时关闭与远程服务器的连接,以释放系统资源并确保安全。这就好比是在离开一座房子后要锁好门一样重要。
关闭 SSH 连接非常简单,只需要调用 SSH 客户端对象的 close()
方法即可:
ssh_client.close()
2. 清理临时文件与资源
在本地,创建了 tesg.log
文件用于存储下载的日志数据。如果在后续的处理过程中不再需要这个文件,可以将其删除以释放磁盘空间。同样,在远程服务器上,如果在操作过程中产生了一些临时文件或数据,也应该及时清理掉,以保持服务器环境的整洁。
在 Python 中,可以使用 os.remove()
函数来删除本地文件:
import osos.remove(local_filename)
通过以上步骤,成功地实现了从服务器远程截取 /home/test.log
文件的最后 n 行并下载到本地 tesg.log
文件中的功能。
我是木头左,感谢各位童鞋的点赞、收藏,我们下期更精彩!
相关文章:

Python 远程抓取服务器日志最后 1000行
哈喽,大家好,我是木头左! 一、神奇的 Python 工具箱 1. SSH 连接的密钥——paramiko paramiko 库提供了丰富的方法来处理 SSH 连接的各种细节。从创建连接对象,到执行远程命令,再到获取命令输出,它都能有…...

vue3+screenfull实现部分页面全屏(遇到的问题会持续更新)
需求:除了左侧菜单,右侧主体部分全部全屏 首先下载screenfull全屏插件 npm install screenfull --save页面引入 import screenfull from screenfull;我这里是右上角全屏图标 <el-iconref"elIconRef"color"#ffffff"size"2…...
Ubuntu 下 nginx-1.24.0 源码分析 (1)
main 函数在 src\core\nginx.c int ngx_cdecl main(int argc, char *const *argv) {ngx_buf_t *b;ngx_log_t *log;ngx_uint_t i;ngx_cycle_t *cycle, init_cycle;ngx_conf_dump_t *cd;ngx_core_conf_t *ccf;ngx_debug_init(); 进入 main 函数 最…...

2025数据存储技术风向标:解析数据湖与数据仓库的实战效能差距
一、技术演进的十字路口 当前全球数据量正以每年65%的复合增长率激增,IDC预测到2027年企业将面临日均处理500TB数据的挑战。在这样的背景下,传统数据仓库与新兴数据湖的博弈进入白热化阶段。Gartner最新报告显示,采用混合架构的企业数据运营效…...

探索高性能AI识别和边缘计算 | NVIDIA Jetson Orin Nano 8GB 开发套件的全面测评
随着边缘计算和人工智能技术的迅速发展,性能强大的嵌入式AI开发板成为开发者和企业关注的焦点。NVIDIA近期推出的Jetson Orin Nano 8GB开发套件,凭借其40 TOPS算力、高效的Ampere架构GPU以及出色的边缘AI能力,引起了广泛关注。本文将从配置性…...

数据结构 常见的排序算法
🌻个人主页:路飞雪吖~ 🌠专栏:数据结构 目录 🌻个人主页:路飞雪吖~ 一、插入排序 🌟直接插入排序 🌟希尔排序 二、选择排序 🌟选择排序 🌟堆排序…...
ES索引知识
索引是数据的载体,存储了文档和映射的信息 索引是具有相同结构的文档的合集体。 设置索引,不仅仅是设置索引名字,还有索引的一些配置,比如:分片和副本,刷新频率,搜索结果的最大参数,…...
FreeRTOS第17篇:FreeRTOS链表实现细节05_MiniListItem_t:FreeRTOS内存优化
文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 1 为什么需要迷你列表项? 在嵌入式系统中,内存资源极其宝贵。FreeRTOS为满足不同场景需求,设计了标准列表项(ListItem_…...
Golang | Gin(简洁版)
文章目录 安装使用RESTful API响应页面获取请求参数路由讲解中间件 安装使用 Gin 是一个 golang 的微框架,封装比较优雅,API 友好,源代码比较明确。具有快速灵活,容错方便等特点。其实对于 golang 而言,web 框架的依赖…...

RAG外挂知识库
目录 RAG的工作流程 python实现RAG 1.引入相关库及相关准备工作 函数 1. 加载并读取文档 2. 文档分割 3. embedding 4. 向集合中添加文档 5. 用户输入内容 6. 查询集合中的文档 7. 构建Prompt并生成答案 主流程 附录 函数解释 1. open() 函数语法 2.client.embe…...

Rust语言:开启高效编程之旅
目录 一、Rust 语言初相识 二、Rust 语言的独特魅力 2.1 内存安全:消除隐患的护盾 2.2 高性能:与 C/C++ 并肩的实力 2.3 强大的并发性:多线程编程的利器 2.4 跨平台性:适配多环境的优势 三、快速上手 Rust 3.1 环境搭建:为开发做准备 3.2 第一个 R…...

蓝桥杯备考:图论初解
1:图的定义 我们学了线性表和树的结构,那什么是图呢? 线性表是一个串一个是一对一的结构 树是一对多的,每个结点可以有多个孩子,但只能有一个父亲 而我们今天学的图!就是多对多的结构了 V表示的是图的顶点集…...
Codeforces Round 502 E. The Supersonic Rocket 凸包、kmp
题目链接 题目大意 平面上给定两个点集,判定两个点集分别形成的凸多边形能否通过旋转、平移重合。 点集大小 ≤ \leq ≤ 1 0 5 10^{5} 105,坐标范围 [0, 1 0 8 10^{8} 108 ]. 思路 题意很明显,先求出凸包再判断两凸包是否同构。这里用…...
机器人匹诺曹机制,真话假话平衡机制
摘要: 本文聚焦于机器人所采用的一种“匹诺曹机制”,该机制旨在以大概率保持“虚拟鼻子”(一种象征虚假程度的概念)不会过长,通过在对话中夹杂真话与假话来实现。文章深入探讨了这一机制的原理,分析其背后的…...

用Python分割并高效处理PDF大文件
在处理大型PDF文件时,将它们分解成更小、更易于管理的块通常是有益的。这个过程称为分区,它可以提高处理效率,并使分析或操作文档变得更容易。在本文中,我们将讨论如何使用Python和为Unstructured.io库将PDF文件划分为更小的部分。…...

【RAG】混合检索(Hybrid Search) 提高检索精度
1.问题:向量检索也易混淆,而关键字会更精准 在实际生产中,传统的关键字检索(稀疏表示)与向量检索(稠密表示)各有利弊。 举个具体例子,比如文档中包含很长的专有名词, 关…...

CTFHub-FastCGI协议/Redis协议
将木马进行base64编码 <?php eval($_GET[cmd]);?> 打开kali虚拟机,使用虚拟机中Gopherus-master工具 Gopherus-master工具安装 git clone https://github.com/tarunkant/Gopherus.git 进入工具目录 cd Gopherus 使用工具 python2 "位置" --expl…...

【算法day4】最长回文子串——动态规划方法
最长回文子串 给你一个字符串 s,找到 s 中最长的 回文 子串。 https://leetcode.cn/problems/longest-palindromic-substring/submissions/607962358/ 动态规划: 回文串即是从前面开始读和从后面开始读,读出来的字符串均相同的字符串&#…...

C++之“string”类的模拟实现
🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:C入门 前言 hello ,大家又来跟着bear学习了。一起奔向更好的自己,上篇博客已经讲清楚了string的一些功能的使用。我们就实现一些主要的功…...
请谈谈 HTTP 中的安全策略,如何防范常见的Web攻击(如XSS、CSRF)?
一、Web安全核心防御机制 (一)XSS攻击防御(跨站脚本攻击) 1. 原理与分类 存储型XSS:恶意脚本被持久化存储在服务端(如数据库)反射型XSS:脚本通过URL参数或表单提交触发执行…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...

rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...

Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...