Debian Προσθήκη χρώματος στο MOTD (Message of the Day) σε είσοδο με SSH μέσω κονσόλας

Έχω ένα θεματάκι και θα ήθελα βοήθεια. Είναι κυρίως θέμα αισθητικής αλλά και πρακτικότητας.
Σε Debian Server συνδεόμαστε μέσω SSH. Το μήνυμα που μας καλωσορίζει είναι το λεγόμενο MOTD (message of the day). Εξ αρχής ήθελα να το τροποποιήσω στα μέτρα μου. Έχω διαβάσει την επίσημη τεκμηρίωση και κατάφερα να το φέρω στα μέτρα μου. Έχω φτιάξει ένα σκριπτάκι το οποίο τρέχει σε κάθε είσοδο με SSH και τρέχει τις εντολές - προγράμματα neofetch, inxi & dfc, όπως βλέπετε στην παρακάτω εικόνα:

Παρεμπιπτόντως, για όποιον ενδιαφέρεται, τα scripts αυτά τοποθετούνται στο φάκελο /etc/update-motd.d/.
Το θέμα μου είναι ότι το αποτέλεσμα των εντολών inxi & dfc το τυπώνει ασπρόμαυρα, ενώ έχω ενεργοποιήσει την υποστήριξη χρωμάτων στο terminal για τον χρήστη root. Δηλαδή αν αμέσως μετά τρέξω ως χρήστης root τις ίδιες εντολές, αφού πρώτα γίνω root με “sudo -i”, μου δίνει κανονικά χρώμα στην κονσόλα, όπως βλέπετε στην παρακάτω εικόνα:

Από όσο έχω καταλάβει, τα script του motd το σύστημα τα τρέχει ως root. Αυτό φαίνεται ξεκάθαρα από το αποτέλεσμα του neofetch, το οποίο εμφανίζει ως χρήστη που το έτρεξε τον root, όπως φαίνεται στην παραπάνω πρώτη εικόνα. Όμως όπως είπα έχω ενεργοποιήσει το χρώμα στην κονσόλα του root και συγκεκριμένα έχω προσθέσει στο .bashrc του root τα παρακάτω, τα οποία πήρα από τον root της xubuntu εγκατάστασης και τροποποίησα ως προς το prompt:

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
	# We have color support; assume it's compliant with Ecma-48
	# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
	# a case would tend to support setf rather than setaf.)
	color_prompt=yes
    else
	color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[1;38;5;169m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    alias dir='dir --color=auto'
    alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

Μπορεί κάποιος να βοηθήσει, ώστε να έχουμε χρώμα στα αποτελέσματα του motd, όπως όταν οι εντολές inxi & dfc εκτελούνται κανονικά από τον root;

Ευχαριστώ πολύ!

Βασικά δεν το βλέπουμε :grin:

Μην χρησιμοποιείτε εξωτερικά μέρη για φωτογραφίες. Κάντε drag/drop μια φωτογραφία στον editor, ή απλά copy/paste από προγράμματα τύπου gimp.

Κι όμως φαίνονται κανονικά! Ορίστε ένα screenshot από άλλο PC, στο οποίο δεν έχω κάνει login στο LinuxUser. Την εικόνα την ανεβάζω με τον τρόπο που λες, δηλαδή με drag&drop

Τώρα τι να κάνω, να τις σβήσω και να τις ξαναανεβάσω;

Εγώ βλέπω κανονικά και τις δύο εικόνες. Τα URLs είναι https://i.ibb.co/h8VnLy0/Screenshot-2021-06-08-18-35-16.png και https://i.ibb.co/q7QcsJm/Screenshot-2021-06-08-18-37-29.png.

@Mintux Να ξεκαθαρίσουμε μερικά λαθάκια. Αρχικά, το sudo -i δε σε κάνει root αλλά τρέχει το login shell ως ο χρήστης σου (γι’ αυτό και ζητάει το password του χρήστη). Στην περίπτωση του SSH, το login shell είναι και interactive.

Για τα χρώματα τώρα, κύριο ρόλο παίζουν δύο πράγματα: το περιβάλλον στο οποίο εκτελείται το script και το shell. Αν, για παράδειγμα, το Ubuntu τρέχει τα motd scripts μέσω του dash, μπορεί ο τρόπος με τον οποίο δηλώνονται τα χρώματα στο inxi να μην κάνει απολύτως τίποτα. Ενδεχομένως να έχει σημασία και το αν το shell είναι interactive ή όχι.

EDIT: Σύμφωνα με το manual του inxi, αν το τρέχεις σε motd η εντολή πρέπει να γίνει inxi --tty, όπου το --tty πρέπει απαραίτητα να προηγείται οποιωνδήποτε άλλων παραμέτρων.

Μάλλον είναι σε κάποιο addlist και δεν το βλέπω. Σε κάθε περίπτωση πάντως καλό είναι να μην έχουμε εικόνες σε εξωτερικά μέρη που δεν ξέρουμε αύριο αν θα υπάρχουν. Το discourse σε κάποιες περιπτώσεις κρατάει εσωτερικά αντίγραφα, αλλά όχι πάντα. Αν δεν μπορείς να κάνεις edit το κάνω wiki να το φτιάξει όποιος θέλει.

[ Μας ζορίζει αυτό και μας βλέπω να περνάμε σε κάποιο S3 ή μεγαλύτερο hosting, αλλά το κρατάμε ακόμα, απο μήνα σε μήνα το πάμε…]

Ευχαριστώ για την απάντηση!
Για το πρώτο, με το “sudo -i”, ναι το ξέρω, το είπα απλά στην περιγραφή για να μην περιπλέκουμε τα πράγματα. Στο debian αν δεν βάλεις κωδικό root στην εγκατάσταση, αυτός απενεργοποιείται πλήρως και ο μόνος τρόπος να “γίνεις” root είναι με αυτή την εντολή. Ταυτόχρονα ο χρήστης σου αποκτά τη δυνατότητα sudo. Αν πάλι κατά την εγκατάσταση δώσεις κωδικό στον root, τότε ο χρήστης σου δεν έχει το sudo, δεν εγκαθίσταται καν το πακέτο sudo.

Τώρα για το κύριο θέμα μας, ομολογώ δεν πολυκατάλαβα τι γράφεις. Δεν έχω πρόβλημα να ψάξω βαθύτερα στο debian, αρκεί κάποιος να με κατευθύνει που θα ψάξω. Τι είναι το dash; Μιλάμε για Debian, όχι για Ubuntu, και μιλάμε για Server, δεν υπάρχει γραφικό περιβάλλον.
Τις συνθήκες εκτέλεσης τις περιέγραψα, τρέχει τα scripts ως root την ώρα του login με ssh.

Το θέμα των εικόνων το έφτιαξα, τις ανέβασα κατευθείαν στο site μας.

Το δοκίμασα, δεν λειτούργησε. Σύμφωνα με το manual που διαβάζω εγώ, λέει:

--tty

Forces internal IRC flag to off. Used in unhandled cases where the program running inxi may not be seen as a shell/tty, but it is not an IRC client. Put **--tty** first in option list to avoid unexpected errors. If you want a specific output width, use the **--width** option. If you want normal color codes in the output, use the **-c [color ID]** flag.

The sign you need to use this is extra numbers before the key/value pairs of the output of your program. These are IRC, not TTY, color codes. Please post a github issue if you find you need to use **--tty** (including the full **-Ixxx** line) so we can figure out how to add your program to the list of whitelisted programs.

You can see what inxi believed started it in the **-Ixxx** line, **Shell:** or **Client:** item. Please let us know what that result was so we can add it to the parent start program whitelist.

το οποίο ομολογώ δυσκολεύομαι να κατανοήσω.

Επίσης είναι πιο γενικό το ζήτημα, διότι ούτε το dfc δίνει τα χρώματά του στο motd, όπως είπα από την αρχή.

Γενικότερα, μην απλοποιείς αυτά που γράφεις σε μια ερώτηση γιατί το κείμενο που θα διαβάσουν οι άλλοι δίνει μια πρώτη εικόνα για το επίπεδο των γνώσεων εκείνου που ρωτάει ώστε να μπορεί να δοθεί απάντηση με κατάλληλο τρόπο.

Το dash είναι ένα shell, όπως το bash (αλλά όχι με ακριβώς τις ίδιες δυνατότητες) και ήταν (είναι ακόμα;) το προεπιλεγμένο shell του συστήματος στο Debian. Ο πιο απλός τρόπος για να δεις ποιο shell έχεις στο SSH είναι να τρέξεις την εντολή echo "$SHELL" όταν θα έχεις συνδεθεί. Αντίστοιχα, με την εντολή echo $USER βλέπεις ποιος χρήστης τρέχει και αν όντως είναι ο root.

--tty

Forces irc flag to false. Generally useful if inxi is running inside of another tool like
Chef or MOTD and returns corrupted color codes. Please see man page or file an issue if you
need to use this flag. Must use -y [width] option if you want a specific output width.
Always put this option first in an option list.

(και το --help σε μια εντολή είναι manual).

Ναι, το ζήτημα είναι ότι τα motd scripts σου δεν τρέχουν στο ίδιο περιβάλλον που έχεις εκτός SSH. Το γιατί μπορεί να έχει διάφορες απαντήσεις. Θα βοηθούσε να δούμε τα σχετικά scripts που έχεις στο /etc/update-motd.d, μήπως τυχόν υπάρχει κάποιο λάθος εκεί.

Αναμενόμενο ήταν, γιατί ο χρήστης δεν πρόκειται να βελτιστοποιήσει μια εικόνα πριν την ανεβάσει. Κατά τη γνώμη μου, η ενδεδειγμένη λύση είναι κάπου στη μέση. Μπορείτε να επιλέξετε κάποιες αξιόπιστες υπηρεσίες για εξωτερικά uploads και ταυτόχρονα να υπάρχει και η δυνατότητα εσωτερικού upload. Άλλωστε, δεν είναι όλες οι εικόνες παντού τόσο σημαντικές ώστε να διατηρηθούν μετά από 3-5-10 χρόνια. Γιατί να πιάνουν χώρο εσαεί;

Μπορείς να μην χρησιμοποιήσεις την υποδομή που παρέχει το ubuntu και να το πας απλά. Ουσιαστικά είναι ένα αρχείο το '/etc/issue'. Όταν έχεις ένα logιn shell το τυπώνει στο τερματικό. Τώρα το πρόβλημα με το χρώμα είναι αν το τερματικό το υποστηρίζει και αυτό στο δίνει η μεταβλητή $TERM. Αν το τερματικό το υποστηρίζει για να έχεις χρώμα μέσα στο κείμενο υπάρχουν κάποια κινέζικά όπως το ‘\033[1;38;5;169m’. Τι είναι το logιn shell; Είναι αυτό που ξεκινάει μια συνεδρία χρήστη και χρησιμοποιεί επιπλέον αρχεία εκκίνησης.

Μπορείς απλά να φτιάξεις ένα αρχείο με αυτά τα κινέζικα. Ένας απλός τρόπος είναι απλά ένα

TERM=xterm-256color neofetch > /etc/issue

Με τον τρόπο αυτό θα έχεις ταχύτητα, μιας και η πληροφορία θα είναι στατική. Τώρα έστω ότι έχεις ένα systemd unit (που καλεί ενα script) που φτιάχνει αυτό το αρχείο. Μπορείς να το ενημερώνεις με ένα timer ή να το βάζεις να τρέχει πριν ξεκινήσει ένα tty (αυτό το κάνει το πρόγραμμα agetty).

# /etc/systemd/system/getty@ttyX.service.d/override.conf

[Service]
Type=
Type=oneshot
ExecStart=
ExecStart=-/usr/bin/agetty --noclear %I $TERM
ExecStart=-/path/to/yourscript.sh

Κάπως έτσι θα το έκανα και θα απενεργοποιούσα την υπηρεσία που κάνει το ίδιο στο ubuntu, αν δεν έβγαζα άκρη με το motd του Ubuntu. (Παλιά το είχα σκαλίσει κάπως, αλλά δεν το έχω τώρα κάπου εγκατεστημένο να σου πω το πως).

Ελπίζω να βοήθησα και να μην μπέρδεψα.

Δες: archlinux update /etc/motd with systemd · GitHub

Επίσης μπορείς να έχεις άλλο αρχείο για τις συνδέσεις ssh: Protect SSH Logins with SSH & MOTD Banner Messages

Ευχαριστώ για τις πληροφορίες.
Νεότερα στοιχεία: Η έλλειψη χρωμάτων ισχύει και με απευθείας log in στον Server, δηλαδή όχι μέσω SSH.
Επισυνάπτω δύο εικόνες, για να δεις και κέλυφος και χρήστη:
Στην πρώτη βλέπουμε ότι το neofetch τρέχει ως root, άρα τα scripts στο /etc/update-motd.d/ τα τρέχει ο root. Επίσης εδώ έχω απενεργοποιήσει το inxi, ώστε να χωράει για το screenshot. To neofetch διατηρεί τα χρώματα, ενώ το dfc όχι:

Στη δεύτερη εικόνα τρέχει και το inxi, και βλέπουμε επίσης κέλυφος και χρήστη:

Σας δείχνω εικόνες από Virtual Box, διότε έχω εκεί ένα πανομοιότυπο αντίγραφο του Server μου για να κάνω πειράματα. Υπάρχει και φυσικός Server με το ίδιο λειτουργικό και ρυθμίσεις.

Το script που τρέχω στο motd είναι το εξής απλούστατο:

#!/bin/sh
printf “\n”
neofetch
printf “\n”
inxi -SDPm
printf “\n”
dfc -d -p /dev -q name
printf “\n”

@Asfodelus Σε ευχαριστώ για την απάντηση, αλλά ξαναλέω, μιλάμε για καθαρό Debian. Δεν ασχολούμαι πλέον με Ubuntu σε Server. Και δυστυχώς, πράγματι με μπέρδεψες περισσότερο. :slight_smile:
Πιστεύω ότι η λύση στο “ζήτημα” θα είναι πολύ πιο απλή. :slight_smile:

EDIT Προσθήκη:
@Asfodelus
Τους κωδικούς των χρωμάτων τους ξέρω καλά, εγώ έβαλα το συγκεκριμένο χρώμα στο prompt του root, δεν το πήρα έτοιμο.
cat /etc/issue μου δίνει

Debian GNU/Linux 11 \n \l

echo $TERM μου δίνει

xterm-256color

Λοιπόν, μετά την παραπάνω πληροφορία, πρόσεξα ότι το παραπάνω script μου τρέχει σε κέλυφος “sh” και όχι στο bash. Έψαξα λοιπόν στο google για “inxi color in sh script” και βρήκα αυτή τη σελίδα, από το github του ίδιου του δημιουργού του inxi, της οποίας το θέμα είναι ακριβώς το ζήτημά μου.
Κάπου στη μέση της σελίδας λέει ότι με την κάτωθι εντολή:

inxi --tty -c 2

έχει χρώμα στο motd. Το δοκίμασα και εγώ και δουλεύει!

Η αλήθεια είναι ότι ακόμα δεν έχω καταφέρει ακόμα να βρω περιγραφές για τα color schemes του inxi, αλλά τουλάχιστον έχουμε χρώμα!

@Soulrain Ευχαριστώ πολύ για τις υποδείξεις. :slight_smile:

Πάμε τώρα να λύσουμε και το θέμα με το dfc!

EDIT Προσθήκη:

Και πλέον, αφού ξέρω που να ψάξω και πως να κινηθώ, βλέπουμε στο manual του dfc ότι και εκεί αναφέρει ότι υπάρχει επιλογή για χρώμα όταν δεν χρησιμοποιείται σε terminal:

-c [WHEN]
Choose color mode where WHEN is one of the following sub-option:
“always”: Color will always be used, no matter what “stdout” is.
“auto”: This is default when “-c” is not activated. Color is used only if “stdout” is a ter‐
minal. For instance, color will be disabled with this option if you pipe the output of dfc(1)
into another command.
“never”: Color will never be used.

Άρα προσθέτουμε την επιλογή

-c always

στο dfc που τρέχει το script και έχουμε το επιθυμητό αποτέλεσμα!!

Ευχαριστώ πολύ για τη συμμετοχή και τις υποδείξεις σας!
:smiley: :smiley:

Αυτό το νήμα έκλεισε αυτόματα 2 ημέρες μετά την τελευταία απάντηση. Δεν επιτρέπονται πλέον νέες απαντήσεις.