package main import ( "fmt" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" "io" "log" "os" "time" ) type Cli struct { user string pwd string addr string client *ssh.Client } func NewCli(user,pwd, addr string) Cli { return Cli{ user: user, pwd: pwd, addr: addr, } } // Connect 连接远程服务器 func (c *Cli)Connect() error { config := &ssh.ClientConfig{ User: c.user, Auth: []ssh.AuthMethod{ ssh.Password(c.pwd), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), } client,err :=ssh.Dial("tcp",c.addr,config) if err != nil{ return fmt.Errorf("connect server error: %w", err) } c.client=client return nil } // Run 运行命令 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 "",fmt.Errorf("create new session error: %w", err) } defer session.Close() buf,err := session.CombinedOutput(shell) return string(buf),err } // Scp 复制文件 func (c Cli)Scp(srcFileName,targetFileName string)(int64,error) { if c.client == nil{ if err := c.Connect();err != nil{ return 0,err } } sftpClient,err := sftp.NewClient(c.client) if err != nil { return 0, fmt.Errorf("new sftp client error: %w", err) } defer sftpClient.Close() source,err := sftpClient.Open(srcFileName) if err != nil { return 0, fmt.Errorf("sftp client open file error: %w", err) } defer source.Close() target,err := os.OpenFile(targetFileName,os.O_RDWR|os.O_CREATE|os.O_TRUNC,0644) if err != nil { return 0, fmt.Errorf("open local file error: %w", err) } defer target.Close() n,err := io.Copy(target,source) if err != nil { return 0, fmt.Errorf("copy file error: %w", err) } return n, nil } // 调用测试 func main() { var ( username = "your username" password = "your password" addr = "ip:22" ) // 初始化 client := NewCli(username,password,addr) // ssh 并运行脚本 _,err := client.Run("sh /opt/test.sh") if err !=nil{ log.Printf("failed to run shell,err=[%v]\n", err) return } // scp 文件到本地 filename:= time.Now().Format("2006-01-02")+".log" n,err := client.Scp("/opt/"+filename,filename) if err != nil { log.Printf("failed to scp file,err=[%v]\n", err) return } log.Printf("Succeed to scp file, size=[%d]\n", n) // 处理文件并删除本地文件...... }
Golang--实现ssh&scp
最新推荐文章于 2024-07-25 13:27:49 发布