~/.bashrc에 force_color_prompt=yes가 설정된 경우 SSH가 /etc/update-motd.d/ 스크립트의 색상을 종료하는 이유는 무엇입니까?

~/.bashrc에 force_color_prompt=yes가 설정된 경우 SSH가 /etc/update-motd.d/ 스크립트의 색상을 종료하는 이유는 무엇입니까?

/etc/update-motd.d에 MOTD 스크립트를 설치했는데 제대로 작동하지만 SSH에서 색상이 누락된 것 같습니다.

SSD 외관:

여기에 이미지 설명을 입력하세요.

로그인 후 스크립트를 실행할 때의 출력:

여기에 이미지 설명을 입력하세요.

실제 스크립트:

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

pam_motd동적 MOTD는 이를 수행하기 위해 다음 코드를 사용하는 모듈(/etc/pam.d/login)에 의해 생성됩니다 .

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

두 옵션 모두 완벽하지는 않지만(MOTD가 생성될 때 TERM 유형이 고정으로 설정되기 때문에), 내가 아는 한 이 방법이 최선입니다( pam_motd자체 패치를 원하지 않는 한).

관련 정보