Jak używać kolorów w MOTD?

17

Zredagowałem domyślną/etc/update-motd.d/00-header , dodając trochę koloru, aby ułatwić czytanie:

printf "Welcome to \e[1;34m%s\e[0m \e[2m(%s %s %s)\e[0m\n" "$DISTRIB_DESCRIPTION" "$(uname -o)" "$(uname -r)" "$(uname -m)"

Mogę dobrze uruchomić ten wiersz kodu w terminalu, ale kiedy edytuję 00-headerz tymi informacjami, otrzymuję kody ucieczki wydrukowane w postaci zwykłego tekstu:

Welcome to \e[1;36mUbuntu 13.10\e[0m \e[2m(GNU/Linux 3.11.0-23-generic i686)\e[0m

Jak mogę dodać odrobinę koloru do wiadomości dnia?

IQAndreas
źródło
Jak edytowałeś plik, zwłaszcza znaki niedrukowalne?
Volker Siegel,
W picozastąpiłem istniejący wiersz kodu pierwszym wierszem kodu, który zawarłem w moim przykładzie. Problem polega na tym, że parser MOTD traktował następnie \ei kolejne znaki jako zwykły tekst zamiast jako znaki specjalne.
IQAndreas
Widzę z heleaderki praw autorskich połączonego pliku, że rzeczywiście jesteś na Ubuntu, więc dodam odpowiedni znacznik, ponieważ jest on odpowiedni do odpowiedzi (odnośnie używanej powłoki, zobacz moją odpowiedź).
Volker Siegel,

Odpowiedzi:

11

Zakładając, że korzystasz z systemu Ubuntu - który używa myślnika do uruchamiania skryptów systemowych:

Plik ten /etc/update-motd.d/00-headerjest wykonywany przez /bin/dash(nie /bin/bash), co jest dość minimalistyczne (i szybkie) -
wydaje się, że nie obsługuje „\ e” w tym miejscu - zamiast tego należy użyć „\ 033” .

Różni się to, kiedy należy rozwinąć kody ucieczki.

Volker Siegel
źródło
4

W systemie Debian / Ubuntu motdkonfiguracja odbywa się w /etc/pam.d/sshd:

session    optional     pam_motd.so  motd=/run/motd.dynamic
session    optional     pam_motd.so noupdate

co oznacza, że ​​po udanym zalogowaniu system będzie działał jak:

cat /run/motd.dynamic
if [[ -f /etc/motd ]]; then cat /etc/motd; fi

gdzie /etc/motdjest część statyczna (tylko drukowana, nie pochodzi).

Debian 9 / Ubuntu 16.04 :

Do wygenerowania części dynamicznej run-partssłuży /etc/update-motd.dkatalog:

/usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d

Aby uzyskać nieco bardziej czytelny kod, możesz użyć tput setaf {color number}. Pamiętaj, że aby zachować kolory, musimy ustawić TERMzmienną.

#!/bin/sh
export TERM=xterm-256color

read one five fifteen rest < /proc/loadavg
echo "$(tput setaf 2)
Kernel: `uname -v | awk -v OFS=' ' '{print $4, $5}'`
$(tput setaf 4)Load Averages......: ${one}, ${five}, ${fifteen} (1, 5, 15 min)
$(tput setaf 5)
 ______________
< Hello World! >
 --------------
        \\   ^__^
         \\  (oo)\\_______
            (__)\\       )\\\/\\
                ||----w |
                ||     ||

$(tput sgr0)"

zapisz plik jako np /etc/update-motd.d/10-uname

i upewnij się, że jest wykonywalny:

chmod +x /etc/update-motd.d/10-uname

Podstawowe kolory są ponumerowane:

  • 1 - czerwony
  • 2 - zielony
  • 3 - żółty
  • 4 - niebieski
  • 5 - magenta
  • 6 - cyjan
  • 7 - biały

Powyższy kod generuje: bash kolorowy motd

W zależności od upodobań możesz uzyskać bardziej kolorowe wydruki za pomocą lolcatlub nagłówków figlet. Wygenerowane dane wyjściowe używają standardowej składni bash:

^[(B^[[m
^[[32m
Kernel: 4.9.65-3+deb9u2 (2018-01-04)
^[[34mLoad Averages......: 0.04, 0.05, 0.05 (1, 5, 15 min)
^[[35m
 ______________
< Hello World! >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

^[(B^[[m

Debian 8 / Ubuntu 14.04

Część dynamiczna jest aktualizowana za pomocą /etc/init.d/motd starttego, który wykonuje następujące czynności:

uname -snrvm > /var/run/motd.dynamic
Tombart
źródło