Add SSH_CLIENT environment variable

This commit is contained in:
Ryan Cleere 2014-10-20 12:59:47 -05:00
parent 6d2d3669f3
commit 957450582f
2 changed files with 25 additions and 0 deletions

View File

@ -54,6 +54,9 @@ struct ChanSess {
/* Used to set $SSH_CONNECTION in the child session. /* Used to set $SSH_CONNECTION in the child session.
Is only set temporarily before forking */ Is only set temporarily before forking */
char *connection_string; char *connection_string;
/* Used to set $SSH_CLIENT in the child session. */
char *client_string;
#ifndef DISABLE_X11FWD #ifndef DISABLE_X11FWD
struct Listener * x11listener; struct Listener * x11listener;

View File

@ -241,6 +241,7 @@ static int newchansess(struct Channel *channel) {
chansess = (struct ChanSess*)m_malloc(sizeof(struct ChanSess)); chansess = (struct ChanSess*)m_malloc(sizeof(struct ChanSess));
chansess->cmd = NULL; chansess->cmd = NULL;
chansess->connection_string = NULL; chansess->connection_string = NULL;
chansess->client_string = NULL;
chansess->pid = 0; chansess->pid = 0;
/* pty details */ /* pty details */
@ -617,6 +618,21 @@ static char* make_connection_string() {
return ret; return ret;
} }
static char* make_client_string() {
char *local_ip, *local_port, *remote_ip, *remote_port;
size_t len;
char *ret;
get_socket_address(ses.sock_in, &local_ip, &local_port, &remote_ip, &remote_port, 0);
len = strlen(local_ip) + strlen(local_port) + strlen(remote_ip) + strlen(remote_port) + 4;
ret = m_malloc(len);
snprintf(ret, len, "%s %s %s", remote_ip, remote_port, local_port);
m_free(local_ip);
m_free(local_port);
m_free(remote_ip);
m_free(remote_port);
return ret;
}
/* Handle a command request from the client. This is used for both shell /* Handle a command request from the client. This is used for both shell
* and command-execution requests, and passes the command to * and command-execution requests, and passes the command to
* noptycommand or ptycommand as appropriate. * noptycommand or ptycommand as appropriate.
@ -678,6 +694,7 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
connection_string is freed below. */ connection_string is freed below. */
#ifndef USE_VFORK #ifndef USE_VFORK
chansess->connection_string = make_connection_string(); chansess->connection_string = make_connection_string();
chansess->client_string = make_client_string();
#endif #endif
if (chansess->term == NULL) { if (chansess->term == NULL) {
@ -694,6 +711,7 @@ static int sessioncommand(struct Channel *channel, struct ChanSess *chansess,
#ifndef USE_VFORK #ifndef USE_VFORK
m_free(chansess->connection_string); m_free(chansess->connection_string);
m_free(chansess->client_string);
#endif #endif
if (ret == DROPBEAR_FAILURE) { if (ret == DROPBEAR_FAILURE) {
@ -949,6 +967,10 @@ static void execchild(void *user_data) {
if (chansess->connection_string) { if (chansess->connection_string) {
addnewvar("SSH_CONNECTION", chansess->connection_string); addnewvar("SSH_CONNECTION", chansess->connection_string);
} }
if (chansess->client_string) {
addnewvar("SSH_CLIENT", chansess->client_string);
}
#ifdef ENABLE_SVR_PUBKEY_OPTIONS #ifdef ENABLE_SVR_PUBKEY_OPTIONS
if (chansess->original_command) { if (chansess->original_command) {