代码加入SFTP Go ---(小白篇5)

在 Go 中,可以使用官方的 **golang.org/x/crypto/ssh** 包和第三方库 **github.com/pkg/sftp** 来实现 SFTP 功能。以下是完整的示例代码,展示如何在 Go 中接入 SFTP 服务并执行文件上传、下载和目录操作。

1.服务器上加入SFTP------(小白篇 1)

2.加入SFTP 用户------(小白篇 2)
3.代码加入SFTP JAVA ---(小白篇3)

4.代码加入SFTP Python ---(小白篇4

5.代码加入SFTP Go ---(小白篇5)

1. 安装依赖

使用以下命令安装 SFTP 库:

bash 复制代码
go get github.com/pkg/sftp
go get golang.org/x/crypto/ssh

2. 示例代码

go 复制代码
package main

import (
	"fmt"
	"log"
	"os"

	"github.com/pkg/sftp"
	"golang.org/x/crypto/ssh"
)

func main() {
	// SFTP 服务器信息
	const (
		SFTP_HOST     = "your-server-ip"
		SFTP_PORT     = 22
		SFTP_USER     = "newuser"
		SFTP_PASSWORD = "yourpassword"
	)

	// 建立 SFTP 客户端连接
	client, err := connect(SFTP_HOST, SFTP_PORT, SFTP_USER, SFTP_PASSWORD)
	if err != nil {
		log.Fatalf("Failed to connect to SFTP server: %v", err)
	}
	defer client.Close()

	fmt.Println("SFTP connection established.")

	// 上传文件
	localFile := "local_file.txt"
	remoteFile := "/uploads/file.txt"
	if err := uploadFile(client, localFile, remoteFile); err != nil {
		log.Printf("Failed to upload file: %v", err)
	}

	// 下载文件
	downloadFile := "downloaded_file.txt"
	if err := downloadFileFromSFTP(client, remoteFile, downloadFile); err != nil {
		log.Printf("Failed to download file: %v", err)
	}

	// 列出远程目录文件
	remoteDir := "/uploads"
	if err := listFiles(client, remoteDir); err != nil {
		log.Printf("Failed to list files: %v", err)
	}
}

// 连接到 SFTP 服务器
func connect(host string, port int, user, password string) (*sftp.Client, error) {
	// 配置 SSH 客户端
	config := &ssh.ClientConfig{
		User: user,
		Auth: []ssh.AuthMethod{
			ssh.Password(password),
		},
		HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 忽略主机密钥检查(生产环境需替换)
	}

	// 建立 SSH 客户端连接
	addr := fmt.Sprintf("%s:%d", host, port)
	conn, err := ssh.Dial("tcp", addr, config)
	if err != nil {
		return nil, fmt.Errorf("failed to dial SSH: %w", err)
	}

	// 创建 SFTP 客户端
	client, err := sftp.NewClient(conn)
	if err != nil {
		return nil, fmt.Errorf("failed to create SFTP client: %w", err)
	}

	return client, nil
}

// 上传文件
func uploadFile(client *sftp.Client, localFile, remoteFile string) error {
	srcFile, err := os.Open(localFile)
	if err != nil {
		return fmt.Errorf("failed to open local file: %w", err)
	}
	defer srcFile.Close()

	dstFile, err := client.Create(remoteFile)
	if err != nil {
		return fmt.Errorf("failed to create remote file: %w", err)
	}
	defer dstFile.Close()

	_, err = dstFile.ReadFrom(srcFile)
	if err != nil {
		return fmt.Errorf("failed to write to remote file: %w", err)
	}

	fmt.Printf("File uploaded: %s to %s\n", localFile, remoteFile)
	return nil
}

// 下载文件
func downloadFileFromSFTP(client *sftp.Client, remoteFile, localFile string) error {
	srcFile, err := client.Open(remoteFile)
	if err != nil {
		return fmt.Errorf("failed to open remote file: %w", err)
	}
	defer srcFile.Close()

	dstFile, err := os.Create(localFile)
	if err != nil {
		return fmt.Errorf("failed to create local file: %w", err)
	}
	defer dstFile.Close()

	_, err = dstFile.ReadFrom(srcFile)
	if err != nil {
		return fmt.Errorf("failed to write to local file: %w", err)
	}

	fmt.Printf("File downloaded: %s to %s\n", remoteFile, localFile)
	return nil
}

// 列出远程目录中的文件
func listFiles(client *sftp.Client, remoteDir string) error {
	files, err := client.ReadDir(remoteDir)
	if err != nil {
		return fmt.Errorf("failed to read remote directory: %w", err)
	}

	fmt.Printf("Files in directory %s:\n", remoteDir)
	for _, file := range files {
		fmt.Println(" -", file.Name())
	}

	return nil
}

3. 代码说明

  1. 连接到 SFTP 服务器 :
    • 使用 ssh.Dial 建立 SSH 连接。
    • 创建 SFTP 客户端通过 sftp.NewClient
  2. 上传文件 :
    • 本地文件通过 os.Open 打开。
    • 使用 client.Create 创建远程文件,并将本地文件内容写入。
  3. 下载文件 :
    • 使用 client.Open 打开远程文件。
    • 将文件内容写入本地新文件。
  4. 列出远程目录 :
    • 使用 client.ReadDir 列出远程目录中的文件。

4. 使用方式

  1. 替换以下变量值为实际的 SFTP 服务器信息:
    • SFTP_HOST
    • SFTP_USER
    • SFTP_PASSWORD
    • 本地文件路径和远程文件路径。
  2. 运行代码:
bash 复制代码
go run main.go

5. 注意事项

  • 主机密钥验证 :
    • 示例中使用了 ssh.InsecureIgnoreHostKey() 来忽略主机密钥检查。
    • 在生产环境中,应替换为加载已知主机文件,例如:
go 复制代码
ssh.FixedHostKey(<host-key>)
  • 权限问题 :
    • 确保 SFTP 用户有远程目录的写权限。
  • 错误处理 :
    • 错误会打印到控制台,方便调试。

通过此代码,您可以在 Go 中轻松接入 SFTP 服务并完成基本文件操作!

相关推荐
Scott9999HH5 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
GetcharZp5 小时前
抛弃低效SSH!这套Ansible+Web可视化神器,让你天天准点下班!
后端
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海6 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
weixin_446260859 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
人邮异步社区9 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大10 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf