package ssh import ( "github.com/gliderlabs/ssh" "golang.org/x/crypto/ssh/terminal" "io" "strings" "HFish/utils/is" "HFish/core/rpc/client" "HFish/core/report" "HFish/utils/log" "HFish/utils/conf" "HFish/utils/json" "github.com/bitly/go-simplejson" "HFish/utils/file" "strconv" ) var clientData map[string]string func getJson() *simplejson.Json { res, err := json.GetSsh() if err != nil { log.Pr("HFish", "127.0.0.1", "解析 SSH JSON 文件失败", err) } return res } func Start(addr string) { clientData = make(map[string]string) ssh.ListenAndServe( addr, func(s ssh.Session) { res := getJson() term := terminal.NewTerminal(s, res.Get("hostname").MustString()) line := "" for { line, _ = term.ReadLine() if line == "exit" { break } fileName := res.Get("command").Get(line).MustString() output := file.ReadLibsText("ssh", fileName) id := clientData[s.RemoteAddr().String()] if is.Rpc() { go client.ReportResult("SSH", "", "", "&&"+line, id) } else { go report.ReportUpdateSSH(id, "&&"+line) } io.WriteString(s, output+"\n") } }, ssh.PasswordAuth(func(s ssh.Context, password string) bool { info := s.User() + "&&" + password arr := strings.Split(s.RemoteAddr().String(), ":") log.Pr("SSH", arr[0], "已经连接") var id string // 判断是否为 RPC 客户端 if is.Rpc() { id = client.ReportResult("SSH", "", arr[0], info, "0") } else { id = strconv.FormatInt(report.ReportSSH(arr[0], "本机", info), 10) } sshStatus := conf.Get("ssh", "status") if (sshStatus == "2") { // 高交互模式 res := getJson() accountx := res.Get("account") passwordx := res.Get("password") if (accountx.MustString() == s.User() && passwordx.MustString() == password) { clientData[s.RemoteAddr().String()] = id return true } } // 低交互模式,返回账号密码不正确 return false }), ) }