package main import ( "bufio" "fmt" "io" "os" "golang.org/x/crypto/ssh" "gopkg.in/yaml.v3" ) const sep = string(os.PathSeparator) type Cfg struct { Source string Server struct { Host string Port string User string Passwd string Target string WorkJarName string } } func main() { data, err := os.ReadFile("." + sep + "cfg.yaml") if err != nil { if os.IsNotExist(err) { fmt.Println("在当前目录没有找到 cfg.yaml 配置文件") panic(err) } else { panic(err) } } cfg := Cfg{} err = yaml.Unmarshal(data, &cfg) if err != nil { fmt.Printf("解析 yaml 文件失败,请确认文件内容是否是合法的 yaml") panic(err) } _, err = os.Stat(cfg.Source) if err != nil { if os.IsNotExist(err) { fmt.Println("没有找到 source 目标文件 - [" + cfg.Source + "]") panic(err) } else { panic(err) } } srv := cfg.Server sshCfg := &ssh.ClientConfig{ User: srv.User, Auth: []ssh.AuthMethod{ ssh.Password(srv.Passwd), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), } sc, err := ssh.Dial("tcp", fmt.Sprintf("%s:%s", srv.Host, srv.Port), sshCfg) if err != nil { fmt.Println("创建链接失败") panic(err) } s, err := sc.NewSession() if err != nil { fmt.Println("创建会话失败") panic(err) } defer s.Close() in, err := s.StdinPipe() if err != nil { fmt.Println("获取输入管道失败") panic(err) } out, err := s.StdoutPipe() if err != nil { fmt.Println("获取输出管道失败") panic(err) } s.Shell() fmt.Println("尝试输入指令") fmt.Fprintln(in, "pwd") fmt.Fprintln(in, "cd /mnt/jkd-test/java") fmt.Fprintln(in, "ls -l") fmt.Println("指令输入完毕") scanner := bufio.NewScanner(out) for scanner.Scan() { fmt.Println(scanner.Text()) } } type SshUtil struct { in io.Writer out io.Reader sca *bufio.Scanner } func NewSshUtil(in io.Writer, out io.Reader) { } func (s SshUtil) command(args string) chan string { result := make(chan string) fmt.Fprintln(s.in, args) return result }