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