【sftp 服务器的简单了解】
项目上有服务器文件操作的需求, 遇到的问题和调试过程记录如下:
简单了解SFTP:
在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果对网络安全性要求更高时,可以使用SFTP代替FTP(来源:百度百科)
调试背景:
Sftp传输协议下的服务器文件接收与处理:(因为linux环境与windows环境的区别,测试存在一定不便,且服务器配置不同,所支持的ssh协议版本也不同);
问题与收获:
关于对服务器中外围接口推送的压缩文件处理:SFTP协议,接收压缩文件并进行解析: 其中最主要的就是读取文件,解压文件,备份文件,删除文件。
开发时出现的错误基本上是由于无权限和路径错误导致(ps:路径错误也会显示无权限),另外服务器环境与本地开发环境不同,所以测试很容易出现差异。 根据开发需要,第一步要建立与ftp服务器的连接,这个时候抛出了异常信息:[could not parse reponse code],但是详细信息其实是在debug内的detailMessage内:[Could not parse response code. Server Reply: SSH-2.0-OpenSSH_6.6.1] ,百度可知原因是FTPClient不支持通过协议SSH2进行SFTP连接,只能更换方法实现,可以使用com.jcraft.jsch.JSch提供的SSH解决问题,即用ChannelSftp 代替FTPClient。
服务器顺利连接后,访问文件出现了问题: Permission denied (没有权限访问),以及备份文件的时候出现 :No such file, 出现这两个问题的原因有二:路径不正确(这点也会导致报错无权限..),以及参数错误(比如备份文件时路径名要具体到/xx/wz.zip,如果只写路径或者文件名前缀是不行的)。
关于linux上的路径分隔符目前有三种说法:\\xxx\\yy\\zz.txt ,或者/xxx/yy/zz.txt,或者使用File.separator作为分隔符,这样会根据环境自动使用/或者\\进行分割。windows本地测试很多方法是没法顺利访问服务器文件的,比如rename方法等(简单说一下这个方法:这个方法如果路径相同则会进行文件重命名,路径不同则会进行文件移动,备份文件可以用这个方法。)
PS:sftp的一些方法在本地运行可能会出现权限问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?