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
}


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
11月前
|
机器学习/深度学习 存储 监控
内部文件审计:企业文件服务器审计对网络安全提升有哪些帮助?
企业文件服务器审计是保障信息安全、确保合规的关键措施。DataSecurity Plus 是由卓豪ManageEngine推出的审计工具,提供全面的文件访问监控、实时异常告警、用户行为分析及合规报告生成功能,助力企业防范数据泄露风险,满足GDPR、等保等多项合规要求,为企业的稳健发展保驾护航。
329 0
|
9月前
|
运维 监控 安全
EventLog Analyzer:高效的Web服务器日志监控与审计解决方案
ManageEngine EventLog Analyzer是一款企业级Web服务器日志监控与审计工具,支持Apache、IIS、Nginx等主流服务器,实现日志集中管理、实时威胁检测、合规报表生成及可视化分析,助力企业应对安全攻击与合规挑战,提升运维效率。
436 1
|
11月前
|
安全 Linux Shell
使用SCP命令在CentOS 7上向目标服务器传输文件
以上步骤是在CentOS 7系统上使用SCP命令进行文件传输的基础,操作简洁,易于理解。务必在执行命令前确认好各项参数,尤其是目录路径和文件名,以避免不必要的传输错误。
991 17
|
11月前
|
自然语言处理 Unix Linux
解决服务器中Jupyter笔记本的文件名字符编码问题
通过上述步骤,可以有效解决Jupyter笔记本的文件名字符编码问题,确保所有文件能在服务器上正常访问并交互,避免因编码问题引起的混淆和数据丢失。在处理任何编码问题时,务必谨慎并确保备份,因为文件名变更是
393 17
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
647 69
|
11月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
2761 0
|
存储 监控 API
【Azure App Service】分享使用Python Code获取App Service的服务器日志记录管理配置信息
本文介绍了如何通过Python代码获取App Service中“Web服务器日志记录”的配置状态。借助`azure-mgmt-web` SDK,可通过初始化`WebSiteManagementClient`对象、调用`get_configuration`方法来查看`http_logging_enabled`的值,从而判断日志记录是否启用及存储方式(关闭、存储或文件系统)。示例代码详细展示了实现步骤,并附有执行结果与官方文档参考链接,帮助开发者快速定位和解决问题。
367 22
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
603 9
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
1210 55