这个问题的目的是记录我经过两个小时的奋斗后的发现和解决方案,希望它对其他人将来有用。
情况
我已经设置了一台新的 Linux 机器。当本地登录时,ls --color=auto
正确显示颜色的目录条目。但是,当通过 SSH 远程登录时,ls --color=auto
似乎不起作用。
为什么会这样呢?如何ls
通过 SSH 获取颜色?
其他症状
的输出dircolors
反映了 的行为ls --color=auto
。在本地运行时,dircolors
设置一个内容丰富的LS_COLORS
环境变量。但是,当通过 SSH 运行时,请dircolors
进行设置LS_COLORS=''
。
总长DR
如果您遇到了上述症状,您可能正在使用相对较新和/或晦涩的终端模拟器(我使用的是 Alacritty)。颜色默认有效,因为您的终端模拟器设置了
COLORTERM
环境变量,该变量由ls
. 但是,默认情况下,此变量不会通过 SSH 传播,这会导致“彩色仅在本地有效”的症状ls
。完整解释
和
dircolors
(ls
当LS_COLORS
未设置时)在处理TERM
和时表现相似COLORTERM
,因此我将仅ls
在本说明中进行说明。ls
这是截至撰写本文时的源代码(永久链接):正如你所看到的,当不为空时
ls
,总是会对其输出进行着色。COLORTERM
只有当它为空或不存在时,才会检查TERM
其值是否在已知支持颜色的终端中。因此,只要您的终端模拟器设置了COLORTERM
变量(例如 Alacritty 的情况),即使您不知道,ls
也会默认着色。TERM
ls
问题是,SSH 默认情况下仅将一个变量传播到服务器 -
TERM
。对于较旧的和/或常见的终端,这是可以的,因为它们众所周知ls
,但这会破坏 Alacritty 等终端的着色。解决方案#1
将您的终端添加到已知终端列表中。
dircolors
然后将LS_COLORS
根据您的配置进行设置,该配置将由ls
.这可能更容易或更难,具体取决于您使用的发行版:
/etc/profile.d/colorls.sh
加载/etc/DIR_COLORS
. 因此,您可以简单地将TERM alacritty
(或任何您的TERM
内容)添加到该文件中。~/.bashrc
(由 定义/etc/skel/.bashrc
)包含要加载的脚本~/.dircolors
(如果存在)。所以你可以运行dircolors --print-database > ~/.dircolors
然后添加上述行。~/.bashrc
(或你喜欢的任何外壳)中。以下是 Debian 提供的参考:解决方案#2
使 SSH 传播
COLORTERM
。在您尝试访问的计算机(服务器)上,运行:
在您从(客户端)连接的计算机上,运行:
如果您使用多个不同的终端模拟器,这可能会更好。另一方面,它确实需要配置 SSH 服务器和客户端。所以我想选择你的毒药。