@@ -64,6 +64,9 @@ func NewServer(addr string, hostKey []byte, keys []ssh.PublicKey, workdir string
64
64
65
65
return true
66
66
},
67
+ X11ForwardingCallback : func (ctx ssh.Context , x11 ssh.X11 ) bool {
68
+ return true
69
+ },
67
70
ChannelHandlers : map [string ]ssh.ChannelHandler {
68
71
"direct-tcpip" : ssh .DirectTCPIPHandler ,
69
72
"[email protected] " :
ssh .
DirectStreamLocalHandler ,
@@ -171,6 +174,7 @@ func getShell() ([]string, error) {
171
174
172
175
func (s * Server ) handler (sess ssh.Session ) {
173
176
ptyReq , winCh , isPty := sess .Pty ()
177
+ x11Req , isX11 := sess .X11 ()
174
178
cmd := s .getCommand (sess , isPty )
175
179
if ssh .AgentRequested (sess ) {
176
180
// on some systems (like containers) /tmp may not exists, this ensures
@@ -191,6 +195,20 @@ func (s *Server) handler(sess ssh.Session) {
191
195
cmd .Env = append (cmd .Env , fmt .Sprintf ("%s=%s" , "SSH_AUTH_SOCK" , l .Addr ().String ()))
192
196
}
193
197
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
+
194
212
// start shell session
195
213
var err error
196
214
if isPty {
0 commit comments