传输文件
package main
import (
"fmt"
"github.com/pkg/sftp"
"golang.org/x/crypto/ssh"
"log"
"net"
"os"
"path"
"time"
)
const PrivateKey = `
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
`
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))
/*私钥登陆才用得到*/
signer, err := ssh.ParsePrivateKey([]byte(PrivateKey))
if err != nil {
log.Fatalf("Unable to parse private key: %v", err)
}
clientConfig = &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{
//ssh.Password(password),//密码登录
ssh.PublicKeys(signer),
},
Timeout: 30 * time.Second,
// error---ssh: must specify HostKeyCallback add 需要验证服务端,不做验证返回nil就可以
HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
return nil
},
}
// connet to ssh
addr = fmt.Sprintf("%s:%d", host, port)
if sshClient, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
fmt.Println(err)
return nil, err
}
// create sftp client
if sftpClient, err = sftp.NewClient(sshClient); err != nil {
return nil, err
}
return sftpClient, nil
}
func main() {
var (
err error
sftpClient *sftp.Client
)
// 这里换成实际的 SSH 连接的 用户名,密码,主机名或IP,SSH端口 此处要root的密码
sftpClient, err = connect("user", "passwd", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer sftpClient.Close()
//用来测试的本地文件路径 和 远程机器上的文件夹
var localFilePath = "/Users/zhangsan/go/src/workspace/test/test.txt"
var remoteDir = "/tmp"
srcFile, err := os.Open(localFilePath)
if err != nil {
log.Fatal(err)
}
defer srcFile.Close()
var remoteFileName = path.Base(localFilePath)
dstFile, err := sftpClient.Create(path.Join(remoteDir, remoteFileName))
if err != nil {
log.Fatal(err)
}
defer dstFile.Close()
buf := make([]byte, 1024)
for {
n, _ := srcFile.Read(buf)
if n == 0 {
break
}
dstFile.Write(buf)
}
fmt.Println("copy file to remote server finished!")
}
下载文件
package main
import (
"fmt"
"log"
"os"
"path"
"time"
"github.com/pkg/sftp"
"golang.org/x/crypto/ssh"
)
func main() {
var (
err error
sftpClient *sftp.Client
)
// 这里换成实际的 SSH 连接的 用户名,密码,主机名或IP,SSH端口
sftpClient, err = connect("root", "rootpass", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer sftpClient.Close()
// 用来测试的远程文件路径 和 本地文件夹
var remoteFilePath = "/path/to/remote/path/test.txt"
var localDir = "/local/dir" srcFile, err := sftpClient.Open(remoteFilePath)
if err != nil {
log.Fatal(err)
}
defer srcFile.Close()
var localFileName = path.Base(remoteFilePath)
dstFile, err := os.Create(path.Join(localDir, localFileName))
if err != nil { log.Fatal(err) }
defer dstFile.Close()
if _, err = srcFile.WriteTo(dstFile); err != nil {
log.Fatal(err)
}
fmt.Println("copy file from remote server finished!")
}