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实时生图绘板
相关文章
|
2月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
123 2
|
5月前
|
机器学习/深度学习 存储 监控
内部文件审计:企业文件服务器审计对网络安全提升有哪些帮助?
企业文件服务器审计是保障信息安全、确保合规的关键措施。DataSecurity Plus 是由卓豪ManageEngine推出的审计工具,提供全面的文件访问监控、实时异常告警、用户行为分析及合规报告生成功能,助力企业防范数据泄露风险,满足GDPR、等保等多项合规要求,为企业的稳健发展保驾护航。
168 0
|
5月前
|
安全 Linux Shell
使用SCP命令在CentOS 7上向目标服务器传输文件
以上步骤是在CentOS 7系统上使用SCP命令进行文件传输的基础,操作简洁,易于理解。务必在执行命令前确认好各项参数,尤其是目录路径和文件名,以避免不必要的传输错误。
599 17
|
5月前
|
自然语言处理 Unix Linux
解决服务器中Jupyter笔记本的文件名字符编码问题
通过上述步骤,可以有效解决Jupyter笔记本的文件名字符编码问题,确保所有文件能在服务器上正常访问并交互,避免因编码问题引起的混淆和数据丢失。在处理任何编码问题时,务必谨慎并确保备份,因为文件名变更是
212 17
|
5月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
1231 0
|
8月前
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
410 69
|
9月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
8月前
|
Ubuntu 安全 网络安全
在Ubuntu系统下使用vsftpd配置FTP服务器的步骤
以上就是在Ubuntu系统下使用vsftpd配置FTP服务器的步骤。这些步骤都是基础的,但足够让你建立一个简单的FTP服务器。如果你需要更高级的功能,例如SSL加密、虚拟用户等,你可能需要进一步研究vsftpd的配置选项。
493 13
|
安全 编译器 Linux
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例
本文深入解析了利用缓冲区溢出漏洞对FTP服务器进行远程攻击的技术,通过分析FreeFlow FTP 1.75版本的漏洞,展示了如何通过构造过长的用户名触发缓冲区溢出并调用计算器(`calc.exe`)。文章详细介绍了攻击原理、关键代码组件及其实现步骤,并提出了有效的防范措施,如输入验证、编译器保护和安全编程语言的选择,以保障系统的安全性。环境搭建基于Windows XP SP3和Kali Linux,使用Metasploit Framework进行攻击演示。请注意,此内容仅用于教育和研究目的。
417 4
|
网络协议 文件存储 Windows
Windows Server 2019 FTP服务器搭建
Windows Server 2019 FTP服务器搭建
425 0