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("文件上传完毕") }