Fix single command ssh exec (#483)
This commit is contained in:
parent
d13f4b5948
commit
c726d20578
|
@ -7,10 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- SSH `print-cert` has a new `-raw` flag to get the PEM representation of a certificate. (#483)
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Valid recv_error packets were incorrectly marked as "spoofing" and ignored. (#482)
|
- Valid recv_error packets were incorrectly marked as "spoofing" and ignored. (#482)
|
||||||
|
|
||||||
|
- SSH server handles single `exec` requests correctly. (#483)
|
||||||
|
|
||||||
## [1.4.0] - 2021-05-11
|
## [1.4.0] - 2021-05-11
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
12
ssh.go
12
ssh.go
|
@ -26,6 +26,7 @@ type sshListHostMapFlags struct {
|
||||||
type sshPrintCertFlags struct {
|
type sshPrintCertFlags struct {
|
||||||
Json bool
|
Json bool
|
||||||
Pretty bool
|
Pretty bool
|
||||||
|
Raw bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type sshPrintTunnelFlags struct {
|
type sshPrintTunnelFlags struct {
|
||||||
|
@ -266,6 +267,7 @@ func attachCommands(l *logrus.Logger, ssh *sshd.SSHServer, hostMap *HostMap, pen
|
||||||
s := sshPrintCertFlags{}
|
s := sshPrintCertFlags{}
|
||||||
fl.BoolVar(&s.Json, "json", false, "outputs as json")
|
fl.BoolVar(&s.Json, "json", false, "outputs as json")
|
||||||
fl.BoolVar(&s.Pretty, "pretty", false, "pretty prints json, assumes -json")
|
fl.BoolVar(&s.Pretty, "pretty", false, "pretty prints json, assumes -json")
|
||||||
|
fl.BoolVar(&s.Raw, "raw", false, "raw prints the PEM encoded certificate, not compatible with -json or -pretty")
|
||||||
return fl, &s
|
return fl, &s
|
||||||
},
|
},
|
||||||
Callback: func(fs interface{}, a []string, w sshd.StringWriter) error {
|
Callback: func(fs interface{}, a []string, w sshd.StringWriter) error {
|
||||||
|
@ -711,6 +713,16 @@ func sshPrintCert(ifce *Interface, fs interface{}, a []string, w sshd.StringWrit
|
||||||
return w.WriteBytes(b)
|
return w.WriteBytes(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if args.Raw {
|
||||||
|
b, err := cert.MarshalToPEM()
|
||||||
|
if err != nil {
|
||||||
|
//TODO: handle it
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return w.WriteBytes(b)
|
||||||
|
}
|
||||||
|
|
||||||
return w.WriteLine(cert.String())
|
return w.WriteLine(cert.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,11 +81,18 @@ func (s *session) handleRequests(in <-chan *ssh.Request, channel ssh.Channel) {
|
||||||
case "exec":
|
case "exec":
|
||||||
var payload = struct{ Value string }{}
|
var payload = struct{ Value string }{}
|
||||||
cErr := ssh.Unmarshal(req.Payload, &payload)
|
cErr := ssh.Unmarshal(req.Payload, &payload)
|
||||||
if cErr == nil {
|
if cErr != nil {
|
||||||
s.dispatchCommand(payload.Value, &stringWriter{channel})
|
req.Reply(false, nil)
|
||||||
} else {
|
return
|
||||||
//TODO: log it
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
req.Reply(true, nil)
|
||||||
|
s.dispatchCommand(payload.Value, &stringWriter{channel})
|
||||||
|
|
||||||
|
//TODO: Fix error handling and report the proper status back
|
||||||
|
status := struct{ Status uint32 }{uint32(0)}
|
||||||
|
//TODO: I think this is how we shut down a shell as well?
|
||||||
|
channel.SendRequest("exit-status", false, ssh.Marshal(status))
|
||||||
channel.Close()
|
channel.Close()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue