main.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package main
  2. import (
  3. "encoding/base64"
  4. "fmt"
  5. "os"
  6. "os/user"
  7. "regexp"
  8. "strings"
  9. "git.wecise.com/wecise/odbserver/matrix/logger"
  10. "gopkg.in/yaml.v2"
  11. )
  12. func init() {
  13. logger.SetConsole(true)
  14. logger.SetLevel(logger.TRACE)
  15. logger.SetFormat("yyyy-MM-dd HH:mm:SS.sss [level] msg")
  16. }
  17. func uchi() (u, c, h string, i int) {
  18. if len(os.Args) < 2 {
  19. return
  20. }
  21. if msi := regexp.MustCompile(`^([^:]+):(.*)@([^@]*)$`).FindStringSubmatchIndex(os.Args[1]); msi != nil {
  22. u = os.Args[1][msi[2]:msi[3]]
  23. c = "=" + os.Args[1][msi[4]:msi[5]]
  24. h = os.Args[1][msi[6]:msi[7]]
  25. i = 2
  26. return
  27. }
  28. if msi := regexp.MustCompile(`^([^:]+)@([^@]*)$`).FindStringSubmatchIndex(os.Args[1]); msi != nil {
  29. u = os.Args[1][msi[2]:msi[3]]
  30. h = os.Args[1][msi[6]:msi[7]]
  31. i = 2
  32. } else if os.Args[1][0] != '-' && strings.Index(os.Args[1], "=") < 0 {
  33. h = os.Args[1]
  34. i = 2
  35. } else {
  36. i = 1
  37. }
  38. if u == "" {
  39. user, e := user.Current()
  40. if e != nil {
  41. logger.Error(e)
  42. return "", "", "", 0
  43. }
  44. u = user.Username
  45. }
  46. if h == "" {
  47. h = "127.0.0.1"
  48. }
  49. return
  50. }
  51. type KV struct{ Key, Val string }
  52. func parseArgs(args []string) (kvs []*KV) {
  53. argk := ""
  54. argv := ""
  55. for _, arg := range args {
  56. if argk != "" {
  57. argv = arg
  58. } else if regexp.MustCompile(`^\-\w+$`).MatchString(arg) {
  59. argk = arg[1:]
  60. continue
  61. } else {
  62. kv := strings.SplitN(arg, "=", 2)
  63. if len(kv) == 2 {
  64. argk = kv[0]
  65. argv = kv[1]
  66. } else {
  67. argk = ""
  68. argv = arg
  69. }
  70. }
  71. kvs = append(kvs, &KV{argk, argv})
  72. argk, argv = "", ""
  73. }
  74. if argk != "" {
  75. kvs = append(kvs, &KV{argk, argv})
  76. }
  77. return
  78. }
  79. func main() {
  80. u, c, h, i := uchi()
  81. if i == 0 {
  82. fmt.Println("usage:")
  83. fmt.Println(" msh user:password@host|p=password|a=passcode [[c=]command [p=password|a=passcode] [x=cmd-end-regexp] [[r=regexp] [o=output|n=outputline]]...]...")
  84. fmt.Println(" a=passcode should be base64 encoded, or use p=password")
  85. fmt.Println(" debug info include: p(progress) a(argments) m(match) 1(all)")
  86. return
  87. }
  88. kvs := parseArgs(os.Args[i:])
  89. if c == "" {
  90. for _, kv := range kvs {
  91. if kv.Key == "a" {
  92. c = kv.Val
  93. if c == "" {
  94. c = "="
  95. }
  96. break
  97. }
  98. if kv.Key == "p" {
  99. c = "=" + kv.Val
  100. break
  101. }
  102. }
  103. }
  104. p := c
  105. if p[0:1] == "=" {
  106. p = p[1:]
  107. } else {
  108. x, e := base64.RawStdEncoding.DecodeString(p)
  109. if e == nil {
  110. p = string(x)
  111. }
  112. // else 不是Base64编码,保持原值
  113. }
  114. // explainArgs key, val
  115. cmds := []*Command{{Cmd: "ssh " + u + ":" + p + "@" + h, Password: c, Regexps: []*Matcher{{Regexp: nil, Output: ""}}, Endregx: regxprompt}}
  116. for _, kv := range kvs {
  117. key, val := kv.Key, kv.Val
  118. switch key {
  119. case "", "cmd", "command", "c":
  120. cmds = append(cmds, &Command{Cmd: val, Password: c, Regexps: []*Matcher{{Regexp: nil, Output: ""}}, Endregx: regxprompt})
  121. case "ry":
  122. re, err := regexp.Compile(val)
  123. if err != nil {
  124. logger.Error("arg", i, err)
  125. return
  126. } else {
  127. regxyesno = &Regexp{re}
  128. }
  129. case "rc":
  130. re, err := regexp.Compile(val)
  131. if err != nil {
  132. logger.Error("arg", i, err)
  133. return
  134. } else {
  135. regxpassword = &Regexp{re}
  136. }
  137. case "rp":
  138. re, err := regexp.Compile(val)
  139. if err != nil {
  140. logger.Error("arg", i, err)
  141. return
  142. } else {
  143. regxprompt = &Regexp{re}
  144. }
  145. case "password", "code", "pass", "p":
  146. cmds[len(cmds)-1].Password = "=" + val
  147. case "passcode", "b64code", "a":
  148. cmds[len(cmds)-1].Password = val
  149. case "re", "r", "regex":
  150. if val == "" {
  151. cmds[len(cmds)-1].Regexps = append(cmds[len(cmds)-1].Regexps, &Matcher{Regexp: nil})
  152. } else {
  153. re, err := regexp.Compile(val)
  154. if err != nil {
  155. logger.Error("arg", i, err)
  156. return
  157. } else {
  158. cmds[len(cmds)-1].Regexps = append(cmds[len(cmds)-1].Regexps, &Matcher{Regexp: &Regexp{re}})
  159. }
  160. }
  161. case "x", "end":
  162. if val == "" {
  163. cmds[len(cmds)-1].Endregx = regxprompt
  164. } else {
  165. re, err := regexp.Compile(val)
  166. if err != nil {
  167. logger.Error("arg", i, err)
  168. return
  169. } else {
  170. cmds[len(cmds)-1].Endregx = &Regexp{re}
  171. }
  172. }
  173. case "out", "o", "output":
  174. cmds[len(cmds)-1].Regexps[len(cmds[len(cmds)-1].Regexps)-1].Output += val
  175. case "outln", "n", "outputline":
  176. cmds[len(cmds)-1].Regexps[len(cmds[len(cmds)-1].Regexps)-1].Output += val + "\n"
  177. case "debug", "d":
  178. cmds[len(cmds)-1].Regexps[len(cmds[len(cmds)-1].Regexps)-1].Debug += val
  179. }
  180. }
  181. if strings.Index(cmds[0].Regexps[0].Debug, "a") >= 0 || strings.Index(cmds[0].Regexps[0].Debug, "1") >= 0 {
  182. //bs, _ := json.MarshalIndent(cmds, "", " ")
  183. bs, _ := yaml.Marshal(cmds)
  184. logger.Debug("arguments:\n" + string(bs))
  185. }
  186. node := &Node{
  187. Name: "x",
  188. Alias: "x",
  189. Host: h,
  190. User: u,
  191. Port: 22,
  192. KeyPath: "",
  193. Passphrase: "",
  194. Password: p,
  195. Commands: cmds,
  196. Children: []*Node{},
  197. Jump: []*Node{},
  198. }
  199. sshc := NewClient(node)
  200. sshc.Login()
  201. }