修正 MkdirAll 算法,当文件存在时不报错.
Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
parent
5aaea5918d
commit
f7718fbf01
|
@ -10,3 +10,4 @@
|
||||||
|
|
||||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
*.out
|
*.out
|
||||||
|
go.sum
|
||||||
|
|
8
auth.go
8
auth.go
|
@ -11,7 +11,7 @@ import (
|
||||||
|
|
||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
"golang.org/x/crypto/ssh/agent"
|
"golang.org/x/crypto/ssh/agent"
|
||||||
"golang.org/x/crypto/ssh/terminal"
|
"golang.org/x/term"
|
||||||
)
|
)
|
||||||
|
|
||||||
//HasAgent reports whether the SSH agent is available
|
//HasAgent reports whether the SSH agent is available
|
||||||
|
@ -67,7 +67,7 @@ func AuthWithAgent() (ssh.AuthMethod, error) {
|
||||||
sock := os.Getenv("SSH_AUTH_SOCK")
|
sock := os.Getenv("SSH_AUTH_SOCK")
|
||||||
if sock == "" {
|
if sock == "" {
|
||||||
// fmt.Println(errors.New("Agent Disabled"))
|
// fmt.Println(errors.New("Agent Disabled"))
|
||||||
return nil, errors.New("Agent Disabled")
|
return nil, errors.New("AgentDisabled")
|
||||||
}
|
}
|
||||||
socks, err := net.Dial("unix", sock)
|
socks, err := net.Dial("unix", sock)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -76,7 +76,7 @@ func AuthWithAgent() (ssh.AuthMethod, error) {
|
||||||
}
|
}
|
||||||
// 1. 返回Signers函数的结果
|
// 1. 返回Signers函数的结果
|
||||||
agent := agent.NewClient(socks)
|
agent := agent.NewClient(socks)
|
||||||
signers, err := agent.Signers()
|
signers, _ := agent.Signers()
|
||||||
return ssh.PublicKeys(signers...), nil
|
return ssh.PublicKeys(signers...), nil
|
||||||
// 2. 返回Signers函数
|
// 2. 返回Signers函数
|
||||||
// getSigners := agent.NewClient(socks).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") {
|
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)
|
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 {
|
if err != nil {
|
||||||
// println(err.Error())
|
// println(err.Error())
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -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
24
sftp.go
|
@ -60,7 +60,7 @@ func (c *Client) downloadFile(remoteFile, local string) error {
|
||||||
localFile = filepath.ToSlash(localFile)
|
localFile = filepath.ToSlash(localFile)
|
||||||
if c.Size(remoteFile) > 1000 {
|
if c.Size(remoteFile) > 1000 {
|
||||||
rsum := c.Md5File(remoteFile)
|
rsum := c.Md5File(remoteFile)
|
||||||
ioutil.WriteFile(localFile+".md5", []byte(rsum), 755)
|
ioutil.WriteFile(localFile+".md5", []byte(rsum), 0755)
|
||||||
if FileExist(localFile) {
|
if FileExist(localFile) {
|
||||||
if rsum != "" {
|
if rsum != "" {
|
||||||
lsum, _ := Md5File(localFile)
|
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
|
// it should exist and we might not even own it
|
||||||
if finalDst == remoteDir {
|
if finalDst == remoteDir {
|
||||||
return nil
|
return nil
|
||||||
log.Println("sftp: ", remoteDir, "--->", finalDst)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,25 +353,24 @@ func (c *Client) RemoveAll(remoteDir string) error {
|
||||||
|
|
||||||
//MkdirAll 创建目录,递归
|
//MkdirAll 创建目录,递归
|
||||||
func (c *Client) MkdirAll(dirpath string) error {
|
func (c *Client) MkdirAll(dirpath string) error {
|
||||||
|
_, err := c.SFTPClient.Stat(dirpath)
|
||||||
parentDir := filepath.ToSlash(filepath.Dir(dirpath))
|
|
||||||
_, err := c.SFTPClient.Stat(parentDir)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// log.Println(err)
|
|
||||||
if err.Error() == "file does not exist" {
|
if err.Error() == "file does not exist" {
|
||||||
err := c.MkdirAll(parentDir)
|
e := c.MkdirAll(filepath.ToSlash(filepath.Dir(dirpath)))
|
||||||
if err != nil {
|
if e != nil {
|
||||||
return err
|
return e
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err = c.SFTPClient.Mkdir(filepath.ToSlash(dirpath))
|
if err != nil && err.Error() == "file does not exist" {
|
||||||
if err != nil {
|
err = c.SFTPClient.Mkdir(dirpath)
|
||||||
return err
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) Mkdir(path string, fi os.FileInfo) error {
|
func (c *Client) Mkdir(path string, fi os.FileInfo) error {
|
||||||
|
|
72
sftp_test.go
72
sftp_test.go
|
@ -45,12 +45,12 @@ func TestClient_Upload(t *testing.T) {
|
||||||
|
|
||||||
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/upload/"
|
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/upload/"
|
||||||
var uploads = map[string][]string{
|
var uploads = map[string][]string{
|
||||||
local + "null/": []string{"/root/upload/test/null/1", "/root/upload/test/null/2/"},
|
local + "null/": {"/root/upload/test/null/1", "/root/upload/test/null/2/"},
|
||||||
local + "null/": []string{"/root/upload/test/null/3", "/root/upload/test/null/4/"},
|
local + "null/": {"/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": {"/root/upload/test/file/1", "/root/upload/test/file/2/"},
|
||||||
local + "file/": []string{"/root/upload/test/file/3", "/root/upload/test/file/4/"},
|
local + "file/": {"/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": {"/root/upload/test/dir/1", "/root/upload/test/dir/2/"},
|
||||||
local + "dir/": []string{"/root/upload/test/dir/3", "/root/upload/test/dir/4/"},
|
local + "dir/": {"/root/upload/test/dir/3", "/root/upload/test/dir/4/"},
|
||||||
}
|
}
|
||||||
|
|
||||||
for local, remotes := range uploads {
|
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 local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/download"
|
||||||
var download = map[string][]string{
|
var download = map[string][]string{
|
||||||
"/root/test/notExist": []string{local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
|
"/root/test/notExist": {local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
|
||||||
"/root/test/notExist/": []string{local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
|
"/root/test/notExist/": {local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
|
||||||
"/root/test/file": []string{local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
|
"/root/test/file": {local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
|
||||||
"/root/test/file/": []string{local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
|
"/root/test/file/": {local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
|
||||||
"/root/test/dir": []string{local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
|
"/root/test/dir": {local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
|
||||||
"/root/test/dir/": []string{local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
|
"/root/test/dir/": {local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
|
||||||
}
|
}
|
||||||
|
|
||||||
for remote, local := range download {
|
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 local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/downloadfile"
|
||||||
var download = map[string][]string{
|
var download = map[string][]string{
|
||||||
"/root/test/notExist": []string{local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
|
"/root/test/notExist": {local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
|
||||||
"/root/test/notExist/": []string{local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
|
"/root/test/notExist/": {local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
|
||||||
"/root/test/file": []string{local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
|
"/root/test/file": {local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
|
||||||
"/root/test/file/": []string{local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
|
"/root/test/file/": {local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
|
||||||
"/root/test/dir": []string{local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
|
"/root/test/dir": {local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
|
||||||
"/root/test/dir/": []string{local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
|
"/root/test/dir/": {local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
|
||||||
}
|
}
|
||||||
|
|
||||||
for remote, local := range download {
|
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 local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/downloaddir"
|
||||||
var download = map[string][]string{
|
var download = map[string][]string{
|
||||||
"/root/test/notExist": []string{local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
|
"/root/test/notExist": {local + "/localNotExist/null/1", local + "/localNotExist/null/2/"},
|
||||||
"/root/test/notExist/": []string{local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
|
"/root/test/notExist/": {local + "/localNotExist/null/3", local + "/localNotExist/null/4/"},
|
||||||
"/root/test/file": []string{local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
|
"/root/test/file": {local + "/localNotExist/file/1", local + "/localNotExist/file/2/"},
|
||||||
"/root/test/file/": []string{local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
|
"/root/test/file/": {local + "/localNotExist/file/3", local + "/localNotExist/file/4/"},
|
||||||
"/root/test/dir": []string{local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
|
"/root/test/dir": {local + "/localNotExist/dir/1", local + "/localNotExist/dir/2/"},
|
||||||
"/root/test/dir/": []string{local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
|
"/root/test/dir/": {local + "/localNotExist/dir/3", local + "/localNotExist/dir/4/"},
|
||||||
}
|
}
|
||||||
|
|
||||||
for remote, local := range download {
|
for remote, local := range download {
|
||||||
|
@ -147,12 +147,12 @@ func TestClient_UploadFile(t *testing.T) {
|
||||||
defer c.Close()
|
defer c.Close()
|
||||||
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/upload/"
|
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/upload/"
|
||||||
var uploads = map[string][]string{
|
var uploads = map[string][]string{
|
||||||
local + "null": []string{"/root/upload/file_test/null/1", "/root/upload/file_test/null/2/"},
|
local + "null": {"/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 + "null/": {"/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": {"/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 + "file/": {"/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": {"/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 + "dir/": {"/root/upload/file_test/dir/3", "/root/upload/file_test/dir/4/"},
|
||||||
}
|
}
|
||||||
|
|
||||||
for local, remotes := range uploads {
|
for local, remotes := range uploads {
|
||||||
|
@ -172,12 +172,12 @@ func TestClient_UploadDir(t *testing.T) {
|
||||||
defer c.Close()
|
defer c.Close()
|
||||||
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/upload/"
|
var local = "/home/ubuntu/go/src/github.com/pytool/ssh/test/upload/"
|
||||||
var uploads = map[string][]string{
|
var uploads = map[string][]string{
|
||||||
local + "null/": []string{"/root/upload/dir_test/null/1", "/root/upload/dir_test/null/2/"},
|
local + "null/": {"/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 + "null/": {"/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": {"/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 + "file/": {"/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": {"/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 + "dir/": {"/root/upload/dir_test/dir/3", "/root/upload/dir_test/dir/4/"},
|
||||||
}
|
}
|
||||||
|
|
||||||
for local, remotes := range uploads {
|
for local, remotes := range uploads {
|
||||||
|
|
3
ssh.go
3
ssh.go
|
@ -28,7 +28,6 @@ func (c *Client) Run(cmd string) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf(":Command finished with error: %v\n", err)
|
fmt.Printf(":Command finished with error: %v\n", err)
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Exec Execute cmd on the remote host and bind stderr and stdout
|
//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.Stdout = os.Stdout
|
||||||
session.Stderr = os.Stderr
|
session.Stderr = os.Stderr
|
||||||
err = session.Run(cmd)
|
session.Run(cmd)
|
||||||
session.Close()
|
session.Close()
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue