下面是一个使用 Go 通过 SSH 将指定目录下的文件上传到服务器的简单示例:
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"golang.org/x/crypto/ssh"
)
func main() {
localPath := "/path/to/local/files" // 本地文件所在目录
remotePath := "/path/to/remote/files" // 服务器文件存放目录
serverAddress := "example.com:22" // 服务器地址,需要替换为实际的值
username := "your_username" // 登录用户名,需要替换为实际的值
password := "your_password" // 登录密码,需要替换为实际的值
err := uploadFiles(localPath, remotePath, serverAddress, username, password)
if err != nil {
fmt.Println("上传文件时出错:", err)
return
}
fmt.Println("文件上传成功")
}
func uploadFiles(localPath string, remotePath string, serverAddress string, username string, password string) error {
authMethod := ssh.Password(password)
config := &ssh.ClientConfig{
User: username,
Auth: []ssh.AuthMethod{authMethod},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
conn, err := ssh.Dial("tcp", serverAddress, config)
if err != nil {
return fmt.Errorf("无法连接到服务器:%v", err)
}
defer conn.Close()
sftpClient, err := sftp.NewClient(conn)
if err != nil {
return fmt.Errorf("创建SFTP客户端失败:%v", err)
}
defer sftpClient.Close()
err = filepath.Walk(localPath, func(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
file, err := os.Open(path)
if err != nil {
return fmt.Errorf("打开文件失败:%v", err)
}
defer file.Close()
// 获取相对路径,用于在服务器上创建目录和上传文件
relativePath := strings.TrimPrefix(path, localPath+"/")
remoteFilePath := filepath.Join(remotePath, relativePath)
err = sftpClient.MkdirAll(filepath.Dir(remoteFilePath))
if err != nil {
return fmt.Errorf("在服务器上创建目录失败:%v", err)
}
// 在服务器上创建文件
remoteFile, err := sftpClient.Create(remoteFilePath)
if err != nil {
return fmt.Errorf("在服务器上创建文件失败:%v", err)
}
defer remoteFile.Close()
// 从本地读取文件内容并写入到远程文件
content, err := ioutil.ReadAll(file)
if err != nil {
return fmt.Errorf("读取本地文件内容失败:%v", err)
}
_, err = remoteFile.Write(content)
if err != nil {
return fmt.Errorf("将文件内容写入远程文件时出错:%v", err)
}
fmt.Printf("已上传文件: %s\n", path)
}
return nil
})
if err != nil {
return fmt.Errorf("遍历本地目录时出错:%v", err)
}
return nil
}
以上代码使用了 golang.org/x/crypto/ssh 和 github.com/pkg/sftp 库来实现 SSH 连接和文件上传功能。需要将 localPath 设置为本地文件所在的目录,remotePath 设置为服务器上的文件存放目录,serverAddress 设置为服务器地址,username 和 password 设置为登录用户名和密码。请注意,这只是一个基本示例,请根据实际情况进行适当修改和扩展。
内容由零声教学AI助手提供,问题来源于学员提问




