修正 MkdirAll 算法,当文件存在时不报错.

Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
chen.yang 2022-02-25 11:10:16 +08:00
parent 5aaea5918d
commit f7718fbf01
6 changed files with 71 additions and 55 deletions

1
.gitignore vendored
View File

@ -10,3 +10,4 @@
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
go.sum

View File

@ -11,7 +11,7 @@ import (
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/agent"
"golang.org/x/crypto/ssh/terminal"
"golang.org/x/term"
)
//HasAgent reports whether the SSH agent is available
@ -67,7 +67,7 @@ func AuthWithAgent() (ssh.AuthMethod, error) {
sock := os.Getenv("SSH_AUTH_SOCK")
if sock == "" {
// fmt.Println(errors.New("Agent Disabled"))
return nil, errors.New("Agent Disabled")
return nil, errors.New("AgentDisabled")
}
socks, err := net.Dial("unix", sock)
if err != nil {
@ -76,7 +76,7 @@ func AuthWithAgent() (ssh.AuthMethod, error) {
}
// 1. 返回Signers函数的结果
agent := agent.NewClient(socks)
signers, err := agent.Signers()
signers, _ := agent.Signers()
return ssh.PublicKeys(signers...), nil
// 2. 返回Signers函数
// getSigners := agent.NewClient(socks).Signers
@ -172,7 +172,7 @@ func AuthWithPrivateKeyTerminal(keyfile string) (ssh.AuthMethod, error) {
if strings.Contains(err.Error(), "cannot decode encrypted private keys") {
fmt.Fprintf(os.Stderr, "This SSH key is encrypted. Please enter passphrase for key '%s':", keyfile)
passphrase, err := terminal.ReadPassword(int(syscall.Stdin))
passphrase, err := term.ReadPassword(int(syscall.Stdin))
if err != nil {
// println(err.Error())
return nil, err

18
go.mod Normal file
View File

@ -0,0 +1,18 @@
module blacktea.vip.cpolar.top/OrgGo/ssh
go 1.17
require (
github.com/go-sql-driver/mysql v1.6.0
github.com/mitchellh/go-homedir v1.1.0
github.com/pkg/sftp v1.13.4
github.com/pytool/ssh v0.0.0-20190312091242-5aaea5918db7
github.com/yeka/zip v0.0.0-20180914125537-d046722c6feb
golang.org/x/crypto v0.0.0-20220214200702-86341886e292
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
)
require (
github.com/kr/fs v0.1.0 // indirect
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect
)

24
sftp.go
View File

@ -60,7 +60,7 @@ func (c *Client) downloadFile(remoteFile, local string) error {
localFile = filepath.ToSlash(localFile)
if c.Size(remoteFile) > 1000 {
rsum := c.Md5File(remoteFile)
ioutil.WriteFile(localFile+".md5", []byte(rsum), 755)
ioutil.WriteFile(localFile+".md5", []byte(rsum), 0755)
if FileExist(localFile) {
if rsum != "" {
lsum, _ := Md5File(localFile)
@ -261,7 +261,6 @@ func (c *Client) UploadDir(localDir string, remoteDir string) (err error) {
// it should exist and we might not even own it
if finalDst == remoteDir {
return nil
log.Println("sftp: ", remoteDir, "--->", finalDst)
}
@ -354,25 +353,24 @@ func (c *Client) RemoveAll(remoteDir string) error {
//MkdirAll 创建目录,递归
func (c *Client) MkdirAll(dirpath string) error {
parentDir := filepath.ToSlash(filepath.Dir(dirpath))
_, err := c.SFTPClient.Stat(parentDir)
_, err := c.SFTPClient.Stat(dirpath)
if err != nil {
// log.Println(err)
if err.Error() == "file does not exist" {
err := c.MkdirAll(parentDir)
if err != nil {
return err
e := c.MkdirAll(filepath.ToSlash(filepath.Dir(dirpath)))
if e != nil {
return e
}
} else {
return err
}
}
err = c.SFTPClient.Mkdir(filepath.ToSlash(dirpath))
if err != nil {
return err
if err != nil && err.Error() == "file does not exist" {
err = c.SFTPClient.Mkdir(dirpath)
if err != nil {
return err
}
}
return nil
return err
}
func (c *Client) Mkdir(path string, fi os.FileInfo) error {

View File

@ -45,12 +45,12 @@ func TestClient_Upload(t *testing.T) {
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/upload/"
var uploads = map[string][]string{
local + "null/": []string{"/root/upload/test/null/1", "/root/upload/test/null/2/"},
local + "null/": []string{"/root/upload/test/null/3", "/root/upload/test/null/4/"},
local + "file": []string{"/root/upload/test/file/1", "/root/upload/test/file/2/"},
local + "file/": []string{"/root/upload/test/file/3", "/root/upload/test/file/4/"},
local + "dir": []string{"/root/upload/test/dir/1", "/root/upload/test/dir/2/"},
local + "dir/": []string{"/root/upload/test/dir/3", "/root/upload/test/dir/4/"},
local + "null/": {"/root/upload/test/null/1", "/root/upload/test/null/2/"},
local + "null/": {"/root/upload/test/null/3", "/root/upload/test/null/4/"},
local + "file": {"/root/upload/test/file/1", "/root/upload/test/file/2/"},
local + "file/": {"/root/upload/test/file/3", "/root/upload/test/file/4/"},
local + "dir": {"/root/upload/test/dir/1", "/root/upload/test/dir/2/"},
local + "dir/": {"/root/upload/test/dir/3", "/root/upload/test/dir/4/"},
}
for local, remotes := range uploads {
@ -71,12 +71,12 @@ func TestClient_Download(t *testing.T) {
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/download"
var download = map[string][]string{
"/root/test/notExist": []string{local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
"/root/test/notExist/": []string{local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
"/root/test/file": []string{local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
"/root/test/file/": []string{local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
"/root/test/dir": []string{local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
"/root/test/dir/": []string{local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
"/root/test/notExist": {local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
"/root/test/notExist/": {local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
"/root/test/file": {local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
"/root/test/file/": {local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
"/root/test/dir": {local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
"/root/test/dir/": {local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
}
for remote, local := range download {
@ -98,12 +98,12 @@ func TestClient_DownloadFile(t *testing.T) {
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/downloadfile"
var download = map[string][]string{
"/root/test/notExist": []string{local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
"/root/test/notExist/": []string{local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
"/root/test/file": []string{local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
"/root/test/file/": []string{local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
"/root/test/dir": []string{local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
"/root/test/dir/": []string{local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
"/root/test/notExist": {local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
"/root/test/notExist/": {local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
"/root/test/file": {local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
"/root/test/file/": {local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
"/root/test/dir": {local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
"/root/test/dir/": {local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
}
for remote, local := range download {
@ -123,12 +123,12 @@ func TestClient_DownloadDir(t *testing.T) {
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/downloaddir"
var download = map[string][]string{
"/root/test/notExist": []string{local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
"/root/test/notExist/": []string{local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
"/root/test/file": []string{local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
"/root/test/file/": []string{local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
"/root/test/dir": []string{local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
"/root/test/dir/": []string{local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
"/root/test/notExist": {local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
"/root/test/notExist/": {local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
"/root/test/file": {local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
"/root/test/file/": {local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
"/root/test/dir": {local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
"/root/test/dir/": {local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
}
for remote, local := range download {
@ -147,12 +147,12 @@ func TestClient_UploadFile(t *testing.T) {
defer c.Close()
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/upload/"
var uploads = map[string][]string{
local + "null": []string{"/root/upload/file_test/null/1", "/root/upload/file_test/null/2/"},
local + "null/": []string{"/root/upload/file_test/null/3", "/root/upload/file_test/null/4/"},
local + "file": []string{"/root/upload/file_test/file/1", "/root/upload/file_test/file/2/"},
local + "file/": []string{"/root/upload/file_test/file/3", "/root/upload/file_test/file/4/"},
local + "dir": []string{"/root/upload/file_test/dir/1", "/root/upload/file_test/dir/2/"},
local + "dir/": []string{"/root/upload/file_test/dir/3", "/root/upload/file_test/dir/4/"},
local + "null": {"/root/upload/file_test/null/1", "/root/upload/file_test/null/2/"},
local + "null/": {"/root/upload/file_test/null/3", "/root/upload/file_test/null/4/"},
local + "file": {"/root/upload/file_test/file/1", "/root/upload/file_test/file/2/"},
local + "file/": {"/root/upload/file_test/file/3", "/root/upload/file_test/file/4/"},
local + "dir": {"/root/upload/file_test/dir/1", "/root/upload/file_test/dir/2/"},
local + "dir/": {"/root/upload/file_test/dir/3", "/root/upload/file_test/dir/4/"},
}
for local, remotes := range uploads {
@ -172,12 +172,12 @@ func TestClient_UploadDir(t *testing.T) {
defer c.Close()
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/upload/"
var uploads = map[string][]string{
local + "null/": []string{"/root/upload/dir_test/null/1", "/root/upload/dir_test/null/2/"},
local + "null/": []string{"/root/upload/dir_test/null/3", "/root/upload/dir_test/null/4/"},
local + "file": []string{"/root/upload/dir_test/file/1", "/root/upload/dir_test/file/2/"},
local + "file/": []string{"/root/upload/dir_test/file/3", "/root/upload/dir_test/file/4/"},
local + "dir": []string{"/root/upload/dir_test/dir/1", "/root/upload/dir_test/dir/2/"},
local + "dir/": []string{"/root/upload/dir_test/dir/3", "/root/upload/dir_test/dir/4/"},
local + "null/": {"/root/upload/dir_test/null/1", "/root/upload/dir_test/null/2/"},
local + "null/": {"/root/upload/dir_test/null/3", "/root/upload/dir_test/null/4/"},
local + "file": {"/root/upload/dir_test/file/1", "/root/upload/dir_test/file/2/"},
local + "file/": {"/root/upload/dir_test/file/3", "/root/upload/dir_test/file/4/"},
local + "dir": {"/root/upload/dir_test/dir/1", "/root/upload/dir_test/dir/2/"},
local + "dir/": {"/root/upload/dir_test/dir/3", "/root/upload/dir_test/dir/4/"},
}
for local, remotes := range uploads {

3
ssh.go
View File

@ -28,7 +28,6 @@ func (c *Client) Run(cmd string) {
if err != nil {
fmt.Printf(":Command finished with error: %v\n", err)
}
return
}
//Exec Execute cmd on the remote host and bind stderr and stdout
@ -48,7 +47,7 @@ func (c *Client) Exec1(cmd string) error {
session.Stdout = os.Stdout
session.Stderr = os.Stderr
err = session.Run(cmd)
session.Run(cmd)
session.Close()
return nil