Go远程服务器上传文件 | go


import (
	"fmt"
	"log"
	"os"
	"path"
	"time"

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

func pwdAuthConnect(sshHost, sshUser, sshPassword string, sshPort int) (*ssh.Client, error) {
	config := ssh.ClientConfig{
		Timeout:         5 * time.Second,
		User:            sshUser,
		Auth:            []ssh.AuthMethod{ssh.Password((sshPassword))},
		HostKeyCallback: ssh.InsecureIgnoreHostKey(),
	}
	addr := fmt.Sprintf("%s:%d", sshHost, sshPort)
	Client, err := ssh.Dial("tcp", addr, &config)
	if err != nil {
		log.Fatal("连接服务器失败", err)
		return nil, err
	}
	return Client, err
}

// CreateSftp 创建sftp会话
func CreateSftp(sshHost, sshUser, sshPassword string, sshPort int) (*sftp.Client, error) {
	// 连接Linux服务器
	conn, err := pwdAuthConnect(sshHost, sshUser, sshPassword, sshPort)
	if err != nil {
		fmt.Println("连接Linux服务器失败", err)
		panic(err)
	}
	//defer conn.Close()

	// 创建sftp会话
	client, err := sftp.NewClient(conn)
	if err != nil {
		return nil, err
	}
	//defer client.Close()
	return client, nil
}

func main() {
	client, err := CreateSftp("192.168.225.146", "root", "123456", 22)
	if err != nil {
		return
	}
	defer client.Close()

	// 1.浏览服务目录**
	w := client.Walk("/root")
	for w.Step() {
		if w.Err() != nil {
			continue
		}
		fmt.Println(w.Path())
	}
	// 2.服务器创建文件**
	f, err := client.Create("/tmp/kela.txt")
	if err != nil {
		panic(err)
	}
	_, err = f.Write([]byte("Hello World!\n"))
	if err != nil {
		panic(err)
	}
	f.Close()
	// 3.查看服务器文件**
	fi, err := client.Lstat("/tmp/kela.txt")
	if err != nil {
		panic(err)
	}
	fmt.Printf("%#v\n", fi)
	// 4.上传文件**
	localFilePath := "C:/MCDiamond/Files/Study/miaokela/go.sum"
	remoteFilePath := "/root/"
	// 	1) 打开本地文件
	srcFile, err := os.Open(localFilePath)
	if err != nil {
		panic(err)
	}
	defer srcFile.Close()
	// 	绝对路径中获取文件名
	remoteFileName := path.Base(localFilePath)
	fmt.Println(remoteFileName)
	// 	2) 打开服务器文件
	dstFile, err := client.Create(path.Join(remoteFilePath, remoteFileName))
	if err != nil {
		panic(err)
	}
	defer dstFile.Close()
	// 	3) 将本地文件内容写入服务器文件
	buf := make([]byte, 1024)
	for {
		n, _ := srcFile.Read(buf) // 将文件2进制内容写入buf字节切片中
		if n == 0 {
			break
		}
		dstFile.Write(buf)
	}
	fmt.Println("文件上传完毕")
}

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM