通过FTP获取服务器时间,最可靠的方式是利用MDTM命令获取文件最后修改时间,或借助SITE TIME命令(需服务器支持),但无法直接获取服务器当前系统时间。
为什么要获取服务器时间
文件同步、日志分析、跨时区协作时,需要核对服务器时间戳,常见场景包括:
- 定时任务触发前确认服务器时间是否准确
- 对比本地与远程文件的时间差异,决定是否覆盖
- 脚本中记录操作时间戳,需要与服务器时间对齐
但FTP协议本身没有“获取当前时间”的标准命令,只能通过间接方式推断。
ftp 获取服务器时间 命令 详解
MDTM命令获取文件时间
MDTM是FTP协议中用于返回文件最后修改时间的命令,格式为:
MDTM 文件名
服务器返回类似 213 20260314153000 的信息,格式为 YYYYMMDDHHMMSS,通常为UTC时间,操作步骤:
- 登录FTP服务器
- 执行
MDTM 任意一个已知文件 - 解析返回的时间字符串
注意: 该时间对应的是文件修改时间,并非服务器当前时间,但如果文件刚上传或创建,可近似视为服务器当前时间,多数情况下,获取文件时间戳已足够满足同步需求。
SITE TIME命令(部分服务器支持)
部分FTP服务器(如ProFTPD、vsftpd扩展)提供 SITE TIME 命令,直接返回服务器当前时间,用法:
SITE TIME
返回格式因服务器而异,常见如 200 Time is 2026-03-14 15:30:00,但该命令并非标准,需测试服务器是否支持。
通过MLSD获取时间戳
MLSD命令返回的目录列表包含事实标准的时间戳字段(如 modify=20260314153000),可以解析出多个文件的时间,但同样是文件修改时间。
ftp 获取服务器时间 linux 下的实战
使用命令行ftp客户端
直接在终端操作:
$ ftp 服务器地址
ftp> MDTM index.html
如果服务器支持SITE命令:
ftp> quote SITE TIME
注意: quote 用于发送原始命令。
使用lftp工具
lftp 支持 time 命令(部分版本),直接获取服务器时间:
$ lftp -u user,pass 服务器地址
lftp :~> time
或者通过脚本:
lftp -c "open -u user,pass 服务器地址; time"
脚本编写示例
用bash脚本自动获取并判断:
#!/bin/bash HOST="ftp.example.com" USER="user" PASS="pass" FILE="test.txt" # 上传一个临时文件,然后获取其时间戳 echo "test" > /tmp/$FILE ftp -inv $HOST <<EOF user $USER $PASS put /tmp/$FILE $FILE MDTM $FILE delete $FILE quit EOF
解析返回的时间即可。注意: 上传后立即获取,此时文件时间与服务器当前时间非常接近。
ftp 获取服务器时间 windows 下的操作
使用命令行ftp
Windows自带ftp客户端,同样可发送MDTM命令:
C:\> ftp 服务器地址
ftp> MDTM 文件名
但Windows命令行ftp不支持直接发送原始命令(如SITE),需借助第三方工具或脚本。
使用PowerShell或脚本
PowerShell配合 System.Net.FtpWebRequest 可获取文件时间戳:
$request = [System.Net.FtpWebRequest]::Create("ftp://服务器地址/文件")
$request.Method = [System.Net.WebRequestMethods+Ftp]::GetDateTimestamp
$response = $request.GetResponse()
$response.LastModified
更简单的方式:使用 curl(Windows 10/11自带)或 wget 的 --timestamping 选项获取文件时间。
不同方法的优缺点对比
| 方法 | 优点 | 缺点 |
|---|---|---|
| MDTM命令 | 标准命令,大多数服务器支持 | 获取的是文件时间,非服务器当前时间 |
| SITE TIME | 直接返回服务器当前时间 | 非标准,兼容性差 |
| MLSD | 返回多个文件时间,便于批量处理 | 同样基于文件时间戳 |
| 脚本(上传临时文件) | 可精确获得当前时间 | 需文件写入权限,耗时略长 |
常见问题与注意事项
时区差异
MDTM返回的时间通常是UTC,而服务器本地时间可能不同,如果服务器配置返回本地时间,则需确认,建议在脚本中明确时区转换逻辑。
服务器权限
部分服务器限制MDTM命令或文件写入权限,导致无法获取时间,此时可尝试 SITE TIME 或使用其他协议(如SFTP、SSH)替代。
自动化脚本中的时间获取
在定时任务中,每次获取时间都会产生一次网络开销,如果任务频率高,建议在任务开始时获取一次并缓存,而非每次操作都查询。
Q&A:关于ftp 获取服务器时间的常见问题
问题1:FTP能直接获取服务器当前系统时间吗?
不能,FTP协议没有标准命令返回服务器当前时间,只能通过文件时间戳间接推断,或依赖非标准扩展命令(如SITE TIME),如果需要精确的系统时间,建议使用SFTP或SSH,它们可以执行 date 命令。
问题2:MDTM命令获取的文件时间是否等于服务器当前时间?
不等于,MDTM返回的是文件最后一次修改的时间,与服务器当前时间可能相差几秒甚至更久(取决于文件修改时间),如果文件刚上传,时间差最小,对于文件同步场景,直接比较文件时间戳即可,不需要服务器当前时间。
问题3:SITE TIME命令在所有服务器上都可用吗?
仅部分FTP服务器支持,如ProFTPD、vsftpd开启扩展后,使用前需测试,如果服务器不支持,会返回 500 Unknown command 错误,建议优先使用MDTM加临时文件的方法,兼容性更好。
无论是Linux还是Windows,最通用的做法是:上传一个临时文件,用MDTM获取其时间戳,再删除该文件,此方法无需依赖服务器额外配置,且时间精度足够满足大多数同步需求。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/558610.html

