国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Golang - go語言實現sftp包上傳文件和文件夾到遠程服務器操作

go語言實現sftp包上傳文件和文件夾到遠程服務器操作

2021-03-06 00:57奔流入海 Golang

這篇文章主要介紹了go語言實現sftp包上傳文件和文件夾到遠程服務器操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

使用go語言的第三方包:github.com/pkg/sftp和golang.org/x/crypto/ssh實現文件和文件夾傳輸。

1、創建connect方法:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
func connect(user, password, host string, port int) (*sftp.Client, error) {
 var (
  auth   []ssh.AuthMethod
  addr   string
  clientConfig *ssh.ClientConfig
  sshClient *ssh.Client
  sftpClient *sftp.Client
  err   error
 )
 // get auth method
 auth = make([]ssh.AuthMethod, 0)
 auth = append(auth, ssh.Password(password))
 clientConfig = &ssh.ClientConfig{
  User:   user,
  Auth:   auth,
  Timeout:   30 * time.Second,
  HostKeyCallback: ssh.InsecureIgnoreHostKey(), //ssh.FixedHostKey(hostKey),
 }
 // connet to ssh
 addr = fmt.Sprintf("%s:%d", host, port)
 if sshClient, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
  return nil, err
 }
 // create sftp client
 if sftpClient, err = sftp.NewClient(sshClient); err != nil {
  return nil, err
 }
 return sftpClient, nil
}

2、上傳文件

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func uploadFile(sftpClient *sftp.Client, localFilePath string, remotePath string) {
 srcFile, err := os.Open(localFilePath)
 if err != nil {
  fmt.Println("os.Open error : ", localFilePath)
  log.Fatal(err)
 }
 defer srcFile.Close()
 var remoteFileName = path.Base(localFilePath)
 dstFile, err := sftpClient.Create(path.Join(remotePath, remoteFileName))
 if err != nil {
  fmt.Println("sftpClient.Create error : ", path.Join(remotePath, remoteFileName))
  log.Fatal(err)
 }
 defer dstFile.Close()
 ff, err := ioutil.ReadAll(srcFile)
 if err != nil {
  fmt.Println("ReadAll error : ", localFilePath)
  log.Fatal(err)
 }
 dstFile.Write(ff)
 fmt.Println(localFilePath + " copy file to remote server finished!")
}

3、上傳文件夾

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func uploadDirectory(sftpClient *sftp.Client, localPath string, remotePath string) {
 localFiles, err := ioutil.ReadDir(localPath)
 if err != nil {
  log.Fatal("read dir list fail ", err)
 }
 for _, backupDir := range localFiles {
  localFilePath := path.Join(localPath, backupDir.Name())
  remoteFilePath := path.Join(remotePath, backupDir.Name())
  if backupDir.IsDir() {
   sftpClient.Mkdir(remoteFilePath)
   uploadDirectory(sftpClient, localFilePath, remoteFilePath)
  } else {
   uploadFile(sftpClient, path.Join(localPath, backupDir.Name()), remotePath)
  }
 }
 fmt.Println(localPath + " copy directory to remote server finished!")
}

4、上傳測試

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func DoBackup(host string, port int, userName string, password string, localPath string, remotePath string) {
 var (
  err  error
  sftpClient *sftp.Client
 )
 start := time.Now()
 sftpClient, err = connect(userName, password, host, port)
 if err != nil {
  log.Fatal(err)
 }
 defer sftpClient.Close()
 _, errStat := sftpClient.Stat(remotePath)
 if errStat != nil {
  log.Fatal(remotePath + " remote path not exists!")
 }
 backupDirs, err := ioutil.ReadDir(localPath)
 if err != nil {
  log.Fatal(localPath + " local path not exists!")
 }
 uploadDirectory(sftpClient, localPath, remotePath)
 elapsed := time.Since(start)
 fmt.Println("elapsed time : ", elapsed)
}

補充:go實現ssh遠程機器并傳輸文件

核心依賴包:

golang.org/x/crypto/ssh

github.com/pkg/sftp

其中golang.org/x/crypto/ssh 可從github上下載,

下載地址:https://github.com/golang/crypto

ssh連接源碼(這里是根據秘鑰連接):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
var keypath = "key/id_rsa"
//獲取秘鑰
func publicKey(path string) ssh.AuthMethod {
 keypath, err := homedir.Expand(path)
 if err != nil {
 fmt.Println("獲取秘鑰路徑失敗", err)
 }
 key, err1 := ioutil.ReadFile(keypath)
 if err1 != nil {
 fmt.Println("讀取秘鑰失敗", err1)
 }
 signer, err2 := ssh.ParsePrivateKey(key)
 if err2 != nil {
 fmt.Println("ssh 秘鑰簽名失敗", err2)
 }
 return ssh.PublicKeys(signer)
}
//獲取ssh連接
func GetSSHConect(ip, user string, port int) (*ssh.Client) {
 con := &ssh.ClientConfig{
 User: user,
 Auth: []ssh.AuthMethod{publicKey(keypath)},
 HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
 return nil
 },
 }
 addr := fmt.Sprintf("%s:%d", ip, port)
 client, err := ssh.Dial("tcp", addr, con)
 if err != nil {
 fmt.Println("Dail failed: ", err)
 panic(err)
 }
 return client
}
// 遠程執行腳本
func Exec_Task(ip, user, localpath, remotepath string) int {
 port := 22
 client := GetSSHConect(ip, user, port)
 UploadFile(ip, user, localpath, remotepath, port)
 session, err := client.NewSession()
 if err != nil {
 fmt.Println("創建會話失敗", err)
 panic(err)
 }
 defer session.Close()
 remoteFileName := path.Base(localpath)
 dstFile := path.Join(remotepath, remoteFileName)
 err1 := session.Run(fmt.Sprintf("/usr/bin/sh %s", dstFile))
 if err1 != nil {
 fmt.Println("遠程執行腳本失敗", err1)
 return 2
 } else {
 fmt.Println("遠程執行腳本成功")
 return 1
 }
}

文件傳輸功能:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//獲取ftp連接
func getftpclient(client *ssh.Client) (*sftp.Client) {
 ftpclient, err := sftp.NewClient(client)
 if err != nil {
 fmt.Println("創建ftp客戶端失敗", err)
 panic(err)
 }
 return ftpclient
}
//上傳文件
func UploadFile(ip, user, localpath, remotepath string, port int) {
 client := GetSSHConect(ip, user, port)
 ftpclient := getftpclient(client)
 defer ftpclient.Close()
 remoteFileName := path.Base(localpath)
 fmt.Println(localpath, remoteFileName)
 srcFile, err := os.Open(localpath)
 if err != nil {
 fmt.Println("打開文件失敗", err)
 panic(err)
 }
 defer srcFile.Close()
 dstFile, e := ftpclient.Create(path.Join(remotepath, remoteFileName))
 if e != nil {
 fmt.Println("創建文件失敗", e)
 panic(e)
 }
 defer dstFile.Close()
 buffer := make([]byte, 1024)
 for {
 n, err := srcFile.Read(buffer)
 if err != nil {
 if err == io.EOF {
 fmt.Println("已讀取到文件末尾")
 break
 } else {
 fmt.Println("讀取文件出錯", err)
 panic(err)
 }
 }
 dstFile.Write(buffer[:n])
 //注意,由于文件大小不定,不可直接使用buffer,否則會在文件末尾重復寫入,以填充1024的整數倍
 }
 fmt.Println("文件上傳成功")
}
//文件下載
func DownLoad(ip, user, localpath, remotepath string, port int) {
 client := GetSSHConect(ip, user, port)
 ftpClient := getftpclient(client)
 defer ftpClient.Close()
 srcFile, err := ftpClient.Open(remotepath)
 if err != nil {
 fmt.Println("文件讀取失敗", err)
 panic(err)
 }
 defer srcFile.Close()
 localFilename := path.Base(remotepath)
 dstFile, e := os.Create(path.Join(localpath, localFilename))
 if e != nil {
 fmt.Println("文件創建失敗", e)
 panic(e)
 }
 defer dstFile.Close()
 if _, err1 := srcFile.WriteTo(dstFile); err1 != nil {
 fmt.Println("文件寫入失敗", err1)
 panic(err1)
 }
 fmt.Println("文件下載成功")
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。

原文鏈接:https://blog.csdn.net/fu_qin/article/details/78741854

延伸 · 閱讀

精彩推薦
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggolang如何使用struct的tag屬性的詳細介紹

    golang如何使用struct的tag屬性的詳細介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細介紹,從例子說起,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網11352020-05-21
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggolang json.Marshal 特殊html字符被轉義的解決方法

    golang json.Marshal 特殊html字符被轉義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggo日志系統logrus顯示文件和行號的操作

    go日志系統logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • GolangGolang中Bit數組的實現方式

    Golang中Bit數組的實現方式

    這篇文章主要介紹了Golang中Bit數組的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
  • Golanggolang的httpserver優雅重啟方法詳解

    golang的httpserver優雅重啟方法詳解

    這篇文章主要給大家介紹了關于golang的httpserver優雅重啟的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,...

    helight2992020-05-14
  • GolangGolang通脈之數據類型詳情

    Golang通脈之數據類型詳情

    這篇文章主要介紹了Golang通脈之數據類型,在編程語言中標識符就是定義的具有某種意義的詞,比如變量名、常量名、函數名等等,Go語言中標識符允許由...

    4272021-11-24
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 影音先锋在线看片资源 | 日本高清无卡码一区二区久久 | 久久久久久久国产毛片 | 午夜精品一区二区三区在线视频 | 97色在线观看免费视频 | 中文字幕1区 | 曰本人一级毛片免费完整视频 | 天天干天天操天天干 | 精品久久久久久久久久久久久久 | 久久久99久久久国产自输拍 | 欧美高清免费 | 精品乱码一区二区三四区 | 亚洲精品日韩激情在线电影 | 国产欧美自拍 | 色婷婷综合网 | 欧州一区二区三区 | 国产精品久久久久久久久久久久久 | 七七婷婷婷婷精品国产 | 老司机福利在线视频 | 国产在线综合网 | 超碰c| 国产999精品久久久影片官网 | 久久国产日韩 | 中文字幕在线一区 | 国产黄色网址在线观看 | 欧美专区在线观看 | www日韩| 亚洲免费观看视频网站 | 91精品视频免费在线观看 | 中文字幕免费看 | 日韩在线国产 | 亚洲精品久久久久久下一站 | 综合久久av| 国产欧美一区二区三区在线看 | 久久福利电影 | 日韩在线视屏 | 免费一级毛片 | 精品网站www | 欧美日韩精品免费 | 日本a v网站 | 久久久久久久久久久九 |