Création d’un MOTD dynamique : dynmotd


Depuis que je m’occupe de la gestion d’un parc de serveurs Linux, environ 200, j’ai mis en place certaines petites customisations maison.

Ainsi, dès que je me connecte en SSH à un serveur, un motd dynamique s’exécute et il m’est donc simple de savoir quel est le serveur sur lequel je me connecte. Qu’est ce que le motd me demanderont certains ? Simplement l’abréviation de Message Of The Day.

Mettre en place un motd dynamique est très simple.

Suivez le tutoriel ci-dessous

<Mise à jour du 29 Avril 2016>

  • Mise à jour pour dû à un bug du TERM qui bloquait les transfert en SCP
  • Mise à jour du fichier dynmotd.sh avec : optimisation des variables
  • Mise en place du dynmotd uniquement pour le compte root et le groupe admin

</Mise à jour>

Tutoriel

Installation des pré-requis

Debian / Ubuntu

sudo apt-get install lsb-release

RedHat / CentOS

sudo yum install redhat-lsb-core

On désactive l’affichage du motd du serveur ssh

sudo sed -i 's/#PrintMotd yes/PrintMotd no/g' /etc/ssh/sshd_config

On active le lancement du motd au démarrage de n’importe quelle session SSH ou locale pour l’utilisateur root et les utilisateurs du groupe “admin” (c’est spécifique à ma configuration … vous pouvez changer le nom du groupe, mettre un utilisateur … bref regardez votre fichier /etc/sudoers)

Vous pouvez faire un copier coller directement j’utilise des caractères échappatoire pour pouvoir copier les variables

sudo cat > /etc/profile.d/dynmotd.sh <<EOFDYN
#!/bin/bash
# 
# By Thomas Bourcey
# Tomzone.fr

# Corrige un problème lors de l'utilisation du scp et de WinSCP
# http://winscp.net/forum/viewtopic.php?t=1510
if [ "\$TERM" != "dumb" ]; then
        # Si un groupe Admin existe alors on active le dynmotd
        \$( which id ) | grep 'admin' > /dev/null
        RETURN=\$?
        if [ \$RETURN = 0 ]; then
                /usr/local/bin/dynmotd;
        # Si root se connecte on active le dynmotd
        elif [ \$EUID = 0 ]; then
                /usr/local/bin/dynmotd;
        # Sinon on affiche un message "standard" pour les simples utilisateurs
        else
                echo ""
                echo ""
                echo "---> Welcome \$USER on \$(hostname)"
                echo ""
                echo "###########################################################################"
                echo "#                                                                         #"
                echo "#  ALERT! You are entering into a secured area! Your IP, Login Time,      #"
                echo "#  Username has been noted and has been sent to the server administrator! #"
                echo "#  This service is restricted to authorized users only. All activities on #"
                echo "#  this system are logged.                                                #"
                echo "#                                                                         #"
                echo "#  Unauthorized access will be fully investigated and reported to the     #"
                echo "#  appropriate law enforcement agencies.                                  #"
                echo "#                                                                         #"
                echo "###########################################################################"
                echo ""
                echo ""
        fi
fi

EOFDYN

Création de notre fichier motd dynamique qu’on va rendre exécutable.

sudo touch /usr/local/bin/dynmotd
sudo chmod +x /usr/local/bin/dynmotd

Puis copier/coller le texte ci-dessous pour la création de votre dynmotd.sh

sudo cat > /usr/local/bin/dynmotd <<EOF
#!/bin/bash
#
# Author : Thomas Bourcey
# Version: 1.3
#


# Process count
PROCCOUNT=\$( ps -Afl | wc -l )
PROCCOUNT=\$( expr \$PROCCOUNT - 5 )

# Uptime
UPTIME=\$(</proc/uptime)
UPTIME=\${UPTIME%%.*}
SECONDS=\$(( UPTIME%60 ))
MINUTES=\$(( UPTIME/60%60 ))
HOURS=\$(( UPTIME/60/60%24 ))
DAYS=\$(( UPTIME/60/60/24 ))

# SYSTEM INFO
# Hostname (UPPERCASE)
HOSTNAME=\$( echo \$(hostname)  | tr '[a-z]' '[A-Z]' )
# IP Address (list all ip addresses)
IP_ADDRESS=\$(echo \$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' |  sed ':a;N;\$!ba;s/\n/ , /g') )
# System : Description of the distribution
SYSTEM=\$(echo \$(lsb_release -d | awk -F':' '{print \$2}' | sed 's/^\s*//g') )
# Kernel release
KERNEL=\$( echo \$(uname -r) )
# CPU Info
CPU_INFO=\$(echo \$(more /proc/cpuinfo | grep processor | wc -l ) "x" \$(more /proc/cpuinfo | grep 'model name' | uniq |awk -F":"  '{print \$2}') )
# Total Memory
MEMORY=\$(echo \$(free -m |grep Mem: | awk -F " " '{print \$2}') MO)
# Memory Used
MEMORY_USED=\$(echo \$(free -m |grep Mem: | awk -F " " '{print \$3}') MO)



echo -e "
\033[1;31m+++++++++++++++++: \033[0;37mSystem Data\033[1;31m :+++++++++++++++++++
+ \033[0;37mHostname \033[1;31m= \033[1;32m\$HOSTNAME
\033[1;31m+ \033[0;37mAddress \033[1;31m= \033[1;32m\$IP_ADDRESS
\033[1;31m+ \033[0;37mSystem \033[1;31m= \033[1;32m\$SYSTEM
\033[1;31m+ \033[0;37mKernel \033[1;31m= \033[1;32m\$KERNEL
\033[1;31m+ \033[0;37mUptime \033[1;31m= \033[1;32m\$DAYS days, \$HOURS hours, \$MINUTES minutes, \$SECONDS seconds
\033[1;31m+ \033[0;37mCPU Info \033[1;31m= \033[1;32m\$CPU_INFO
\033[1;31m+ \033[0;37mMemory \033[1;31m= \033[1;32m\$MEMORY
\033[1;31m+ \033[0;37mMemory Used \033[1;31m= \033[1;32m\$MEMORY_USED
\033[1;31m+++++++++++++++++: \033[0;37mUser Data\033[1;31m :+++++++++++++++++++++
+ \033[0;37mUsername \033[1;31m= \033[1;32m`whoami`
\033[1;31m+ \033[0;37mProcesses \033[1;31m= \033[1;32m\$PROCCOUNT of `ulimit -u` MAX
\033[1;31m+++++++++++++++++: \033[0;37mInformation/Role\033[1;31m :++++++++++++++
\033[1;31m+ \033[0;37mServer \033[1;31m= \033[1;32mINFORMATION MUST BE FILLED /usr/local/bin/dynmotd
\033[1;31m+ \033[0;37m       \033[1;31m  \033[1;32m- Apache Server (ex.)
\033[1;31m+ \033[0;37m       \033[1;31m  \033[1;32m- FTP Server (ex.)
\033[1;31m+ \033[0;37m       \033[1;31m  \033[1;32m- Application Server (ex.)
\033[1;31m+++++++++++++++++++++++++++++++++++++++++++++++++++\033[0m"


EOF

Personnalisation du dynmotd

Actuellement j’ai simplifié son utilisation et je l’ai découpé en 3 sections :

System Data :

  • Affichage du hostname
  • Affichage de l’adresse IP ou des adresses IP
  • Affichage de la version du système
  • Affichage de la version du kernel
  • Affichage du uptime
  • Affichage des informations sur le CPU
  • Affichage de l’utilisation de la mémoire

User Data

  • Affichage du nom de l’utilisateur
  • Affichage des 5 processus les plus gourmands

Information/Role

  • C’est la partie à faire à la main. Dedans j’y met les informations sur le serveur. Par exemple si c’est un serveur FTP, ou un serveur Apache, ou un serveur d’administration NIS … etc etc

 

Chez moi, sur l’un des serveurs, voila ce que ça rend :

putty

Modification du Serveur SFTP

En appliquant ce motd dynamique, lorsqu’on essaye de se connecter avec WinSCP on se retrouve avec un problème : impossible de se connecter.

Nous avons un erreur. Ceci est dût au serveur sftp utilisé par défaut dans les distributions linux. Si vous rencontrez le problème alors il vous sera nécessaire de changer le serveur utilisé dans le fichier /etc/ssh/sshd_config

Commentez la ligne

Subsystem       sftp    /usr/libexec/openssh/sftp-server

Ajouter la ligne

Subsystem       sftp       internal-sftp

Merci à Oddball  pour m’avoir remonté le problème.