2025-08-12 02:50:10 +09:00
|
|
|
package hodu
|
|
|
|
|
|
|
|
import "encoding/json"
|
|
|
|
import "fmt"
|
|
|
|
import "os"
|
|
|
|
import "os/exec"
|
|
|
|
import "os/user"
|
|
|
|
import "strconv"
|
|
|
|
import "syscall"
|
|
|
|
|
|
|
|
import pts "github.com/creack/pty"
|
|
|
|
import "golang.org/x/net/websocket"
|
|
|
|
import "golang.org/x/sys/unix"
|
|
|
|
|
|
|
|
func connect_pty(pty_shell string, pty_user string) (*exec.Cmd, *os.File, error) {
|
|
|
|
var cmd *exec.Cmd
|
|
|
|
var tty *os.File
|
|
|
|
var err error
|
|
|
|
|
|
|
|
if pty_shell == "" {
|
|
|
|
return nil, nil, fmt.Errorf("blank pty shell")
|
|
|
|
}
|
|
|
|
|
2025-08-12 16:29:44 +09:00
|
|
|
cmd = exec.Command(pty_shell)
|
2025-08-12 02:50:10 +09:00
|
|
|
if pty_user != "" {
|
|
|
|
var uid int
|
|
|
|
var gid int
|
|
|
|
var u *user.User
|
|
|
|
|
|
|
|
u, err = user.Lookup(pty_user)
|
|
|
|
if err != nil { return nil, nil, err }
|
|
|
|
|
|
|
|
uid, _ = strconv.Atoi(u.Uid)
|
|
|
|
gid, _ = strconv.Atoi(u.Gid)
|
|
|
|
cmd.SysProcAttr = &syscall.SysProcAttr{
|
|
|
|
Credential: &syscall.Credential{
|
|
|
|
Uid: uint32(uid),
|
|
|
|
Gid: uint32(gid),
|
|
|
|
},
|
|
|
|
Setsid: true,
|
|
|
|
}
|
|
|
|
cmd.Dir = u.HomeDir
|
|
|
|
cmd.Env = append(cmd.Env,
|
|
|
|
"HOME=" + u.HomeDir,
|
|
|
|
"LOGNAME=" + u.Username,
|
|
|
|
"PATH=" + os.Getenv("PATH"),
|
|
|
|
"SHELL=" + pty_shell,
|
|
|
|
"TERM=xterm",
|
|
|
|
"USER=" + u.Username,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
tty, err = pts.Start(cmd)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, err
|
|
|
|
}
|
|
|
|
|
2025-08-12 16:29:44 +09:00
|
|
|
//syscall.SetNonblock(int(tty.Fd()), true)
|
|
|
|
unix.SetNonblock(int(tty.Fd()), true)
|
2025-08-12 02:50:10 +09:00
|
|
|
|
|
|
|
return cmd, tty, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func send_ws_data_for_xterm(ws *websocket.Conn, type_val string, data string) error {
|
|
|
|
var msg []byte
|
|
|
|
var err error
|
|
|
|
msg, err = json.Marshal(json_xterm_ws_event{Type: type_val, Data: []string{ data } })
|
|
|
|
if err == nil { err = websocket.Message.Send(ws, msg) }
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|