mirror of https://gogs.blitter.com/RLabs/xs
Client now passes xterm-256color in Session
This commit is contained in:
parent
9e803ffc19
commit
075ca7521c
|
@ -16,6 +16,7 @@ import (
|
||||||
type Session struct {
|
type Session struct {
|
||||||
op []byte
|
op []byte
|
||||||
who []byte
|
who []byte
|
||||||
|
termtype []byte // client initial $TERM
|
||||||
cmd []byte
|
cmd []byte
|
||||||
authCookie []byte
|
authCookie []byte
|
||||||
status uint32 // exit status (0-255 is std UNIX status)
|
status uint32 // exit status (0-255 is std UNIX status)
|
||||||
|
@ -43,6 +44,14 @@ func (h *Session) SetWho(w []byte) {
|
||||||
h.who = w
|
h.who = w
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h Session) TermType() []byte {
|
||||||
|
return h.termtype
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Session) SetTermType(t []byte) {
|
||||||
|
h.termtype = t
|
||||||
|
}
|
||||||
|
|
||||||
func (h Session) Cmd() []byte {
|
func (h Session) Cmd() []byte {
|
||||||
return h.cmd
|
return h.cmd
|
||||||
}
|
}
|
||||||
|
@ -78,10 +87,11 @@ func (h *Session) SetStatus(s uint32) {
|
||||||
h.status = s
|
h.status = s
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSession(op, who, cmd, authcookie []byte, status uint32) *Session {
|
func NewSession(op, who, ttype, cmd, authcookie []byte, status uint32) *Session {
|
||||||
return &Session{
|
return &Session{
|
||||||
op: op,
|
op: op,
|
||||||
who: who,
|
who: who,
|
||||||
|
termtype: ttype,
|
||||||
cmd: cmd,
|
cmd: cmd,
|
||||||
authCookie: authcookie,
|
authCookie: authcookie,
|
||||||
status: status}
|
status: status}
|
||||||
|
|
|
@ -81,9 +81,9 @@ func parseNonSwitchArgs(a []string) (user, host, path string, isDest bool, other
|
||||||
|
|
||||||
if i == len(a)-1 {
|
if i == len(a)-1 {
|
||||||
isDest = true
|
isDest = true
|
||||||
fmt.Println("remote path isDest")
|
//fmt.Println("remote path isDest")
|
||||||
}
|
}
|
||||||
fmt.Println("fancyArgs: user:", fancyUser, "host:", fancyHost, "path:", fancyPath)
|
//fmt.Println("fancyArgs: user:", fancyUser, "host:", fancyHost, "path:", fancyPath)
|
||||||
} else {
|
} else {
|
||||||
otherArgs = append(otherArgs, a[i])
|
otherArgs = append(otherArgs, a[i])
|
||||||
}
|
}
|
||||||
|
@ -366,7 +366,7 @@ func main() {
|
||||||
|
|
||||||
remoteUser, tmpHost, tmpPath, pathIsDest, otherArgs :=
|
remoteUser, tmpHost, tmpPath, pathIsDest, otherArgs :=
|
||||||
parseNonSwitchArgs(flag.Args())
|
parseNonSwitchArgs(flag.Args())
|
||||||
fmt.Println("otherArgs:", otherArgs)
|
//fmt.Println("otherArgs:", otherArgs)
|
||||||
|
|
||||||
// Set defaults if user doesn't specify user, path or port
|
// Set defaults if user doesn't specify user, path or port
|
||||||
var uname string
|
var uname string
|
||||||
|
@ -515,13 +515,13 @@ func main() {
|
||||||
runtime.GC()
|
runtime.GC()
|
||||||
}
|
}
|
||||||
|
|
||||||
rec := hkexsh.NewSession(op, []byte(uname), []byte(cmdStr), []byte(authCookie),0)
|
// Set up session params and send over to server
|
||||||
|
rec := hkexsh.NewSession(op, []byte(uname), []byte(os.Getenv("TERM")), []byte(cmdStr), []byte(authCookie),0)
|
||||||
_, err = fmt.Fprintf(conn, "%d %d %d %d\n",
|
_, err = fmt.Fprintf(conn, "%d %d %d %d %d\n",
|
||||||
len(rec.Op()), len(rec.Who()), len(rec.Cmd()), len(rec.AuthCookie(true)))
|
len(rec.Op()), len(rec.Who()), len(rec.TermType()), len(rec.Cmd()), len(rec.AuthCookie(true)))
|
||||||
|
|
||||||
_, err = conn.Write(rec.Op())
|
_, err = conn.Write(rec.Op())
|
||||||
_, err = conn.Write(rec.Who())
|
_, err = conn.Write(rec.Who())
|
||||||
|
_, err = conn.Write(rec.TermType())
|
||||||
_, err = conn.Write(rec.Cmd())
|
_, err = conn.Write(rec.Cmd())
|
||||||
_, err = conn.Write(rec.AuthCookie(true))
|
_, err = conn.Write(rec.AuthCookie(true))
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ import (
|
||||||
|
|
||||||
/* -------------------------------------------------------------- */
|
/* -------------------------------------------------------------- */
|
||||||
// Perform a client->server copy
|
// Perform a client->server copy
|
||||||
func runClientToServerCopyAs(who string, conn hkexnet.Conn, fpath string, chaffing bool) (err error, exitStatus uint32) {
|
func runClientToServerCopyAs(who, ttype string, conn hkexnet.Conn, fpath string, chaffing bool) (err error, exitStatus uint32) {
|
||||||
u, _ := user.Lookup(who)
|
u, _ := user.Lookup(who)
|
||||||
var uid, gid uint32
|
var uid, gid uint32
|
||||||
fmt.Sscanf(u.Uid, "%d", &uid)
|
fmt.Sscanf(u.Uid, "%d", &uid)
|
||||||
|
@ -47,7 +47,7 @@ func runClientToServerCopyAs(who string, conn hkexnet.Conn, fpath string, chaffi
|
||||||
// Investigate -- rlm 2018-01-26)
|
// Investigate -- rlm 2018-01-26)
|
||||||
os.Clearenv()
|
os.Clearenv()
|
||||||
os.Setenv("HOME", u.HomeDir)
|
os.Setenv("HOME", u.HomeDir)
|
||||||
os.Setenv("TERM", "vt102") // TODO: server or client option?
|
os.Setenv("TERM", ttype)
|
||||||
|
|
||||||
var c *exec.Cmd
|
var c *exec.Cmd
|
||||||
cmdName := "/bin/tar"
|
cmdName := "/bin/tar"
|
||||||
|
@ -113,7 +113,7 @@ func runClientToServerCopyAs(who string, conn hkexnet.Conn, fpath string, chaffi
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform a server->client copy
|
// Perform a server->client copy
|
||||||
func runServerToClientCopyAs(who string, conn hkexnet.Conn, srcPath string, chaffing bool) (err error, exitStatus uint32) {
|
func runServerToClientCopyAs(who, ttype string, conn hkexnet.Conn, srcPath string, chaffing bool) (err error, exitStatus uint32) {
|
||||||
u, _ := user.Lookup(who)
|
u, _ := user.Lookup(who)
|
||||||
var uid, gid uint32
|
var uid, gid uint32
|
||||||
fmt.Sscanf(u.Uid, "%d", &uid)
|
fmt.Sscanf(u.Uid, "%d", &uid)
|
||||||
|
@ -129,7 +129,7 @@ func runServerToClientCopyAs(who string, conn hkexnet.Conn, srcPath string, chaf
|
||||||
// Investigate -- rlm 2018-01-26)
|
// Investigate -- rlm 2018-01-26)
|
||||||
os.Clearenv()
|
os.Clearenv()
|
||||||
os.Setenv("HOME", u.HomeDir)
|
os.Setenv("HOME", u.HomeDir)
|
||||||
os.Setenv("TERM", "vt102") // TODO: server or client option?
|
os.Setenv("TERM", ttype)
|
||||||
|
|
||||||
var c *exec.Cmd
|
var c *exec.Cmd
|
||||||
cmdName := "/bin/tar"
|
cmdName := "/bin/tar"
|
||||||
|
@ -198,7 +198,7 @@ func runServerToClientCopyAs(who string, conn hkexnet.Conn, srcPath string, chaf
|
||||||
// Run a command (via default shell) as a specific user
|
// Run a command (via default shell) as a specific user
|
||||||
//
|
//
|
||||||
// Uses ptys to support commands which expect a terminal.
|
// Uses ptys to support commands which expect a terminal.
|
||||||
func runShellAs(who string, cmd string, interactive bool, conn hkexnet.Conn, chaffing bool) (err error, exitStatus uint32) {
|
func runShellAs(who, ttype string, cmd string, interactive bool, conn hkexnet.Conn, chaffing bool) (err error, exitStatus uint32) {
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
u, _ := user.Lookup(who)
|
u, _ := user.Lookup(who)
|
||||||
var uid, gid uint32
|
var uid, gid uint32
|
||||||
|
@ -215,8 +215,7 @@ func runShellAs(who string, cmd string, interactive bool, conn hkexnet.Conn, cha
|
||||||
// Investigate -- rlm 2018-01-26)
|
// Investigate -- rlm 2018-01-26)
|
||||||
os.Clearenv()
|
os.Clearenv()
|
||||||
os.Setenv("HOME", u.HomeDir)
|
os.Setenv("HOME", u.HomeDir)
|
||||||
//os.Setenv("SHELL", "/bin/bash")
|
os.Setenv("TERM", ttype)
|
||||||
os.Setenv("TERM", "vt102") // TODO: server or client option?
|
|
||||||
|
|
||||||
var c *exec.Cmd
|
var c *exec.Cmd
|
||||||
if interactive {
|
if interactive {
|
||||||
|
@ -389,16 +388,16 @@ func main() {
|
||||||
//Otherwise data will be sitting in the channel that isn't
|
//Otherwise data will be sitting in the channel that isn't
|
||||||
//passed down to the command handlers.
|
//passed down to the command handlers.
|
||||||
var rec hkexsh.Session
|
var rec hkexsh.Session
|
||||||
var len1, len2, len3, len4 uint32
|
var len1, len2, len3, len4, len5 uint32
|
||||||
|
|
||||||
n, err := fmt.Fscanf(hc, "%d %d %d %d\n", &len1, &len2, &len3, &len4)
|
n, err := fmt.Fscanf(hc, "%d %d %d %d %d\n", &len1, &len2, &len3, &len4, &len5)
|
||||||
log.Printf("hkexsh.Session read:%d %d %d %d\n", len1, len2, len3, len4)
|
log.Printf("hkexsh.Session read:%d %d %d %d %d\n", len1, len2, len3, len4, len5)
|
||||||
|
|
||||||
if err != nil || n < 4 {
|
if err != nil || n < 5 {
|
||||||
log.Println("[Bad hkexsh.Session fmt]")
|
log.Println("[Bad hkexsh.Session fmt]")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
//fmt.Printf(" lens:%d %d %d %d\n", len1, len2, len3, len4)
|
//fmt.Printf(" lens:%d %d %d %d %d\n", len1, len2, len3, len4, len5)
|
||||||
|
|
||||||
tmp := make([]byte, len1, len1)
|
tmp := make([]byte, len1, len1)
|
||||||
_, err = io.ReadFull(hc, tmp)
|
_, err = io.ReadFull(hc, tmp)
|
||||||
|
@ -418,13 +417,21 @@ func main() {
|
||||||
|
|
||||||
tmp = make([]byte, len3, len3)
|
tmp = make([]byte, len3, len3)
|
||||||
_, err = io.ReadFull(hc, tmp)
|
_, err = io.ReadFull(hc, tmp)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("[Bad hkexsh.Session.TermType]")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
rec.SetTermType(tmp)
|
||||||
|
|
||||||
|
tmp = make([]byte, len4, len4)
|
||||||
|
_, err = io.ReadFull(hc, tmp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[Bad hkexsh.Session.Cmd]")
|
log.Println("[Bad hkexsh.Session.Cmd]")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
rec.SetCmd(tmp)
|
rec.SetCmd(tmp)
|
||||||
|
|
||||||
tmp = make([]byte, len4, len4)
|
tmp = make([]byte, len5, len5)
|
||||||
_, err = io.ReadFull(hc, tmp)
|
_, err = io.ReadFull(hc, tmp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[Bad hkexsh.Session.AuthCookie]")
|
log.Println("[Bad hkexsh.Session.AuthCookie]")
|
||||||
|
@ -458,7 +465,7 @@ func main() {
|
||||||
hname := strings.Split(addr.String(), ":")[0]
|
hname := strings.Split(addr.String(), ":")[0]
|
||||||
|
|
||||||
log.Printf("[Running command for [%s@%s]]\n", rec.Who(), hname)
|
log.Printf("[Running command for [%s@%s]]\n", rec.Who(), hname)
|
||||||
runErr, cmdStatus := runShellAs(string(rec.Who()), string(rec.Cmd()), false, hc, chaffEnabled)
|
runErr, cmdStatus := runShellAs(string(rec.Who()), string(rec.TermType()), string(rec.Cmd()), false, hc, chaffEnabled)
|
||||||
// Returned hopefully via an EOF or exit/logout;
|
// Returned hopefully via an EOF or exit/logout;
|
||||||
// Clear current op so user can enter next, or EOF
|
// Clear current op so user can enter next, or EOF
|
||||||
rec.SetOp([]byte{0})
|
rec.SetOp([]byte{0})
|
||||||
|
@ -478,7 +485,7 @@ func main() {
|
||||||
utmpx := goutmp.Put_utmp(string(rec.Who()), hname)
|
utmpx := goutmp.Put_utmp(string(rec.Who()), hname)
|
||||||
defer func() { goutmp.Unput_utmp(utmpx) }()
|
defer func() { goutmp.Unput_utmp(utmpx) }()
|
||||||
goutmp.Put_lastlog_entry("hkexsh", string(rec.Who()), hname)
|
goutmp.Put_lastlog_entry("hkexsh", string(rec.Who()), hname)
|
||||||
runErr, cmdStatus := runShellAs(string(rec.Who()), string(rec.Cmd()), true, hc, chaffEnabled)
|
runErr, cmdStatus := runShellAs(string(rec.Who()), string(rec.TermType()), string(rec.Cmd()), true, hc, chaffEnabled)
|
||||||
// Returned hopefully via an EOF or exit/logout;
|
// Returned hopefully via an EOF or exit/logout;
|
||||||
// Clear current op so user can enter next, or EOF
|
// Clear current op so user can enter next, or EOF
|
||||||
rec.SetOp([]byte{0})
|
rec.SetOp([]byte{0})
|
||||||
|
@ -494,7 +501,7 @@ func main() {
|
||||||
addr := hc.RemoteAddr()
|
addr := hc.RemoteAddr()
|
||||||
hname := strings.Split(addr.String(), ":")[0]
|
hname := strings.Split(addr.String(), ":")[0]
|
||||||
log.Printf("[Running copy for [%s@%s]]\n", rec.Who(), hname)
|
log.Printf("[Running copy for [%s@%s]]\n", rec.Who(), hname)
|
||||||
runErr, cmdStatus := runClientToServerCopyAs(string(rec.Who()), hc, string(rec.Cmd()), chaffEnabled)
|
runErr, cmdStatus := runClientToServerCopyAs(string(rec.Who()), string(rec.TermType()), hc, string(rec.Cmd()), chaffEnabled)
|
||||||
// Returned hopefully via an EOF or exit/logout;
|
// Returned hopefully via an EOF or exit/logout;
|
||||||
// Clear current op so user can enter next, or EOF
|
// Clear current op so user can enter next, or EOF
|
||||||
rec.SetOp([]byte{0})
|
rec.SetOp([]byte{0})
|
||||||
|
@ -510,7 +517,7 @@ func main() {
|
||||||
addr := hc.RemoteAddr()
|
addr := hc.RemoteAddr()
|
||||||
hname := strings.Split(addr.String(), ":")[0]
|
hname := strings.Split(addr.String(), ":")[0]
|
||||||
log.Printf("[Running copy for [%s@%s]]\n", rec.Who(), hname)
|
log.Printf("[Running copy for [%s@%s]]\n", rec.Who(), hname)
|
||||||
runErr, cmdStatus := runServerToClientCopyAs(string(rec.Who()), hc, string(rec.Cmd()), chaffEnabled)
|
runErr, cmdStatus := runServerToClientCopyAs(string(rec.Who()), string(rec.TermType()), hc, string(rec.Cmd()), chaffEnabled)
|
||||||
//fmt.Print("ServerToClient cmdStatus:", cmdStatus)
|
//fmt.Print("ServerToClient cmdStatus:", cmdStatus)
|
||||||
// Returned hopefully via an EOF or exit/logout;
|
// Returned hopefully via an EOF or exit/logout;
|
||||||
// Clear current op so user can enter next, or EOF
|
// Clear current op so user can enter next, or EOF
|
||||||
|
|
Loading…
Reference in New Issue