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
}


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
11月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL的服务器日志文件
本文介绍了PostgreSQL数据库的物理存储结构,重点讨论了服务器日志文件。通过`pg_ctl`命令启动PostgreSQL实例时,使用`-l`参数指定日志文件位置,记录数据库启动、运行及关闭过程中的关键信息。附有相关视频讲解和日志文件示例。
300 0
|
4月前
|
机器学习/深度学习 存储 监控
内部文件审计:企业文件服务器审计对网络安全提升有哪些帮助?
企业文件服务器审计是保障信息安全、确保合规的关键措施。DataSecurity Plus 是由卓豪ManageEngine推出的审计工具,提供全面的文件访问监控、实时异常告警、用户行为分析及合规报告生成功能,助力企业防范数据泄露风险,满足GDPR、等保等多项合规要求,为企业的稳健发展保驾护航。
105 0
|
2月前
|
运维 监控 安全
EventLog Analyzer:高效的Web服务器日志监控与审计解决方案
ManageEngine EventLog Analyzer是一款企业级Web服务器日志监控与审计工具,支持Apache、IIS、Nginx等主流服务器,实现日志集中管理、实时威胁检测、合规报表生成及可视化分析,助力企业应对安全攻击与合规挑战,提升运维效率。
134 0
|
4月前
|
安全 Linux Shell
使用SCP命令在CentOS 7上向目标服务器传输文件
以上步骤是在CentOS 7系统上使用SCP命令进行文件传输的基础,操作简洁,易于理解。务必在执行命令前确认好各项参数,尤其是目录路径和文件名,以避免不必要的传输错误。
460 17
|
4月前
|
自然语言处理 Unix Linux
解决服务器中Jupyter笔记本的文件名字符编码问题
通过上述步骤,可以有效解决Jupyter笔记本的文件名字符编码问题,确保所有文件能在服务器上正常访问并交互,避免因编码问题引起的混淆和数据丢失。在处理任何编码问题时,务必谨慎并确保备份,因为文件名变更是
167 17
|
Shell
Shell 文件包含
10月更文挑战第5天
120 4
|
4月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
848 0
|
7月前
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
329 69
|
12月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
232 9
|
7月前
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
213 22

热门文章

最新文章