Power Shell 脚本——基于curl自动批量获取FTP服务器上的日志文件

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Power Shell 脚本——基于curl自动批量获取FTP服务器上的日志文件

一、场景


远程主机上部署了服务程序,每天产生日志文件,名字以日期命名,形如

log-total-2021-03-08.0.log

虽然远程主机部署了FTP服务器,但是还需要下载到本地才可以进行查看。在工作中,不是每天都进行日志的查看,因此,过几天后需要将这期间的日志下载到本地进行分析。(如果是大型服务器,就不要这样子啦!)


需要分两步做这种工作:

  1. 确定起止日期
  2. 动手去复制


想着以后需要重复做这种工作,因此还是让程序做这些事情吧。


二、先看结果


image.png


三、解决思路


3.1 使用Power Shell前的纠结


原来想着基于CMD批处理命令.bat进行编写,写着写着发现获取日期差的函数太费劲,转而走向了Power Shell的.ps1面向对象的编程,和JAVA的思想是一致的。在.bat中的几十行的代码在.ps1中只要几行就可以解决。心里直呼舒服啊,放弃.bat吧。


3.2 获取文件怎么搞呢?


想到了curl,几乎是每个程序员都知道的网络工具,在Power Shell中直接调用。微软实现了阉割版的curl工具包,其实是Invoke-WebRequest命令,很是鸡肋。

image.png

如果想调用真正的curl,直接输入curl.exe + 参数,至此你熟悉的命令(你的快乐)

又回来了。

curl.exe 参数

3.3 远程获取文件逻辑


  1. 搭建FTP服务端,开启FTP端口服务
  2. 增量获取日志文件(上一次和这一次的获取的文件量的差)
  3. curl循环下载


3.4 不贴源码等于耍流氓


write-host "Starting to get Log Files From Remote Terminal..."
$work_path="C:\Users\86134\Desktop\total\total\"
cd $work_path
#文件列表
$file_array = ls
#获取当前文件夹中最新的日志文件的日期,为什么是-2呢,因为我本地的文件夹里还有个其他文件
$last_date = $file_array[-2].name.SubString(10,10)
#获取远程和本地日志文件的日期差
$days_diff = (New-TimeSpan $([System.DateTime]::ParseExact($last_date,"yyyy-MM-dd",$null)) $([System.DateTime]::Now)).Days - 1
write-host "The days of diff is :"$days_diff 
#要获取的日志文件名
$file_list= [String[]] @()
for($i=0;$i -lt $days_diff;$i++)
{
  $file_list += ([System.DateTime]::ParseExact($last_date,"yyyy-MM-dd",$null)).addDays($i + 1).toString("yyyy-MM-dd")
}
#循环下载文件
for($i=0;$i -lt $file_list.Count;$i++)
{
  $temp_date = $file_list[$i]
  write-host "Starting get the file of date :"$temp_date
  curl.exe -# -O ftp://name:password@ip/log-total-$temp_date.0.log
}


至此就可以看到第二节的结果了。


3.5 还是原来的配方,封装成.bat命令


.ps1文件需要在命令行中执行,不能够双击运行。因此,需要将其封装为.bat命令,直接双击运行,最后再封装成服务开机自启动,完成脚本自动化执行。


四、优化


通过对比本地日志文件和远程主机日志文件的区别,获取差集。

write-host "Starting to get Log Files From Remote Terminal..."
$work_path="C:\Users\86134\Desktop\total\total\"
cd $work_path
#文件列表
$file_array = ls
#获取当前文件夹中最新的日志文件的日期,为什么是-2呢,因为我本地的文件夹里还有个其他文件
$last_date = $file_array[-2].name.SubString(10,10)
#获取远程和本地日志文件的日期差
$days_diff = (New-TimeSpan $([System.DateTime]::ParseExact($last_date,"yyyy-MM-dd",$null)) $([System.DateTime]::Now)).Days - 1
#远程主机日志文件参考数组对象
$remote_File_Array = curl.exe -s --ftp-ssl -k  ftp://user:password@ip/
write-host "Remote host log file count is:"$remote_File_Array.length
$remote_File_Name_Array = [String[]] @()
#获取远程主机上的日志文件名
for($i=0;$i -lt $remote_File_Array.length;$i++){
  $remote_File_Name_Array += $remote_File_Array[$i].subString(39);
}
#获取本机日志文件
$local_file_Array = [String[]] @()
for($i=0;$i -lt $file_array.Count;$i++){
  #write-host $file_array[$i].name
  $local_file_Array += $file_array[$i].name
}
write-host "Local host log file count is:"($local_file_Array.length-1)
write-host "The days of diff is :"$days_diff 
#要获取的其它文件
$other_file_Array = [String[]] @()
#求出本地日志文件和远程日志文件的差集
for($i=0;$i -lt $remote_File_Name_Array.Count;$i++){
  $check = $false
  for($j=0;$j -lt $local_file_Array.Count;$j++){
    if($remote_File_Name_Array[$i] -eq $local_file_Array[$j]){
      $check=$true
      break
    }
  }
  if(!$check){
    $other_file_Array += $remote_File_Name_Array[$i]
  }
}
#循环下载日志文件
for($i=0;$i -lt $other_file_Array.Count;$i++)
{
  write-host "Starting get the file :"$other_file_Array[$i]
  $temp_file_name = $other_file_Array[$i]
  curl.exe -# -O ftp://user:password@ip/$temp_file_name
}


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL的服务器日志文件
本文介绍了PostgreSQL数据库的物理存储结构,重点讨论了服务器日志文件。通过`pg_ctl`命令启动PostgreSQL实例时,使用`-l`参数指定日志文件位置,记录数据库启动、运行及关闭过程中的关键信息。附有相关视频讲解和日志文件示例。
|
3月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
72 1
|
3月前
|
分布式计算 资源调度 数据可视化
Hadoop-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看
Hadoop-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看
67 1
|
4月前
|
关系型数据库 MySQL 应用服务中间件
服务器端日志在哪里
服务器端日志在哪里
|
5月前
|
Ubuntu Linux 测试技术
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
|
5月前
|
Java Shell Linux
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
关于如何使用Shell脚本来解析Linux系统中的应用服务日志,提供了脚本实现的详细步骤和技巧,以及一些Shell编程的技能扩展。
83 0
【Linux入门技巧】新员工必看:用Shell脚本轻松解析应用服务日志
|
5月前
|
Prometheus 监控 Cloud Native
Web服务器的日志分析与监控
【8月更文第28天】Web服务器日志提供了关于服务器活动的重要信息,包括访问记录、错误报告以及性能数据。有效地分析这些日志可以帮助我们了解用户行为、诊断问题、优化网站性能,并确保服务的高可用性。本文将介绍如何使用日志分析和实时监控工具来监测Web服务器的状态和性能指标,并提供具体的代码示例。
609 0
|
1月前
|
安全 编译器 Linux
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例
本文深入解析了利用缓冲区溢出漏洞对FTP服务器进行远程攻击的技术,通过分析FreeFlow FTP 1.75版本的漏洞,展示了如何通过构造过长的用户名触发缓冲区溢出并调用计算器(`calc.exe`)。文章详细介绍了攻击原理、关键代码组件及其实现步骤,并提出了有效的防范措施,如输入验证、编译器保护和安全编程语言的选择,以保障系统的安全性。环境搭建基于Windows XP SP3和Kali Linux,使用Metasploit Framework进行攻击演示。请注意,此内容仅用于教育和研究目的。
79 4
|
3月前
|
网络协议 文件存储 Windows
Windows Server 2019 FTP服务器搭建
Windows Server 2019 FTP服务器搭建
124 0