[Patch] Add SSH_CLIENT environment variable
Matt Johnston
matt at ucc.asn.au
Tue Oct 21 23:09:46 WST 2014
Thanks, I've merged it with some small changes.
I keep being surprised bash doesn't have separate
interactive/non-interactive config files, like .zshrc vs
.zshenv
Matt
On Mon, Oct 20, 2014 at 01:39:21PM -0500, Ryan Cleere wrote:
> I had a problem where bash was not overwriting the default PATH variable
> which defaults to '/usr/bin:/bin'. This was causing remote management to
> fail because it couldn't find the commands in the PATH. I found that for
> bash to execute ~/.bashrc the environment variable 'SSH_CLIENT' needs to be
> set. Openssh sets the variable to "remoteip remote_port local_port", which
> is very similar to 'SSH_CONNECTION'. This patch sets the 'SSH_CLIENT'
> environment variable which causes bash to execute .bashrc upon startup.
>
> Thanks,
> Ryan
>
> Author: Ryan <rcleere at gmail.com>
> Date: Mon Oct 20 12:59:47 2014 -0500
>
> Add SSH_CLIENT environment variable
>
> diff --git a/chansession.h b/chansession.h
> index 1a01d04..50ba8f0 100644
> --- a/chansession.h
> +++ b/chansession.h
> @@ -54,6 +54,9 @@ struct ChanSess {
> /* Used to set $SSH_CONNECTION in the child session.
> Is only set temporarily before forking */
> char *connection_string;
> +
> + /* Used to set $SSH_CLIENT in the child session. */
> + char *client_string;
>
> #ifndef DISABLE_X11FWD
> struct Listener * x11listener;
> diff --git a/svr-chansession.c b/svr-chansession.c
> index 6c73778..b3c5c87 100644
> --- a/svr-chansession.c
> +++ b/svr-chansession.c
> @@ -241,6 +241,7 @@ static int newchansess(struct Channel *channel) {
> chansess = (struct ChanSess*)m_malloc(sizeof(struct ChanSess));
> chansess->cmd = NULL;
> chansess->connection_string = NULL;
> + chansess->client_string = NULL;
> chansess->pid = 0;
>
> /* pty details */
> @@ -617,6 +618,21 @@ static char* make_connection_string() {
> 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
> * and command-execution requests, and passes the command to
> * noptycommand or ptycommand as appropriate.
> @@ -678,6 +694,7 @@ static int sessioncommand(struct Channel *channel,
> struct ChanSess *chansess,
> connection_string is freed below. */
> #ifndef USE_VFORK
> chansess->connection_string = make_connection_string();
> + chansess->client_string = make_client_string();
> #endif
>
> if (chansess->term == NULL) {
> @@ -694,6 +711,7 @@ static int sessioncommand(struct Channel *channel,
> struct ChanSess *chansess,
>
> #ifndef USE_VFORK
> m_free(chansess->connection_string);
> + m_free(chansess->client_string);
> #endif
>
> if (ret == DROPBEAR_FAILURE) {
> @@ -949,6 +967,10 @@ static void execchild(void *user_data) {
> if (chansess->connection_string) {
> addnewvar("SSH_CONNECTION", chansess->connection_string);
> }
> +
> + if (chansess->client_string) {
> + addnewvar("SSH_CLIENT", chansess->client_string);
> + }
>
> #ifdef ENABLE_SVR_PUBKEY_OPTIONS
> if (chansess->original_command) {
More information about the Dropbear
mailing list