Answers:
$TERM
告诉应用程序正在与哪个终端通信,以便他们知道如何与之通信。
将其更改为远程主机支持的值,并且该值应与您的终端(screen
)尽可能匹配。
大多数Linux系统至少应具有screen
terminfo条目。如果不是这样,screen
实现的一个超集vt100
,并vt100
具有普遍性。所以:
TERM=screen ssh host
要么
TERM=vt100 ssh host
如果确实需要256色支持,则可以尝试将xterm-256color
其设置得足够接近(screen
以相同的方式支持256色xterm
),并告诉应用程序您的终端应用程序支持256色并告诉他们如何使用它们。
或者,您可以在远程主机上安装terminfo条目。
infocmp -x | ssh -t root@remote-host '
cat > "$TERM.info" && tic -x "$TERM.info"'
tmux
在Fedora 18的gnome终端中运行,tmux
将$TERM
值screen-256color
从更改为xterm-256color
。
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'
可以缩短为infocmp | ssh root@remote-host "tic -"
。之所以可行,是因为当您拥有管道时,可以使用-将其作为文件进行访问,幸运的是,管道可以跨SSH运行。
tic
(terminfo编译器)生成文件的二进制格式在一个系统与下一个系统之间是相同的,或者它们的位置是相同的。tic
也可以确保权限正确或在需要的地方创建中间目录。
我将其.bashrc
放在远程主机上:
# 256-color mode not supported on this host
if echo $TERM | grep -q -- '-256color'; then
echo -e '\n\n256-color mode not supported on this host. Reverting TERM...\n'
export TERM=`echo -n $TERM | sed 's/-256color//'`
fi
这样,两者xterm-256color
和都会screen-265color
得到正确处理。另外,我输出了注释,以便以后更新服务器并支持256色时,我不会因为想知道为什么SSH时为什么我的TERM变量被更改而撞墙。
export TERM=${TERM%%-256color}
更改$TERM
可能会起作用,但是我不建议这样做,这只是解决方法,而不是解决方案。
当我在系统上遇到此问题时,可以通过为远程系统安装最常见的终端类型的支持来解决此问题:
yum install ncurses-base
对于screen-256color
在CentOSyum install ncurses-term
对于screen-256color-bce
在CentOSapt install ncurses-base
两个screen-256color
和screen-256color-bce
在Debian,Ubuntu和薄荷与ncurses相关的软件包还为许多其他终端提供支持,并且在所有其他大型发行版中也可用。(但是对于我的用例和您的问题,这应该是足够的信息)
参见man ssh_config:
SendEnv
Specifies what variables from the local environ(7) should be sent
to the server. Note that environment passing is only supported
for protocol 2. The server must also support it, and the server
must be configured to accept these environment variables. Refer
to AcceptEnv in sshd_config(5) for how to configure the server.
Variables are specified by name, which may contain wildcard char‐
acters. Multiple environment variables may be separated by
whitespace or spread across multiple SendEnv directives. The
default is not to send any environment variables.
和人sshd_config:
AcceptEnv
Specifies what environment variables sent by the client will be
copied into the session's environ(7). See SendEnv in
ssh_config(5) for how to configure the client. Note that envi-
ronment passing is only supported for protocol 2. Variables are
specified by name, which may contain the wildcard characters `*'
and `?'. Multiple environment variables may be separated by
whitespace or spread across multiple AcceptEnv directives. Be
warned that some environment variables could be used to bypass
restricted user environments. For this reason, care should be
taken in the use of this directive. The default is not to accept
any environment variables.
据此,默认值应该是不发送任何变量,但是TERM似乎很特殊。无论如何都发送。
因此,您既可以在调用ssh时更改TERM(如TERM=xterm ssh ...
),也可以在登录后进行更改(如中的.bash_profile
),也可以在服务器端定义未知的TERM类型(假定在那里具有root用户访问权限)。有关详细信息,请参见其他答案。
$TERM
实际上不会比将其设置为不受支持的值更好。
$TERM
暂时更改可能是一种解决方法,但我每次都需要这样做。顺便说一下,似乎两者的CentOS 5和Fedora 18接受信封所有的语言环境变量(LANG
,LC_*
,...)
infocmp
并且tic
,一旦编译,就无需$TERM
再次进行临时更改。顺便说一句,我刚刚/usr/share/terminfo/s/screen-256color
从Fedora 18 复制(rsync)到CentOS,看来工作正常(rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s
)。