~/.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独自のパッチを望まない限り)。

おすすめ記事