diff --git a/dsDataex/Utils/SftpUtil/SftpUtil.go b/dsDataex/Utils/SftpUtil/SftpUtil.go new file mode 100644 index 00000000..ee0f108f --- /dev/null +++ b/dsDataex/Utils/SftpUtil/SftpUtil.go @@ -0,0 +1,95 @@ +package SftpUtil + +import ( + "fmt" + "github.com/pkg/sftp" + "golang.org/x/crypto/ssh" + "io/ioutil" + "log" + "os" + "path" + "path/filepath" + "time" +) + +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)) + + clientConfig = &ssh.ClientConfig{ + User: user, + Auth: auth, + Timeout: 30 * time.Second, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), //ssh.FixedHostKey(hostKey), + } + + // connet to ssh + addr = fmt.Sprintf("%s:%d", host, port) + if sshClient, err = ssh.Dial("tcp", addr, clientConfig); err != nil { + return nil, err + } + + // create sftp client + if sftpClient, err = sftp.NewClient(sshClient); err != nil { + return nil, err + } + return sftpClient, nil +} + +func UploadFile(sftpClient *sftp.Client, localFilePath string, remotePath string) { + srcFile, err := os.Open(localFilePath) + if err != nil { + fmt.Println("os.Open error : ", localFilePath) + log.Fatal(err) + + } + defer srcFile.Close() + //golang中path.Base(pathString)函数,pathString的值必须为 linux 风格的路径,即 "/" 才能够正常的获取最后的路径段的值。 + localFilePath = filepath.ToSlash(localFilePath) + var remoteFileName = path.Base(localFilePath) + + dstFile, err := sftpClient.Create(path.Join(remotePath, remoteFileName)) + if err != nil { + fmt.Println("sftpClient.Create error : ", path.Join(remotePath, remoteFileName)) + log.Fatal(err) + + } + defer dstFile.Close() + + ff, err := ioutil.ReadAll(srcFile) + if err != nil { + fmt.Println("ReadAll error : ", localFilePath) + log.Fatal(err) + + } + dstFile.Write(ff) + fmt.Println(localFilePath + " copy file to remote server finished!") +} + +func UploadDirectory(sftpClient *sftp.Client, localPath string, remotePath string) { + localFiles, err := ioutil.ReadDir(localPath) + if err != nil { + log.Fatal("read dir list fail ", err) + } + for _, backupDir := range localFiles { + localFilePath := path.Join(localPath, backupDir.Name()) + remoteFilePath := path.Join(remotePath, backupDir.Name()) + if backupDir.IsDir() { + sftpClient.Mkdir(remoteFilePath) + UploadDirectory(sftpClient, localFilePath, remoteFilePath) + } else { + UploadFile(sftpClient, path.Join(localPath, backupDir.Name()), remotePath) + } + } + + fmt.Println(localPath + " copy directory to remote server finished!") +} diff --git a/dsDataex/Utils/SshUtil/SshUtil.go b/dsDataex/Utils/SshUtil/SshUtil.go new file mode 100644 index 00000000..31e2d31f --- /dev/null +++ b/dsDataex/Utils/SshUtil/SshUtil.go @@ -0,0 +1,65 @@ +package SshUtil + +import ( + "fmt" + "golang.org/x/crypto/ssh" + "net" + "time" +) + +type Cli struct { + IP string + Username string + Password string + Port int + client *ssh.Client + LastResult string +} + +func New(ip string, username string, password string, port ...int) *Cli { + cli := new(Cli) + cli.IP = ip + cli.Username = username + cli.Password = password + if len(port) <= 0 { + cli.Port = 22 + } else { + cli.Port = port[0] + } + return cli +} + +func (c Cli) Run(shell string) (string, error) { + if c.client == nil { + if err := c.connect(); err != nil { + return "", err + } + } + session, err := c.client.NewSession() + if err != nil { + return "", err + } + defer session.Close() + buf, err := session.CombinedOutput(shell) + + c.LastResult = string(buf) + return c.LastResult, err +} +//连接 +func (c *Cli) connect() error { + config := ssh.ClientConfig{ + User: c.Username, + Auth: []ssh.AuthMethod{ssh.Password(c.Password)}, + HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { + return nil + }, + Timeout: 10 * time.Second, + } + addr := fmt.Sprintf("%s:%d", c.IP, c.Port) + sshClient, err := ssh.Dial("tcp", addr, &config) + if err != nil { + return err + } + c.client = sshClient + return nil +}