Go实现SFTP客户端

我将提供一个封装了 SFTP 客户端操作的简单例子,以确保通用性。这个例子包括连接、断开连接、上传文件、下载文件、列出目录和创建目录的基本操作。

这个 SFTPClient 结构体包含了一个 *sftp.Client 字段,我们通过实现方法来提供基本的 SFTP 操作。NewClient 函数用于创建和返回一个新的 SFTPClient 实例。其他函数封装了上传、下载、列出目录和创建目录等操作。
请注意,HostKeyCallback 设置为 ssh.InsecureIgnoreHostKey() 会忽略服务器的 SSH 主机密钥验证,这在生产环境中是不安全的。在实际使用中,应该提供一个适当的回调函数来验证服务器的主机密钥。

package mainimport ("fmt""io""log""os""github.com/pkg/sftp""golang.org/x/crypto/ssh"
)type SFTPClient struct {client *sftp.Client
}// NewClient 创建一个新的 SFTP 客户端实例并连接到服务器
func NewClient(username, password, host string, port int) (*SFTPClient, error) {// 设置 SSH 配置config := &ssh.ClientConfig{User: username,Auth: []ssh.AuthMethod{ssh.Password(password),},HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 注意:这不安全,并且应该在生产环境中避免使用}// 连接到 SSH 服务器addr := fmt.Sprintf("%s:%d", host, port)sshConn, err := ssh.Dial("tcp", addr, config)if err != nil {return nil, err}// 启动 SFTP 子系统client, err := sftp.NewClient(sshConn)if err != nil {return nil, err}return &SFTPClient{client: client}, nil
}// Close 关闭 SFTP 客户端连接
func (c *SFTPClient) Close() error {return c.client.Close()
}// UploadFile 将本地文件上传到 SFTP 服务器
func (c *SFTPClient) UploadFile(localPath, remotePath string) error {srcFile, err := os.Open(localPath)if err != nil {return err}defer srcFile.Close()dstFile, err := c.client.Create(remotePath)if err != nil {return err}defer dstFile.Close()_, err = io.Copy(dstFile, srcFile)return err
}// DownloadFile 从 SFTP 服务器下载文件到本地
func (c *SFTPClient) DownloadFile(remotePath, localPath string) error {srcFile, err := c.client.Open(remotePath)if err != nil {return err}defer srcFile.Close()dstFile, err := os.Create(localPath)if err != nil {return err}defer dstFile.Close()_, err = io.Copy(dstFile, srcFile)return err
}// ListDirectory 列出 SFTP 服务器上的目录内容
func (c *SFTPClient) ListDirectory(remotePath string) ([]os.FileInfo, error) {return c.client.ReadDir(remotePath)
}// MakeDirectory 在 SFTP 服务器上创建目录
func (c *SFTPClient) MakeDirectory(remotePath string) error {return c.client.Mkdir(remotePath)
}// RemoveFile 删除 SFTP 服务器上的文件
func (c *SFTPClient) RemoveFile(remotePath string) error {return c.client.Remove(remotePath)
}// RemoveDirectory 删除 SFTP 服务器上的目录
func (c *SFTPClient) RemoveDirectory(remotePath string) error {return c.client.RemoveDirectory(remotePath)
}func main() {// SFTP 服务器设置host := "127.0.0.1"port := 9527username := "root"password := "123456"// 初始化 SFTP 客户端client, err := NewClient(username, password, host, port)if err != nil {log.Fatalf("Error initializing SFTP client: %v", err)}defer client.Close()// 上传本地文件到 SFTP 服务器localFilePath := "./localfile.txt"remoteFilePath := "./remotefile.txt"err = client.UploadFile(localFilePath, remoteFilePath)if err != nil {log.Fatalf("Error uploading file: %v", err)}fmt.Println("File uploaded successfully.")// 从 SFTP 服务器下载文件到本地localDownloadPath := "./localfile_downloaded.txt"err = client.DownloadFile(remoteFilePath, localDownloadPath)if err != nil {log.Fatalf("Error downloading file: %v", err)}fmt.Println("File downloaded successfully.")// 列出 SFTP 服务器上的目录内容remoteDirectory := "./"files, err := client.ListDirectory(remoteDirectory)if err != nil {log.Fatalf("Error listing directory: %v", err)}fmt.Println("Directory listing:")for _, file := range files {fmt.Printf(" - %s\n", file.Name())}// 在 SFTP 服务器上创建目录remoteNewDirectory := "./newdir"err = client.MakeDirectory(remoteNewDirectory)if err != nil {log.Fatalf("Error creating directory: %v", err)}fmt.Println("Directory created successfully.")// 删除 SFTP 服务器上的文件err = client.RemoveFile(remoteFilePath)if err != nil {log.Fatalf("Error removing file: %v", err)}fmt.Println("File removed successfully.")// 删除 SFTP 服务器上的目录err = client.RemoveDirectory(remoteNewDirectory)if err != nil {log.Fatalf("Error removing directory: %v", err)}fmt.Println("Directory removed successfully.")
}

在这个示例中,我们首先通过 NewClient 函数初始化了一个 SFTP 客户端连接。然后,我们使用该客户端上传一个文件,下载一个文件,列出目录内容,以及在 SFTP 服务器上创建一个新目录。每个操作之后,我们都检查错误并在终端输出结果。
在实际部署中,您可能需要替换 host, port, username, 和 password 变量的值以匹配您的 SFTP 服务器的凭据和地址。此外,您也需要确保本地文件路径和远程文件路径是正确的。
请记住,错误处理非常重要,特别是在处理文件操作时。在生产环境中,还应该考虑更安全的认证方法,比如使用 SSH 密钥,以及对服务器主机密钥进行适当的验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/35303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简化收支记录,只留关键日期! 一键掌握财务流动,高效管理您的每一笔收支

在繁忙的生活中,管理个人或家庭的财务收支变得尤为重要。然而,传统的记账方式往往繁琐且复杂,让人望而却步。今天,我们为您推荐一款简洁易用的记账神器——晨曦记账本,让您轻松记录收支,只显示日期&#xf…

揭秘!这款电路设计工具让学校师生都爱不释手——SmartEDA的魔力何在?

随着科技的飞速发展,电子设计已成为学校师生们不可或缺的技能之一。而在众多的电路设计工具中,有一款名为SmartEDA的工具,凭借其强大的功能和友好的用户体验,迅速赢得了广大师生的青睐。今天,就让我们一起探索SmartEDA…

Leetcode TOP5 题目和解答:这里只提供一种解题思路,希望引导大家持续学习,可以采用FlowUs息流记录自己的学习

LeetCode 是一个在线编程平台,它提供了大量的算法题目供用户练习。 TOP5题目通常指的是 LeetCode 网站上最受欢迎的前5道题目。 以下是 LeetCode TOP5 题目的列表以及它们常见的解题思路和代码示例。 题目1 两数之和 两数之和 - 1. Two Sum Given an array of int…

html5 video去除边框

video的属性: autoplay 视频在就绪后自动播放。 controls 显示控件,比如播放按钮。 height 设置视频播放器的高度。 width 设置视频播放器的宽度。 loop 循环播放 muted 视频的音频输出静音。 poster 视频加载时显示的图像,或者在用户点击播…

短视频利器 ffmpeg (2)

ffmpeg 官网这样写到 Converting video and audio has never been so easy. 如何轻松简单的使用: 1、下载 官网:http://www.ffmpeg.org 安装参考文档: https://blog.csdn.net/qq_36765018/article/details/139067654 2、安装 # 启用RPM …

clonezilla(再生龙)克隆物理机linux系统,然后再去另一台电脑安装

前言: 总共需要2个u盘,一个装再生龙系统,一个是使用再生龙把硬盘备份到另一个盘里面,恢复的时候,先使用再生龙引导,然后再插上盘进行复制 1.制作启动u盘 1.1下载再生龙Clonezilla 下載 1.2下载UltraISO(https://cn.ultraiso.net/uiso9_cn.exe) 1.3 打开UltraISO,选择co…

聚类模型的算法性能评价

一、概述 作为机器学习领域的重要内容之一,聚类模型在许多方面能够发挥举足轻重的作用。所谓聚类,就是通过一定的技术方法将一堆数据样本依照其特性划分为不同的簇类,使得同一个簇内的样本有着更相近的属性。依不同的实现策略,聚类…

g++、make、cmake三种方式来编译ros2的C++节点

上面我们用g、make、cmake三种方式来编译ros2的C节点。用cmake虽然成功了,但是CMakeLists.txt的内容依然非常的臃肿,我们需要将其进一步的简化 ROS2前置基础教程 | 小鱼教你用CMake依赖查找流程_ros2cmakelist-CSDN博客

力扣哈希刷题——总结篇【三】

前言 哈希篇题目完成,学到那些方法呢?回顾一下。 方法 (1)“判断一个元素有没有在某个集合中出现过”——可以考虑哈希结构。 (2)哈希结构:数组?set?map?选…

华为HCIP Datacom H12-821 卷16

1.判断题 在 VRRP 中,当设备状态变为 Master 后,,会立刻发送免费 ARP 来刷新下游设备的 MAC 表项,从而把用户的流量引到此台设备上来 A、对 B、错 正确答案: A 解析: 2.判断题 路由选择工具 route- policy 能够基于预先定义的条件来进行过滤并设置 BGP

canvas画布旋转问题

先说一下为什么要旋转的目的:因为在画布上签名,在不同的设备上我需要不同方向的签名图片,电脑是横屏,手机就是竖屏,所以需要把手机的签名旋转270,因此写了这个方法。 关于画布旋转的重点就是获取到你的画布…

typescript 基本类型

基本类型注解 任意类型 let value: any ;string类型 let message: string hello world;number类型 let orderid: number 0;booblean类型 let openDiolog: boolean false;字符串类型数组 let teachers: string[]; const students: string[] [张, 王];数字类型数组 c…

软件著作权的申请信息在哪看?

软著对于企业来说是一个非常有价值的知识产权。软著可以保证企业自身的利益得到合法的保护,并且可以反映企业的技术创新能力,能够让企业提高自己的竞争力,在申报一些补贴,招标时作为加分项。因此,很多科技型企业都会申…

1982Springboot宠物美容院管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot宠物美容院管理系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系 统具有完整的源代码和数据库…

DNS的工作原理

DNS的工作原理 DNS(Domain Name System)是一个分布式数据库系统,负责将人类可读的域名转换为互联网上计算机可以理解的IP地址。其工作原理大致分为以下几个步骤: 用户在浏览器或应用中输入域名:当用户键入一个网站地…

RisingWave 用户定义函数 (二): Rust x WebAssembly

RisingWave 支持用户使用 Rust 语言编写自定义函数(UDF)。Rust UDF 会被编译到 WebAssembly,一种最初诞生于浏览器之中的虚拟机汇编语言。随后,这些 UDF 会在 RisingWave 进程中内嵌的 WebAssembly 虚拟机上被即时编译&#xff08…

【QT】Widget

目录 widget常用属性及其作用 enabled geomtry window frame window frame的影响 相关API windowTitle windowIcon qrc机制 qrc使用方式 自定义鼠标图片 设置字体样式 设置鼠标悬停提示 toolTip 控件获取焦点 styleSheet widget常用属性及其作用 属性作用…

手把手教你打造高精度STM32数字时钟,超详细步骤解析

STM32数字时钟项目详解 1. 项目概述 STM32数字时钟是一个集成了时间显示、闹钟功能、温湿度检测等多功能于一体的小型电子设备。它利用STM32的实时时钟(RTC)功能作为核心,配合LCD显示屏、按键输入、温湿度传感器等外设,实现了一个功能丰富的数字时钟系统。 2. 硬件组成 STM…

关于FreeRTOS在MCU(微控制器)和PC(个人计算机)上的源代码的区别

关于FreeRTOS在MCU(微控制器)和PC(个人计算机)上的源代码是否相同,我们可以从以下几个方面来详细分析和总结: 核心源代码: FreeRTOS的核心源代码(如tasks.c和list.c等)在…

IND83081芯片介绍(二)

七、典型应用 上面显示了独立的CAN收发器,而下面则显示了多个iND83081可以共享同一个CAN收发器的应用场景。通过这些连接,iND83081可以实现对多个LED的驱动和控制,同时与外部MCU进行通信 。 八、ELINS接口 1.ELINS简介 ELINS是一种从接口&a…