sftp
sftp是基于ssh的文件传输协议,与ftp有着几乎一样的功能。
freeSSHd
我在win7系统使用freeSSHd搭建sftp服务
下载
安装
安装路径
最后一步:是否运行为系统服务
这里需要注意一下,我当时选择的是,这给我造成了不小的麻烦,后面说
运行
首先右键我的电脑→管理→服务→关闭掉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_571:windows 上搭建 sftp 服务器 --freesshd
黑手党老k:golang sftp传输文件