Como uso cores no MOTD?

17

Editei o padrão/etc/update-motd.d/00-header , adicionando um pouco de cor para facilitar a leitura:

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

Posso executar essa linha de código muito bem em um terminal, mas quando edito 00-headercom essas informações, obtenho os códigos de escape impressos em texto simples:

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

Como posso adicionar um toque de cor à mensagem do dia?

IQAndreas
fonte
Como você editou o arquivo, especialmente os caracteres não imprimíveis?
Volker Siegel
Em picoI substituiu a linha existente de código com a primeira linha o código que eu incluí no meu exemplo. O problema é que o analisador MOTD tratou os \ecaracteres e subsequentes como texto sem formatação em vez de caracteres especiais.
IQAndreas
Pelo fato de ver o arquivo protegido por direitos autorais do arquivo vinculado que você está no Ubuntu, eu adiciono a respectiva tag, pois é relevante para a resposta (em relação ao shell usado, veja a minha resposta).
Volker Siegel

Respostas:

11

Supondo que você esteja no Ubuntu - que usa o traço para executar scripts do sistema:

Esse arquivo /etc/update-motd.d/00-header,, é executado por /bin/dash((não /bin/bash)), que é bastante minimalista (e rápido) -
parece não suportar o "\ e" nesse local - use "\ 033" .

É diferente quando expandir códigos de escape.

Volker Siegel
fonte
3

No Debian / Ubuntu, o motdestá configurado em /etc/pam.d/sshd:

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

o que significa que, após o login bem-sucedido, o sistema executará algo como:

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

onde /etc/motdestá a parte estática (apenas impressa, não originada).

Debian 9 / Ubuntu 16.04 :

Para gerar a parte dinâmica run-partsé usado o /etc/update-motd.ddiretório:

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

Para um código um pouco mais legível, você pode usar tput setaf {color number}. Observe que, para preservar as cores, precisamos definir TERMvariáveis.

#!/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)"

salve o arquivo como por exemplo /etc/update-motd.d/10-uname

e verifique se é executável:

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

As cores básicas são numeradas:

  • 1 - vermelho
  • 2 - Verde
  • 3 - Amarelo
  • 4 - azul
  • 5 - Magenta
  • 6 - ciano
  • 7 - Branco

O código acima gera: motd colorido bash

Dependendo do seu gosto, você pode produzir impressões mais coloridas usando lolcatou títulos de figlet. A saída gerada usa a sintaxe padrão do 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

A parte dinâmica é atualizada usando /etc/init.d/motd starto seguinte:

uname -snrvm > /var/run/motd.dynamic
Tombart
fonte