代码加入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 服务并完成基本文件操作!

相关推荐
forNoWhat2 分钟前
java小知识点:比较器
java·开发语言
坐井观老天8 分钟前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
皓木.11 分钟前
(自用)配置文件优先级、SpringBoot原理、Maven私服
java·spring boot·后端
代码中の快捷键15 分钟前
java开发面试有2年经验
java·开发语言·面试
Marzlam16 分钟前
sql server索引优化语句
开发语言·数据库
谢家小布柔21 分钟前
Java 中的字符串
java·开发语言
码老白21 分钟前
【老白学 Java】HashSet 应用 - 卡拉 OK(五)
java·开发语言
i7i8i9com22 分钟前
java 1.8+springboot文件上传+vue3+ts+antdv
java·spring boot·后端
秋意钟22 分钟前
Spring框架处理时间类型格式
java·后端·spring
我叫啥都行33 分钟前
计算机基础复习12.22
java·jvm·redis·后端·mysql