[PATCH] Allow the TERM env variable to be overwritten by .ssh/config
Palmer Dabbelt
palmer at dabbelt.com
Tue Sep 23 08:33:30 EST 2014
I run urxvt, but I have some hosts that have an older terminal info
database that don't support the "rxvt-unicode-256color" string that my
terminal exports. Many applications just fail to open when faced with
an unknown TERM string, which is a huge pain.
This patch allows me to specify what TERM should be for each host in
my .ssh/config. This allows me to override TERM differently on each
host depending on their level of support for my TERM variable (either
rxvt-unicode, rxvt, or xterm).
There are a number of posts referencing this lack of feature on the
Internet along with some workarounds, but I think this is cleaner.
---
readconf.c | 8 +++++++-
readconf.h | 2 ++
ssh.c | 11 +++++++++--
3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/readconf.c b/readconf.c
index dc884c9..db85a25 100644
--- a/readconf.c
+++ b/readconf.c
@@ -129,7 +129,7 @@ typedef enum {
oPasswordAuthentication, oRSAAuthentication,
oChallengeResponseAuthentication, oXAuthLocation,
oIdentityFile, oHostName, oPort, oCipher, oRemoteForward, oLocalForward,
- oUser, oEscapeChar, oRhostsRSAAuthentication, oProxyCommand,
+ oUser, oEscapeChar, oRhostsRSAAuthentication, oProxyCommand, oTerm,
oGlobalKnownHostsFile, oUserKnownHostsFile, oConnectionAttempts,
oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,
oCompressionLevel, oTCPKeepAlive, oNumberOfPasswordPrompts,
@@ -196,6 +196,7 @@ static struct {
{ "hostname", oHostName },
{ "hostkeyalias", oHostKeyAlias },
{ "proxycommand", oProxyCommand },
+ { "term", oTerm },
{ "port", oPort },
{ "cipher", oCipher },
{ "ciphers", oCiphers },
@@ -994,6 +995,10 @@ parse_command:
*charptr = xstrdup(s + len);
return 0;
+ case oTerm:
+ charptr = &options->term;
+ goto parse_string;
+
case oPort:
intptr = &options->port;
parse_int:
@@ -1568,6 +1573,7 @@ initialize_options(Options * options)
options->canonicalize_max_dots = -1;
options->canonicalize_fallback_local = -1;
options->canonicalize_hostname = -1;
+ options->term = NULL;
}
/*
diff --git a/readconf.h b/readconf.h
index 75e3f8f..883bfed 100644
--- a/readconf.h
+++ b/readconf.h
@@ -104,6 +104,8 @@ typedef struct {
int identity_file_userprovided[SSH_MAX_IDENTITY_FILES];
Key *identity_keys[SSH_MAX_IDENTITY_FILES];
+ char *term; /* TERM to send to the server, or NULL if getenv("TERM") is used */
+
/* Local TCP/IP forward requests. */
int num_local_forwards;
Forward *local_forwards;
diff --git a/ssh.c b/ssh.c
index 1e6cb90..c19ed46 100644
--- a/ssh.c
+++ b/ssh.c
@@ -1439,7 +1439,10 @@ ssh_session(void)
/* Store TERM in the packet. There is no limit on the
length of the string. */
- cp = getenv("TERM");
+ cp = options.term;
+ fprintf(stderr, "stored term: '%s'\n", cp);
+ if (!cp)
+ cp = getenv("TERM");
if (!cp)
cp = "";
packet_put_cstring(cp);
@@ -1568,6 +1571,7 @@ ssh_session2_setup(int id, int success, void *arg)
{
extern char **environ;
const char *display;
+ char *term;
int interactive = tty_flag;
if (!success)
@@ -1601,7 +1605,10 @@ ssh_session2_setup(int id, int success, void *arg)
packet_set_interactive(interactive,
options.ip_qos_interactive, options.ip_qos_bulk);
- client_session2_setup(id, tty_flag, subsystem_flag, getenv("TERM"),
+ term = options.term;
+ if (!term)
+ term = getenv("TERM");
+ client_session2_setup(id, tty_flag, subsystem_flag, term,
NULL, fileno(stdin), &command, environ);
}
--
1.8.5.5
More information about the openssh-unix-dev
mailing list