Skip to content

Commit bab3c85

Browse files
committed
feat: Set SSH env vars: SSH_CLIENT, SSH_CONNECTION and SSH_TTY
Fixes #2339
1 parent f7ccfa2 commit bab3c85

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

agent/agent.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,11 @@ func (a *agent) handleSSHSession(session ssh.Session) (retErr error) {
427427
if err != nil {
428428
return err
429429
}
430+
// Set SSH connection environment variables, from the clients perspective.
431+
srcAddr, srcPort := addrToSSHEnvAddr(session.RemoteAddr())
432+
dstAddr, dstPort := addrToSSHEnvAddr(session.LocalAddr())
433+
cmd.Env = append(cmd.Env, fmt.Sprintf("SSH_CLIENT=%s %s %s", srcAddr, srcPort, dstPort))
434+
cmd.Env = append(cmd.Env, fmt.Sprintf("SSH_CONNECTION=%s %s %s %s", srcAddr, srcPort, dstAddr, dstPort))
430435

431436
if ssh.AgentRequested(session) {
432437
l, err := ssh.NewAgentListener()
@@ -441,6 +446,8 @@ func (a *agent) handleSSHSession(session ssh.Session) (retErr error) {
441446
sshPty, windowSize, isPty := session.Pty()
442447
if isPty {
443448
cmd.Env = append(cmd.Env, fmt.Sprintf("TERM=%s", sshPty.Term))
449+
450+
// The pty package sets `SSH_TTY` on supported platforms.
444451
ptty, process, err := pty.Start(cmd)
445452
if err != nil {
446453
return xerrors.Errorf("start command: %w", err)
@@ -695,6 +702,19 @@ func (a *agent) handleReconnectingPTY(ctx context.Context, rawID string, conn ne
695702
}
696703
}
697704

705+
// addrToSSHEnvAddr turns the address and port into space-separated values,
706+
// works with IPv4, IPv6 and invalid addresses (such as [peer/unknown-addr]).
707+
func addrToSSHEnvAddr(a net.Addr) (addr string, port string) {
708+
addr = a.String()
709+
port = "0"
710+
li := strings.LastIndex(addr, ":")
711+
if li != -1 {
712+
port = addr[li+1:]
713+
addr = addr[:li]
714+
}
715+
return addr, port
716+
}
717+
698718
// dialResponse is written to datachannels with protocol "dial" by the agent as
699719
// the first packet to signify whether the dial succeeded or failed.
700720
type dialResponse struct {

pty/start_other.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package pty
55

66
import (
7+
"fmt"
78
"os/exec"
89
"runtime"
910
"strings"
@@ -18,6 +19,8 @@ func startPty(cmd *exec.Cmd) (PTY, Process, error) {
1819
if err != nil {
1920
return nil, nil, xerrors.Errorf("open: %w", err)
2021
}
22+
23+
cmd.Env = append(cmd.Env, fmt.Sprintf("SSH_PTY=%s", tty.Name()))
2124
cmd.SysProcAttr = &syscall.SysProcAttr{
2225
Setsid: true,
2326
Setctty: true,

0 commit comments

Comments
 (0)