go语言sftp组件github.com/pkg/sftp、和基于win7搭建sftp服务---freesshd

sftp

sftp是基于ssh的文件传输协议,与ftp有着几乎一样的功能。

freeSSHd

我在win7系统使用freeSSHd搭建sftp服务

下载

freeSSHd

安装

安装路径
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后一步:是否运行为系统服务
这里需要注意一下,我当时选择的是,这给我造成了不小的麻烦,后面说

运行

首先右键我的电脑→管理→服务→关闭掉FreeSSHDService服务,
它和FreeSSHd只需运行一个,
就是因为这个原因耽误了我很长时间连不上sftp

管理员身份运行FreeSSHd桌面图标,
这里记着要以管理员的身份运行,不然后面可能会出现权限不足的问题。
在这里插入图片描述

freeSSHd配置

Users→add

Authentication有三种:
NT authentication—windows账户
Password stored as SHA1 hash—用户名和密码
Public Key—公钥

我用的是windows系统账户
在这里插入图片描述

Authentication

使用用户名和密码模式
Password authentication—Required
在这里插入图片描述

SSH

Listen address要选择本机IP,其它不变
在这里插入图片描述

SFTP

sftp根目录
在这里插入图片描述

右键右下角FreeSSHd图标→upload

使配置生效,
然后再重新以管理员身份运行FreeSSHd
在这里插入图片描述
start SSH server
在这里插入图片描述
使用xshell测试一下

ssh smart@192.168.1.72

接受主机秘钥,输入windows账户密码,这样说明连接ok了。
在这里插入图片描述

github.com/pkg/sftp

安装

github.com/pkg/sftp是go语言的sftp组件

在项目目录下执行命令行

go get -u github.com/pkg/sftp

在这里插入图片描述

实例

main.go

package main

import (
	"fmt"
	"github.com/pkg/sftp"
	"golang.org/x/crypto/ssh"
	"io/ioutil"
	"os"
	"path"
	"time"
)

func getConnect() *sftp.Client {
	var (
		auth         []ssh.AuthMethod
		addr         string
		clientConfig *ssh.ClientConfig
		sshClient    *ssh.Client
		sftpClient   *sftp.Client
		err          error
	)

	// 创建ssh连接
	auth = make([]ssh.AuthMethod, 0)
	auth = append(auth, ssh.Password("***")) // 抱歉,这是我电脑密码
	clientConfig = &ssh.ClientConfig{
		User:            "smart", // windows账户
		Auth:            auth,
		Timeout:         30 * time.Second,
		HostKeyCallback: ssh.InsecureIgnoreHostKey(),
	}
	addr = fmt.Sprintf("%s:%d", "192.168.1.72", 22) // SSH的22端口
	sshClient, err = ssh.Dial("tcp", addr, clientConfig)
	if nil != err {
		fmt.Println("ssh.Dial error", err)
	} else {
		fmt.Println("ssh.Dial 成功")
	}

	// 创建sftp连接
	sftpClient, err = sftp.NewClient(sshClient)
	if nil != err {
		fmt.Println("sftp.NewClient error", err)
	} else {
		fmt.Println("sftp.NewClient 成功")
	}

	return sftpClient
}

func uploadFile(sftpClient *sftp.Client, localFile, remotePath string) {
	file, err := os.Open(localFile)
	if nil != err {
		fmt.Println("os.Open error", err)
		return
	}
	defer file.Close()

	remoteFileName := path.Base(localFile)
	ftpFile, err := sftpClient.Create(path.Join(remotePath, remoteFileName)) // 这里的remotePath是sftp根目录下的目录,是目录不是文件名
	if nil != err {
		fmt.Println("sftpClient.Create error", err)
		return
	}
	defer ftpFile.Close()

	fileByte, err := ioutil.ReadAll(file)
	if nil != err {
		fmt.Println("ioutil.ReadAll error", err)
		return
	}

	ftpFile.Write(fileByte)
}

// 基于ssh协议的sftp文件传输
func main() {
	connect := getConnect()
	defer connect.Close()
	uploadFile(connect, "D:/work/goWorkspace/src/helloGin/ini/my.ini", "/file/")
}

需要注意的地方是:
sftp用到的是ssh协议,所以端口是22,
sftpClient.Create(path.Join(remotePath, remoteFileName)),这里的remotePath参数是路径名,我一开始写成了文件名,所以一直导致Permission denied,排查了好久。

运行

在这里插入图片描述
祝各位顺利!

不当之处,请予指正。

参考资料:

zhangliang_571windows 上搭建 sftp 服务器 --freesshd
黑手党老kgolang sftp传输文件

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值