在 Go 中,可以使用官方的 **golang.org/x/crypto/ssh**
包和第三方库 **github.com/pkg/sftp**
来实现 SFTP 功能。以下是完整的示例代码,展示如何在 Go 中接入 SFTP 服务并执行文件上传、下载和目录操作。
2.加入SFTP 用户------(小白篇 2)
3.代码加入SFTP JAVA ---(小白篇3)
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. 代码说明
- 连接到 SFTP 服务器 :
- 使用
ssh.Dial
建立 SSH 连接。 - 创建 SFTP 客户端通过
sftp.NewClient
。
- 使用
- 上传文件 :
- 本地文件通过
os.Open
打开。 - 使用
client.Create
创建远程文件,并将本地文件内容写入。
- 本地文件通过
- 下载文件 :
- 使用
client.Open
打开远程文件。 - 将文件内容写入本地新文件。
- 使用
- 列出远程目录 :
- 使用
client.ReadDir
列出远程目录中的文件。
- 使用
4. 使用方式
- 替换以下变量值为实际的 SFTP 服务器信息:
SFTP_HOST
SFTP_USER
SFTP_PASSWORD
- 本地文件路径和远程文件路径。
- 运行代码:
bash
go run main.go
5. 注意事项
- 主机密钥验证 :
- 示例中使用了
ssh.InsecureIgnoreHostKey()
来忽略主机密钥检查。 - 在生产环境中,应替换为加载已知主机文件,例如:
- 示例中使用了
go
ssh.FixedHostKey(<host-key>)
- 权限问题 :
- 确保 SFTP 用户有远程目录的写权限。
- 错误处理 :
- 错误会打印到控制台,方便调试。
通过此代码,您可以在 Go 中轻松接入 SFTP 服务并完成基本文件操作!