page8_handler.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package main
  2. import (
  3. "net/http"
  4. "os"
  5. "os/exec"
  6. "syscall"
  7. "github.com/creack/pty"
  8. "github.com/gorilla/websocket"
  9. "hnyfkj.com.cn/rtu/linux/baseapp"
  10. )
  11. var sshUpgrader = websocket.Upgrader{
  12. CheckOrigin: func(r *http.Request) bool { return true },
  13. }
  14. func sshWSHandler(w http.ResponseWriter, r *http.Request) {
  15. ws, err := sshUpgrader.Upgrade(w, r, nil)
  16. if err != nil {
  17. return
  18. }
  19. defer ws.Close()
  20. //cmd := exec.Command("bash", "-l", "-i")
  21. cmd := exec.Command("login")
  22. cmd.Env = append(os.Environ(),
  23. "TERM=xterm-256color",
  24. "LANG=C.UTF-8",
  25. "LC_ALL=C.UTF-8",
  26. "COLORTERM=truecolor",
  27. "TERM_PROGRAM=xterm",
  28. )
  29. cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
  30. ptmx, err := pty.Start(cmd)
  31. if err != nil {
  32. return
  33. }
  34. if true {
  35. baseapp.Logger.Debugf("[SSH终端打开]")
  36. }
  37. defer func() {
  38. ptmx.Close()
  39. if cmd.Process != nil {
  40. syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL)
  41. }
  42. baseapp.Logger.Debugf("[SSH终端关闭]")
  43. }()
  44. pty.Setsize(ptmx, &pty.Winsize{Cols: 120, Rows: 40})
  45. go func() {
  46. buf := make([]byte, 4096)
  47. for {
  48. n, err := ptmx.Read(buf)
  49. if n > 0 {
  50. if ws.WriteMessage(websocket.TextMessage, buf[:n]) != nil {
  51. return
  52. }
  53. }
  54. if err != nil {
  55. ws.Close()
  56. return
  57. }
  58. }
  59. }()
  60. for {
  61. var msg struct {
  62. Type string `json:"type"`
  63. Data string `json:"data"`
  64. Cols uint16 `json:"cols"`
  65. Rows uint16 `json:"rows"`
  66. }
  67. if err := ws.ReadJSON(&msg); err != nil {
  68. return
  69. }
  70. switch msg.Type {
  71. case "input":
  72. if _, err := ptmx.Write([]byte(msg.Data)); err != nil {
  73. return
  74. }
  75. case "resize":
  76. if msg.Cols > 0 && msg.Rows > 0 {
  77. pty.Setsize(ptmx, &pty.Winsize{
  78. Cols: msg.Cols,
  79. Rows: msg.Rows,
  80. })
  81. }
  82. }
  83. }
  84. }