ZBLOG

go 实现指定目录下文件通过ssh来上传服务器的例子

下面是一个使用 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/sshgithub.com/pkg/sftp 库来实现 SSH 连接和文件上传功能。需要将 localPath 设置为本地文件所在的目录,remotePath 设置为服务器上的文件存放目录,serverAddress 设置为服务器地址,usernamepassword 设置为登录用户名和密码。请注意,这只是一个基本示例,请根据实际情况进行适当修改和扩展。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=8860

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?