[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