@@ -195,6 +195,11 @@ func handleSSHConnection(s gliderssh.Session, account linuxuser.Account, verbose
195195 sshClientEnvs = append (sshClientEnvs , fmt .Sprintf ("TERM=%s" , ptyReq .Term ))
196196 }
197197
198+ sshClientEnvs = append (sshClientEnvs , sshConnectionEnvVars (s )... )
199+ if userWantsDefaultShell { // FIXME: should this be set anyway?
200+ sshClientEnvs = append (sshClientEnvs , loginEnvVars (s , account .Shell )... )
201+ }
202+
198203 //nolint:gosec // Due to nature of SSH this is a thing we must do
199204 cmd := exec .CommandContext (s .Context (), argv [0 ], argv [1 :]... )
200205 cmd .Env = sshClientEnvs
@@ -274,3 +279,44 @@ func handleSSHConnection(s gliderssh.Session, account linuxuser.Account, verbose
274279 return handleExit (cmd .Run ())
275280 }
276281}
282+
283+ // https://unix.stackexchange.com/a/76356
284+ func loginEnvVars (s gliderssh.Session , shell string ) []string {
285+ return []string {
286+ makeEnvVarStr ("HOME" , fmt .Sprintf ("/home/%s" , s .User ())),
287+ makeEnvVarStr ("SHELL" , shell ),
288+ makeEnvVarStr ("USER" , s .User ()),
289+ }
290+ }
291+
292+ // https://en.wikibooks.org/wiki/OpenSSH/Client_Applications#SSH_Client_Environment_Variables_--_Server_Side
293+ func sshConnectionEnvVars (s gliderssh.Session ) []string {
294+ clientAddress := s .RemoteAddr ().(* net.TCPAddr )
295+ serverAddress := s .LocalAddr ().(* net.TCPAddr )
296+
297+ // SSH_CONNECTION=100.76.39.10 37004 100.115.75.64 22
298+ // SSH_CONNECTION=<clientIP> <clientPort> <serverIP> <serverPort>
299+ connEnv := fmt .Sprintf (
300+ "SSH_CONNECTION=%s %d %s %d" ,
301+ clientAddress .IP .String (),
302+ clientAddress .Port ,
303+ serverAddress .IP .String (),
304+ serverAddress .Port )
305+
306+ // SSH_CLIENT=100.76.39.10 37004 22
307+ // SSH_CLIENT=<clientIP> <clientPort> <serverPort>
308+ clientEnv := fmt .Sprintf (
309+ "SSH_CLIENT=%s %d %d" ,
310+ clientAddress .IP .String (),
311+ clientAddress .Port ,
312+ serverAddress .Port )
313+
314+ // TODO
315+ // ttyEnv:="SSH_TTY=/dev/pts/2"
316+
317+ return []string {connEnv , clientEnv }
318+ }
319+
320+ func makeEnvVarStr (key string , value string ) string {
321+ return fmt .Sprintf ("%s=%s" , key , value )
322+ }
0 commit comments