如何从SFTP文件夹获取最新文件?无SSH连接需自动化实现
实现SFTP自动化下载最新文件的方案
当然可以实现!既然你只能用SFTP、没法SSH,还要全自动化,咱们可以通过解析SFTP的ls -lrt输出拿到最新文件名,再自动执行get命令下载。下面是具体的思路和可直接用的脚本示例:
核心思路
- 利用SFTP的
ls -lrt命令:-r会把文件按时间逆序排列,最新的文件会出现在输出的最后一行(排除最后的sftp>提示符) - 用自动化工具(比如
expect)模拟SFTP的交互流程:先登录、执行ls -lrt、解析输出提取最新文件名、最后下载该文件
自动化脚本示例(Expect)
Expect是专门处理交互式命令行的工具,非常适合这种SFTP自动化场景。先确保你的系统已经安装了Expect(Linux下用apt install expect或yum install expect就能装),然后创建下面的脚本:
#!/usr/bin/expect -f # -------------------------- 配置参数 -------------------------- set user "your_username" # SFTP用户名 set server "your_server" # SFTP服务器地址 set password "your_password" # 登录密码(用密钥登录可删掉这部分) set remote_dir "/remote/path" # 目标SFTP文件夹路径 set local_dir "/local/path" # 本地保存文件的路径 # ------------------------------------------------------------- # 启动SFTP连接 spawn sftp $user@$server # 处理登录认证 expect { "password:" { send "$password\r" exp_continue # 继续等待sftp提示符 } "sftp>" { } # 登录成功,进入SFTP交互模式 } # 切换到目标远程目录(如果默认目录不是目标文件夹的话) send "cd $remote_dir\r" expect "sftp>" # 执行ls命令并提取最新文件名 send "ls -lrt\r" expect { "sftp>" { # 把输出按行分割,取倒数第二行(最后一行是sftp>提示符) set output_lines [split $expect_out(buffer) "\n"] set latest_file_line [lindex $output_lines end-2] # 分割行内容,最后一个字段就是文件名 set latest_filename [lindex [split $latest_file_line] end] # 可选:过滤掉目录(如果目录也在列表里的话) set file_permission [lindex [split $latest_file_line] 0] if {[string index $file_permission 0] eq "-"} { # 是文件,执行下载 send "get $latest_filename $local_dir/$latest_filename\r" expect "sftp>" puts "Successfully downloaded latest file: $latest_filename" } else { puts "Latest entry is a directory, skipping download." } } } # 退出SFTP send "quit\r" expect eof
脚本关键点说明
- 认证部分:如果用SSH密钥登录SFTP,删掉密码相关的代码就行,确保本地密钥已经配置好能免密访问服务器
- 过滤目录:如果远程文件夹里有子目录,
ls -lrt会把目录也列出来,脚本里的权限判断可以跳过目录只下载文件 - 错误处理:你可以根据需要添加更多判断,比如如果远程目录为空,脚本可以输出提示并退出
使用方法
- 把脚本里的配置参数改成你自己的信息
- 给脚本加执行权限:
chmod +x sftp_download_latest.sh - 直接运行脚本:
./sftp_download_latest.sh
这样就能完全自动化地获取并下载SFTP文件夹里的最新文件啦!
内容的提问来源于stack exchange,提问作者user4836066
相关产品推荐
相关产品推荐

