Skip to content

Commit d75ac29

Browse files
committed
ctrl+c for pty only
1 parent 7c5274f commit d75ac29

1 file changed

Lines changed: 44 additions & 37 deletions

File tree

internal/server/session.go

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package server
33
import (
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
241242
func (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

310317
func (s *Server) handleSFTPSubsystem(_ *ssh.ServerConn, connInfo *ConnectionInfo, channel ssh.Channel) {

0 commit comments

Comments
 (0)