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

简介: 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日志并进行多维度分析。
相关文章
|
4天前
|
网络协议
​LabVIEW从另一个VI或通过VI服务器访问正在运行的可执行文件
​LabVIEW从另一个VI或通过VI服务器访问正在运行的可执行文件
|
7天前
|
安全 Linux 网络安全
Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件
Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件
17 0
|
12天前
|
Java
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
50 0
|
13天前
|
Apache 项目管理 数据安全/隐私保护
Windows安装TortoiseSVN客户端结合Cpolar实现公网提交文件到本地服务器
Windows安装TortoiseSVN客户端结合Cpolar实现公网提交文件到本地服务器
|
14天前
|
Apache 项目管理 数据安全/隐私保护
TortoiseSVN客户端如何安装配置并实现公网访问服务端提交文件到本地服务器
TortoiseSVN客户端如何安装配置并实现公网访问服务端提交文件到本地服务器
|
18天前
|
数据采集 前端开发 JavaScript
vue3 + fastapi 实现选择目录所有文件自定义上传到服务器
vue3 + fastapi 实现选择目录所有文件自定义上传到服务器
31 0
|
21天前
【SVN】如何取消文件和SVN服务器的关联
【SVN】如何取消文件和SVN服务器的关联
8 0
|
4天前
|
弹性计算 运维 监控
解密阿里云弹性计算:探索云服务器ECS的核心功能
阿里云ECS是核心计算服务,提供弹性云服务器资源,支持实例按需配置、集群管理和监控,集成安全防护,确保服务稳定、安全,助力高效业务运营。
30 0
|
1天前
|
弹性计算 运维 安全
阿里云ecs使用体验
整了台服务器部署项目上线
|
4天前
|
负载均衡 固态存储 Linux
阿里云轻量应用服务器、云服务器、gpu云服务器最新收费标准参考
轻量应用服务器、云服务器、gpu云服务器是阿里云服务器产品中,比较热门的云服务器产品类型,不同类型的云服务器产品收费模式与收费标准是不一样的,本文为大家展示这几个云服务器产品的最新收费标准情况,以供参考。
阿里云轻量应用服务器、云服务器、gpu云服务器最新收费标准参考