import (
"fmt"
"log"
"os"
"path"
"time"
"github.com/pkg/sftp"
"golang.org/x/crypto/ssh"
)
func pwdAuthConnect(sshHost, sshUser, sshPassword string, sshPort int) (*ssh.Client, error) {
config := ssh.ClientConfig{
Timeout: 5 * time.Second,
User: sshUser,
Auth: []ssh.AuthMethod{ssh.Password((sshPassword))},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
addr := fmt.Sprintf("%s:%d", sshHost, sshPort)
Client, err := ssh.Dial("tcp", addr, &config)
if err != nil {
log.Fatal("连接服务器失败", err)
return nil, err
}
return Client, err
}
// CreateSftp 创建sftp会话
func CreateSftp(sshHost, sshUser, sshPassword string, sshPort int) (*sftp.Client, error) {
// 连接Linux服务器
conn, err := pwdAuthConnect(sshHost, sshUser, sshPassword, sshPort)
if err != nil {
fmt.Println("连接Linux服务器失败", err)
panic(err)
}
//defer conn.Close()
// 创建sftp会话
client, err := sftp.NewClient(conn)
if err != nil {
return nil, err
}
//defer client.Close()
return client, nil
}
func main() {
client, err := CreateSftp("192.168.225.146", "root", "123456", 22)
if err != nil {
return
}
defer client.Close()
// 1.浏览服务目录**
w := client.Walk("/root")
for w.Step() {
if w.Err() != nil {
continue
}
fmt.Println(w.Path())
}
// 2.服务器创建文件**
f, err := client.Create("/tmp/kela.txt")
if err != nil {
panic(err)
}
_, err = f.Write([]byte("Hello World!\n"))
if err != nil {
panic(err)
}
f.Close()
// 3.查看服务器文件**
fi, err := client.Lstat("/tmp/kela.txt")
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", fi)
// 4.上传文件**
localFilePath := "C:/MCDiamond/Files/Study/miaokela/go.sum"
remoteFilePath := "/root/"
// 1) 打开本地文件
srcFile, err := os.Open(localFilePath)
if err != nil {
panic(err)
}
defer srcFile.Close()
// 绝对路径中获取文件名
remoteFileName := path.Base(localFilePath)
fmt.Println(remoteFileName)
// 2) 打开服务器文件
dstFile, err := client.Create(path.Join(remoteFilePath, remoteFileName))
if err != nil {
panic(err)
}
defer dstFile.Close()
// 3) 将本地文件内容写入服务器文件
buf := make([]byte, 1024)
for {
n, _ := srcFile.Read(buf) // 将文件2进制内容写入buf字节切片中
if n == 0 {
break
}
dstFile.Write(buf)
}
fmt.Println("文件上传完毕")
}