Skip to content

Commit 7af086b

Browse files
committed
Add support for X11 forwarding
Closes loft-sh#654.
1 parent 0059954 commit 7af086b

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

pkg/ssh/server/ssh.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ func NewServer(addr string, hostKey []byte, keys []ssh.PublicKey, workdir string
6464

6565
return true
6666
},
67+
X11ForwardingCallback: func(ctx ssh.Context, x11 ssh.X11) bool {
68+
return true
69+
},
6770
ChannelHandlers: map[string]ssh.ChannelHandler{
6871
"direct-tcpip": ssh.DirectTCPIPHandler,
6972
"[email protected]": ssh.DirectStreamLocalHandler,
@@ -171,6 +174,7 @@ func getShell() ([]string, error) {
171174

172175
func (s *Server) handler(sess ssh.Session) {
173176
ptyReq, winCh, isPty := sess.Pty()
177+
x11Req, isX11 := sess.X11()
174178
cmd := s.getCommand(sess, isPty)
175179
if ssh.AgentRequested(sess) {
176180
// on some systems (like containers) /tmp may not exists, this ensures
@@ -191,6 +195,20 @@ func (s *Server) handler(sess ssh.Session) {
191195
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", "SSH_AUTH_SOCK", l.Addr().String()))
192196
}
193197

198+
if isX11 {
199+
l, xauth, err := ssh.NewX11Forwarder(x11Req)
200+
if err != nil {
201+
s.exitWithError(sess, perrors.Wrap(err, "start X11 forwarder"))
202+
return
203+
}
204+
205+
defer l.Close()
206+
defer os.Remove(xauth.Name())
207+
go ssh.ForwardX11Connections(l, xauth, sess)
208+
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s:%d.0", "DISPLAY", ssh.X11DisplayHost, l.Addr().(*net.TCPAddr).Port - ssh.X11DisplayBasePort))
209+
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", "XAUTHORITY", xauth.Name()))
210+
}
211+
194212
// start shell session
195213
var err error
196214
if isPty {

0 commit comments

Comments
 (0)