@@ -3,6 +3,7 @@ package server
33import (
44 "encoding/binary"
55 "fmt"
6+ "time"
67
78 "github.com/k8shell-io/common/models"
89 "golang.org/x/crypto/ssh"
@@ -241,46 +242,17 @@ func (s *Server) handleSessionRequests(requests <-chan *ssh.Request, connInfo *C
241242func (s * Server ) handleShellRequest (sshConn * ssh.ServerConn , connInfo * ConnectionInfo , channel ssh.Channel ) {
242243 session := connInfo .Session
243244
244- // stopChan := make(chan struct{})
245-
246- // go func() {
247- // buffer := make([]byte, 1)
248- // for {
249- // select {
250- // case <-stopChan:
251- // return
252- // default:
253- // size, err := channel.ReadBufferSize()
254- // if err != nil {
255- // return
256- // }
257-
258- // if size > 0 {
259- // n, err := channel.Read(buffer)
260- // if err != nil {
261- // return
262- // }
263-
264- // if n > 0 && buffer[0] == 3 {
265- // s.log.Info().Msgf("Ctrl+C detected for user %s, canceling shell session", session.Username)
266- // connInfo.cancel()
267- // return
268- // }
269- // } else {
270- // select {
271- // case <-stopChan:
272- // return
273- // case <-time.After(10 * time.Millisecond):
274- // // Continue checking
275- // }
276- // }
277- // }
278- // }
279- // }()
245+ var stopCtrlC chan struct {}
246+ if connInfo .Session .HasPTY {
247+ stopCtrlC = make (chan struct {})
248+ go s .cancelOnCtrlC (channel , connInfo , stopCtrlC )
249+ }
280250
281251 k8shelld , err := connInfo .CreateK8shelldClient (connInfo .Ctx , channel , s .Config .Server .ShowProvisionInfo ,
282252 s .provisioner , session .Env )
283- // close(stopChan)
253+ if stopCtrlC != nil {
254+ close (stopCtrlC )
255+ }
284256 if err != nil {
285257 s .log .Error ().Msgf ("Failed to get k8shelld client for user %s: %v" , connInfo .User .Username , err )
286258 return
@@ -305,6 +277,41 @@ func (s *Server) handleShellRequest(sshConn *ssh.ServerConn, connInfo *Connectio
305277 }
306278}
307279
280+ func (s * Server ) cancelOnCtrlC (channel ssh.Channel , connInfo * ConnectionInfo , stopChan chan struct {}) {
281+ buffer := make ([]byte , 1 )
282+ for {
283+ select {
284+ case <- stopChan :
285+ return
286+ default :
287+ size , err := channel .ReadBufferSize ()
288+ if err != nil {
289+ return
290+ }
291+
292+ if size > 0 {
293+ n , err := channel .Read (buffer )
294+ if err != nil {
295+ return
296+ }
297+
298+ if n > 0 && buffer [0 ] == 3 {
299+ s .log .Info ().Msgf ("Ctrl+C detected, canceling shell session" )
300+ connInfo .cancel ()
301+ return
302+ }
303+ } else {
304+ select {
305+ case <- stopChan :
306+ return
307+ case <- time .After (10 * time .Millisecond ):
308+ // Continue checking
309+ }
310+ }
311+ }
312+ }
313+ }
314+
308315// ** SFTP
309316
310317func (s * Server ) handleSFTPSubsystem (_ * ssh.ServerConn , connInfo * ConnectionInfo , channel ssh.Channel ) {
0 commit comments