Por que o SSH mata a cor no meu script /etc/update-motd.d/ quando force_color_prompt = yes é definido em ~ / .bashrc?

2

Eu tenho um script MOTD instalado em /etc/update-motd.d que funciona corretamente, no entanto, parece que o SSH elimina a cor.

Look SSHD:

Saídaaoexecutaroscriptdepoisdeefetuarlogin:

Scriptreal:

cat/etc/update-motd.d/20-logo#!/usr/bin/envbashecho"";
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 "================================================================================";

Eu assegurei que force_color_prompt=yes esteja habilitado em ~/.bashrc e que minha variável $TERM pareça correta em ambos os lados. O emulador de terminal e o servidor mostram xterm-256color

O que poderia estar causando a falha da cor no login do SSH?

    
por Routhinator 20.12.2017 / 05:42

1 resposta

4

O MOTD dinâmico é gerado pelo módulo pam_motd (/etc/pam.d/login), que usa um código como esse para fazer isso:

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");

Como env é invocado com -i

-i, --ignore-environment inicia com um ambiente vazio

nenhuma variável TERM está disponível no momento em que tput é executado, portanto, nenhum código de cores é incluído na saída:

%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
...

Como solução alternativa, você pode pré-gerar seu logotipo com os códigos de escape incorporados nele, assim:

%/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

ou apenas defina uma variável TERM explícita no topo do seu script:

 export TERM=xterm-256color

Ambas as opções não são perfeitas (como o tipo TERM será definido como fixo no momento em que o MOTD é gerado), mas o AFAIK é o melhor que você pode fazer (a menos que você queira corrigir o pam_motd ).

    
por 15.01.2018 / 12:12

Tags