校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > go語言實(shí)現(xiàn)sftp包上傳文件和文件夾到遠(yuǎn)程服務(wù)器操作

go語言實(shí)現(xiàn)sftp包上傳文件和文件夾到遠(yuǎn)程服務(wù)器操作

熱門標(biāo)簽:400開頭電話怎樣申請 利用地圖標(biāo)注位置 貴州電話智能外呼系統(tǒng) 江蘇呼叫中心外呼系統(tǒng)有效果嗎 官渡電銷外呼管理系統(tǒng)怎么收費(fèi) 赤峰電銷 谷歌美發(fā)店地圖標(biāo)注 杭州人工智能電銷機(jī)器人費(fèi)用 地圖區(qū)域圖標(biāo)注后導(dǎo)出

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

1、創(chuàng)建connect方法:

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、上傳文件

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、上傳文件夾

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、上傳測試

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)
}

補(bǔ)充:go實(shí)現(xiàn)ssh遠(yuǎn)程機(jī)器并傳輸文件

核心依賴包:

golang.org/x/crypto/ssh

github.com/pkg/sftp

其中g(shù)olang.org/x/crypto/ssh 可從github上下載,

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

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

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
}
// 遠(yuǎn)程執(zhí)行腳本
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("創(chuàng)建會(huì)話失敗", 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("遠(yuǎn)程執(zhí)行腳本失敗", err1)
 return 2
 } else {
 fmt.Println("遠(yuǎn)程執(zhí)行腳本成功")
 return 1
 }
}

文件傳輸功能:

//獲取ftp連接
func getftpclient(client *ssh.Client) (*sftp.Client) {
 ftpclient, err := sftp.NewClient(client)
 if err != nil {
 fmt.Println("創(chuàng)建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("創(chuàng)建文件失敗", 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("讀取文件出錯(cuò)", err)
 panic(err)
 }
 }
 dstFile.Write(buffer[:n]) 
 //注意,由于文件大小不定,不可直接使用buffer,否則會(huì)在文件末尾重復(fù)寫入,以填充1024的整數(shù)倍
 }
 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("文件創(chuàng)建失敗", e)
 panic(e)
 }
 defer dstFile.Close()
 if _, err1 := srcFile.WriteTo(dstFile); err1 != nil {
 fmt.Println("文件寫入失敗", err1)
 panic(err1)
 }
 fmt.Println("文件下載成功")
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang-gin-mgo高并發(fā)服務(wù)器搭建教程
  • golang HTTP 服務(wù)器 處理 日志/Stream流的操作
  • golang項(xiàng)目如何上線部署到Linu服務(wù)器(方法詳解)
  • 部署Django到阿里云服務(wù)器教程示例
  • 解決啟動(dòng)django,瀏覽器顯示“服務(wù)器拒絕訪問”的問題
  • Nginx+Uwsgi+Django 項(xiàng)目部署到服務(wù)器的思路詳解

標(biāo)簽:黔西 保定 松原 泰安 河池 武漢 鷹潭 宜春

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《go語言實(shí)現(xiàn)sftp包上傳文件和文件夾到遠(yuǎn)程服務(wù)器操作》,本文關(guān)鍵詞  語言,實(shí)現(xiàn),sftp,包上傳,包,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《go語言實(shí)現(xiàn)sftp包上傳文件和文件夾到遠(yuǎn)程服務(wù)器操作》相關(guān)的同類信息!
  • 本頁收集關(guān)于go語言實(shí)現(xiàn)sftp包上傳文件和文件夾到遠(yuǎn)程服務(wù)器操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    亚洲色图在线视频| 美女视频网站黄色亚洲| 国产午夜亚洲精品理论片色戒 | 97超碰欧美中文字幕| 国产一区二区三区最好精华液| 视频在线观看一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在 | yourporn久久国产精品| 国产一区欧美二区| 韩国午夜理伦三级不卡影院| 美女性感视频久久| 美女脱光内衣内裤视频久久网站| 日韩av中文字幕一区二区| 日精品一区二区三区| 丝袜诱惑制服诱惑色一区在线观看| 亚洲精品菠萝久久久久久久| 亚洲视频免费看| 亚洲男人的天堂在线观看| 亚洲人成网站在线| 亚洲午夜激情av| 午夜精品久久久久久久99水蜜桃 | 制服丝袜日韩国产| 欧美一级高清大全免费观看| 日韩一区二区免费高清| 欧美成人性战久久| 久久精品一区二区三区av| 国产欧美一区二区精品久导航| 国产日韩欧美精品一区| 综合精品久久久| 一区二区三区日韩精品视频| 亚洲va国产va欧美va观看| 三级在线观看一区二区| 久久成人免费电影| 国产福利91精品一区二区三区| 成人激情av网| 在线观看日产精品| 91精品国产综合久久福利| 日韩精品专区在线影院观看| 精品国产一区二区三区四区四| 欧美激情在线观看视频免费| 亚洲天堂网中文字| 天天综合天天做天天综合| 久久福利资源站| 成人av午夜电影| 91丨九色丨蝌蚪富婆spa| 欧美日韩你懂的| 欧美一区二区三区的| 久久精品亚洲一区二区三区浴池| 亚洲欧美综合网| 午夜久久久久久| 国产精品乡下勾搭老头1| 色综合久久九月婷婷色综合| 欧美一区二区三区的| 中文字幕av一区二区三区高| 亚洲国产精品综合小说图片区| 九一久久久久久| 色就色 综合激情| 精品国产第一区二区三区观看体验| 国产精品另类一区| 亚洲成av人片在线观看无码| 国产精品一区二区91| 欧美在线不卡一区| 欧美精品一区二区三区蜜桃视频| 亚洲激情自拍视频| 国产在线播放一区| 色999日韩国产欧美一区二区| 日韩一区二区精品葵司在线| 成人免费小视频| 捆绑紧缚一区二区三区视频| 91老师片黄在线观看| 精品日韩av一区二区| 亚洲午夜精品久久久久久久久| 国产九色精品成人porny| 欧美日韩专区在线| 中文字幕亚洲电影| 开心九九激情九九欧美日韩精美视频电影| 成人sese在线| 精品成人一区二区三区四区| 一个色在线综合| 懂色一区二区三区免费观看| 91精品国产入口在线| 亚洲乱码中文字幕综合| 国产精品自拍网站| 日韩午夜激情免费电影| 夜色激情一区二区| 99久久久久久| 国产日韩精品久久久| 蜜臀精品久久久久久蜜臀| 91成人国产精品| 国产精品久久久久天堂| 国产老妇另类xxxxx| 日韩一区二区三区视频在线| 亚洲国产精品久久人人爱 | 欧美电影在哪看比较好| 亚洲一二三四区| jizzjizzjizz欧美| 国产欧美一二三区| 狠狠网亚洲精品| 日韩一级片在线播放| 亚洲成人自拍一区| 欧美日韩黄色影视| 亚洲一区二区三区国产| 在线观看成人小视频| 亚洲女人****多毛耸耸8| 懂色av一区二区三区免费看| 久久免费国产精品| 蜜臀精品一区二区三区在线观看| 欧美日韩亚洲综合一区二区三区 | 成人午夜免费视频| 久久午夜老司机| 久久99精品国产麻豆婷婷| 91精品国产综合久久久蜜臀粉嫩| 亚洲国产精品久久久男人的天堂| 欧美亚洲禁片免费| 亚洲综合激情另类小说区| 色综合视频一区二区三区高清| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美xxxxx裸体时装秀| 精品亚洲国内自在自线福利| 日韩精品一区二区三区在线播放 | 欧美日韩综合色| 日韩成人一区二区三区在线观看| 久久一二三国产| 国产黑丝在线一区二区三区| 欧美国产欧美综合| 91麻豆123| 亚洲www啪成人一区二区麻豆| 欧美日韩一区 二区 三区 久久精品| 首页综合国产亚洲丝袜| 欧美一区二区三区性视频| 麻豆国产精品官网| 欧美国产一区在线| 91丨porny丨国产入口| 亚洲一区二区三区四区五区黄 | 欧美一二三区精品| 国产一区二区三区精品视频| 国产欧美日韩三区| 91麻豆视频网站| 亚洲成精国产精品女| 欧美日韩亚洲高清一区二区| 日日噜噜夜夜狠狠视频欧美人| 欧美片在线播放| 1024成人网| 欧美日韩国产片| 美女国产一区二区三区| 久久久久久久久久久久电影| 国产另类ts人妖一区二区| 精品国产精品一区二区夜夜嗨| 国产乱码精品一品二品| 中文字幕一区二区在线观看| 99久久伊人久久99| 亚洲综合在线视频| 欧美一区二区精品| 国产一区二区毛片| 亚洲日本护士毛茸茸| 不卡av在线网| 一区二区欧美在线观看| 3d成人h动漫网站入口| 激情六月婷婷综合| 最新欧美精品一区二区三区| 欧美日韩视频在线第一区| 激情综合亚洲精品| 国产精品无码永久免费888| 欧美日韩一区二区不卡| 精品一区在线看| 亚洲色图欧洲色图| 91精品国产入口| 色999日韩国产欧美一区二区| 秋霞国产午夜精品免费视频| 久久久久国产精品免费免费搜索| 色狠狠av一区二区三区| 国产中文一区二区三区| 亚洲靠逼com| 精品动漫一区二区三区在线观看| jlzzjlzz亚洲女人18| 午夜精品久久久久久久久| 国产网站一区二区三区| 在线观看一区二区视频| 精品一区二区久久| 日韩中文字幕1| 中文字幕在线不卡一区二区三区| 色天天综合色天天久久| 国产美女精品人人做人人爽| 亚洲国产另类av| 中文字幕av一区 二区| 欧美视频自拍偷拍| 不卡视频在线看| 美女视频免费一区| 亚洲男人的天堂av| 精品久久久网站| 在线观看91精品国产麻豆| aaa亚洲精品| 极品少妇xxxx精品少妇偷拍| 亚洲chinese男男1069| 国产精品国产自产拍高清av| 日韩一级在线观看| 欧美中文一区二区三区| 成人免费看黄yyy456| 麻豆中文一区二区| 亚洲成人激情社区|