page8_handler.go 1.6 KB

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