package daemon import ( "fmt" "bufio" "io" "log" "os" "os/exec" "syscall" "strconv" "unsafe" "github.com/gliderlabs/ssh" "github.com/creack/pty" ) func setWinsize(f *os.File, w, h int) { syscall.Syscall(syscall.SYS_IOCTL, f.Fd(), uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(&struct{ h, w, x, y uint16 }{uint16(h), uint16(w), 0, 0}))) } func RunDaemon(port string) { ssh.Handle(func(s ssh.Session) { cmd := exec.Command("bash") ptyReq, winCh, isPty := s.Pty() if isPty { cmd.Env = append(cmd.Env, fmt.Sprintf("TERM=%s", ptyReq.Term)) f, err := pty.Start(cmd) if err != nil { panic(err) } go func() { for win := range winCh { setWinsize(f, win.Width, win.Height) } }() go func() { io.Copy(f, s) // stdin }() io.Copy(s, f) // stdout cmd.Wait() } else { io.WriteString(s, "No PTY requested.\n") reader := bufio.NewReader(s) for { input, _, _ := reader.ReadRune() io.WriteString(os.Stdout, strconv.QuoteRune(input)) } s.Exit(1) } }) log.Println("starting ssh server on port " + port + " ...") log.Fatal(ssh.ListenAndServe(":" + port, nil)) }