防止 SSH 客户端将 TERM 环境变量传递给服务器?

Liu*_* 刘研 25 ssh terminal environment-variables gnome-terminal

我目前正在使用Fedora 18 gnome-terminal,然后tmux在其中启动了多路复用器。通过命令连接到CentOS 5 服务器后ssh,我发现:

  • ls 结果没有颜色
  • tmux, screen, hexedit,htop都无法启动,错误消息如下:
    打开终端失败:缺少或不合适的终端:screen-256color

似乎ssh将 $TERM 环境变量传递给服务器,但我在/etc/ssh/ssh_configFedora 18 的文件中找不到它。

虽然我可以手动更改服务器上的 $TERM 变量,但每次连接时,它都会再次发生。那么如何预防呢?

Sté*_*las 22

$TERM 是告诉应用程序他们正在与哪个终端交谈,以便他们知道如何与之交谈。

将其更改为远程主机支持的值,并尽可能匹配您的终端 ( screen)。

大多数 Linux 系统至少应该有一个screenterminfo 条目。如果不是这样,screen实现的一个超集vt100,并vt100具有普遍性。所以:

TERM=screen ssh host
Run Code Online (Sandbox Code Playgroud)

或者

TERM=vt100 ssh host
Run Code Online (Sandbox Code Playgroud)

如果您确实需要 256 色支持,您可以尝试xterm-256color哪个应该足够接近(screen支持 256 色的方式相同xterm)并告诉应用程序您的终端应用程序支持 256 色并告诉他们如何使用它们。

或者您可以在远程主机上安装 terminfo 条目。

infocmp -x | ssh -t root@remote-host '
  cat > "$TERM.info" && tic -x "$TERM.info"'
Run Code Online (Sandbox Code Playgroud)

  • `infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'` 可以缩写为`infocmp | ssh root@remote-host "tic -"`。这是有效的,因为当你有一个管道时,它可以作为一个文件使用 - 幸运的是管道可以跨 SSH 工作。 (3认同)
  • 很高兴知道 `infocmp` 和 `tic`,一旦编译,就不需要再次临时更改 `$TERM`。顺便说一句,我刚刚从 Fedora 18 复制(rsync)`/usr/share/terminfo/s/screen-256color` 到 CentOS,它似乎工作正常(`rsync -tv /usr/share/terminfo/s/screen- 256color root@the_host:/usr/share/terminfo/s`)。 (2认同)

zaT*_*cky 15

就我而言,我只是在本地桌面上为我的.zshrc.bashrc如果使用 bash)添加了一个别名:

alias ssh='TERM=xterm ssh'
Run Code Online (Sandbox Code Playgroud)

如果您已经使用了别名,请调整它以包括环境分配。

  • 最终成为我的赢家 - 我正在使用 kitty 终端,并且我通过 SSH 连接到的机器都没有任何支持,因此将 TERM 值设置回公共基值可能是几乎所有情况下的最佳选择 (2认同)

Gar*_*aro 6

更改$TERM可能有效,但我不建议这样做,这只是一种解决方法而不是解决方案。

当我在我的系统上遇到这个问题时,我通过为远程系统安装对最常见终端类型的支持来修复它:

  • yum install ncurses-base对于screen-256color在CentOS
  • yum install ncurses-term对于screen-256color-bce在CentOS
  • apt install ncurses-base两个screen-256colorscreen-256color-bce在Debian,Ubuntu和薄荷

与 ncurses 相关的软件包还为许多其他终端提供支持,并且它们也可用于所有其他大型发行版。(但对于我的用例和您的问题,这应该是足够的信息)