我在 /etc/update-motd.d 中安装了一个 MOTD 脚本,该脚本可以正常工作,但是 SSH 似乎会漏掉颜色。
固态硬盘外观:
登录后运行脚本时的输出:
实际脚本:
cat /etc/update-motd.d/20-logo
#! /usr/bin/env bash
echo "";
echo "$(tput setaf 2) .::::::::::::::::::::::::::::::::::::::::...
:::::::::::::::::::::::::::::::::::::::::::::::::::.
.::::::::::::::::::::::::::::::::::::::::::::::::::::::.
.....::::::::::::::::::
$(tput setaf 7):@@@@@O $(tput setaf 2).:::::::::::
$(tput setaf 7)@@@@@@@o $(tput setaf 2).::::::::
$(tput setaf 7)@@@@@@@o $(tput setaf 2):::::::
$(tput setaf 7)@@@@@@@o $(tput setaf 2).::::::
$(tput setaf 7):@@@@@O @@@@@@@o O@@@@O $(tput setaf 2):::::::
$(tput setaf 7):@@@@@@@@o @@@@@@@o o@@@@@@@O $(tput setaf 2):::::::.
$(tput setaf 7)o@@@@@@@@O @@@@@@@o :@@@@@@@@@ $(tput setaf 2).::::::::.
$(tput setaf 7)o@@@@@@@O @@@@@@@o o@@@@@@@O $(tput setaf 2)..:::::::::::::
$(tput setaf 7)@@@@@@@O @@@@@@@o :@@@@@@@o $(tput setaf 2)::::::::::::::::::
$(tput setaf 7)o@@@@@@@ @@@@@@@: o@@@@@@@ $(tput setaf 2)::::::::::::::::.
$(tput setaf 7)o@@@@@@o o@@@O: @@@@@@@ $(tput setaf 2).:::::::::..
$(tput setaf 7)o@@@@@@@ o@@@@@@@ $(tput setaf 2).:::::::::
$(tput setaf 7)o@@@@@@@ O@@@@@@O $(tput setaf 2).:::::::::.
$(tput setaf 7)@@@@@@@@ O@@@@@@@: $(tput setaf 2).::::::::::.
$(tput setaf 7)@@@@@@@@O :@@@@@@@@o $(tput setaf 2).:::::::::::.
$(tput setaf 7)@@@@@@@@@O: o@@@@@@@@@o $(tput setaf 2)::::::::::::::.
$(tput setaf 7)O@@@@@@@@@@@@@@@@@@@@@@@@@@@@: $(tput setaf 2).:::::::::::::::..
$(tput setaf 7)O@@@@@@@@@@@@@@@@@@@@@@@@: $(tput setaf 2).:::::::::::::::.
$(tput setaf 7):@@@@@@@@@@@@@@@@@@@O $(tput setaf 2).::::::::::::
$(tput setaf 7)oO@@@@@@@@@@o: $(tput setaf 2)..::::.$(tput sgr0)
";
echo "================================================================================";
我已确保force_color_prompt=yes
启用该功能~/.bashrc
并且我的$TERM
变量在两侧看起来都是正确的。终端模拟器和服务器都显示xterm-256color
什么可能导致 SSH 登录时颜色失败?
答案1
动态 MOTD 由模块 (/etc/pam.d/login) 生成pam_motd
,该模块使用如下代码来完成此操作:
if (!system("/usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new"))
rename("/run/motd.dynamic.new", "/run/motd.dynamic");
正如env
调用的那样-i
-i, --ignore-environment 以空环境开始
运行时没有可用的 TERM 变量tput
,因此输出中不包含颜色代码:
%env -i /etc/update-motd.d/20-logoenv -i /etc/update-motd.d/20-logo
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
...
作为解决方法,您可以预先生成徽标并嵌入转义码,如下所示:
%/etc/update-motd.d/20-logo > /tmp/color.logo
%(echo "#! /usr/bin/env bash";
echo "cat <<EOF"; cat /tmp/color.logo;
echo "EOF") > /etc/update-motd.d/20-logo
或者只是在脚本顶部设置一个显式的 TERM 变量:
export TERM=xterm-256color
这两个选项都不完美(因为 TERM 类型将在生成 MOTD 时设置为固定),但据我所知,这是您能做的最好的事情(除非您想修补它pam_motd
本身)。