Main menu:

Site search

Categories

August 2008
M T W T F S S
« Jul    
 123
45678910
11121314151617
18192021222324
25262728293031

Archive

Modifier la bannière du login ssh

Sur un serveur de production sur lequel on se connecte régulièrement en ssh, la bannière affichée par Ubuntu devient vite fatiguante.

Linux coserv 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686

The programs included with the Ubuntu system are free
software; the exact distribution terms for each program are
described in the individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the
extent permitted by applicable law.

Last login: Wed Aug 20 14:43:38 2008 from pp152.hf.rtbf.be

Le disclaimer et le copyright, une fois qu’on les a lus, pourraient être remplacés par quelque chose de plus ‘fun’.
Dans mon cas, j’ai choisi d’afficher en grand le nom du serveur en ASCII Art. Le programme que j’ai utilisé pour cela s’appelle figlet et est disponible dans les dépôts Ubuntu.
Voici ce que cela donne:

Linux coserv 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686

   ooooo     ooo  .o8                                   .
   `888'     `8' "888                                 .o8
    888       8   888oooo.  oooo  oooo  ooo. .oo.   .o888oo oooo  oooo
    888       8   d88' `88b `888  `888  `888P"Y88b    888   `888  `888
    888       8   888   888  888   888   888   888    888    888   888
    `88.    .8'   888   888  888   888   888   888    888 .  888   888
      `YbodP'     `Y8bod8P'  `V88V"V8P' o888o o888o   "888"  `V88V"V8P' 

Last login: Wed Aug 20 14:43:38 2008 from pp152.hf.rtbf.be

Le fichier à modifier pour y placer votre nouvelle bannière est /etc/motd.

Si le coeur vous en dit, vous pouvez également supprimer l’affichage du dernier login en modifiant dans le fichier /etc/ssh/sshd_config

PrintLastLog yes

par

PrintLastLog no

Serveur mandataire (proxy)

Dans un environnement industriel, il n’est pas rare de devoir passer par un serveur proxy pour avoir accès à Internet. Si vous utilisez la version desktop d’Ubuntu, il vous suffit de vous rendre dans le menu Système/Préférences/Serveur mandataire. Par contre si vous utilisez la version serveur d’Ubuntu sans interface graphique, cette option n’existe pas mais le proxy reste nécessaire ne fut-ce que pour pouvoir faire les mises à jour au moyen d’apt-get ou d’aptitude.
Deux solutions sont possibles.

1. Créer un fichier /etc/apt/apt.conf et y mettre la ligne suivante:

Acquire::http:Proxy "http://mon_proxy.mon_domaine.com:port/";

Il faut évidemment remplacer l’adresse et le port par celle du proxy.

2. Initialiser la variable d’environnement http_proxy avec l’adresse du proxy. Ceci peut se faire soit de manière globale dans /etc/profile soit, par utilisateur, dans le fichier ~/.bashrc. Il suffit d’ajouter la ligne suivante au fichier:

export http_proxy=http://mon_proxy.mon_domaine.com:port/

Remplacez l’adresse et le port par celle du proxy. Cette méthode a aussi l’avantage de rendre l’adresse du proxy disponible pour d’autres applications qui en auraient besoin.

Planification de tâches - la commande at

Lorsque vous voulez planifier le lancement d’une tâche de manière répétitive (tous le jours, toutes les heures, le 1er janvier…) vous utilisez la command cron. Par contre, si cette tâche ne doit être lancée qu’une seule fois, vous utiliserez la command at.
La commande at est une commande très facile à utiliser. Il suffit de taper dans un terminal at suivi de l’heure, le jour où la tâche devra être exécutée. Par exemple:

$ at 16:45
$ at 16:45 010109
$ at midnight
$ at now  # très utile pour les tests
$ at 16:45 + 3 days

Elle s’utilise soit de façon interactive soit en ligne de commande.

Méthode interactive

Vous tapez dans un terminal la commande at suivi de l’heure, le jour… et en retour vous obtenez un prompt qui vous permet de taper la commande à lancer à l’heure dite. Pour sortir, tapez Ctrl+D.

$ at 16:45
warning: commands will be executed using /bin/sh
at> backup.sh
at> 
job 14 at Sun Aug 17 16:45:00 2008

Essayons maintenant de lancer la calculatrice Gnome à une certaine heure:

$ at 16:45
warning: commands will be executed using /bin/sh
at> gcalctool
at> 
job 15 at Sun Aug 17 16:45:00 2008

Et…à l’heure promise, rien ne se passe. Pourquoi?
Parce que at utilise /bin/sh et que toutes les variables d’environnement sont transmises à l’exception de TERM, DISPLAY et “_”. Cela signifie simplement, dans notre cas, que at ne sait pas dans quel DISPLAY afficher le programme puisque votre variable d’environnement DISPLAY ne lui est pas transmise. Pour résoudre ce problème, il suffit de dire à la commande at sur quel DISPLAY afficher la calculatrice Gnome.

$ at 11:51
warning: commands will be executed using /bin/sh
at> export DISPLAY=:0.0
at> gcalctool
at> 
job 15 at Sun Aug 17 11:51:00 2008

Notez la commande export DISPLAY=:0.0.

Méthode en ligne de commande

at attend la tâche à exécuter sur son entrée standard (stdin) et non pas comme paramètre de la commande. Cela signifie que la tâche ne peut pas être transmise à la commande at en argument. C’est la que les redirections sous Linux interviennent. Relisez éventuellement mon article Shell - Redirections de flux.
Nous allons utilser un pipe ‘|’ pour rediriger la sortie standard (stdout) d’un programme vers l’entrée standard (stdin) de la commande at.

$ echo "backup.sh" | at 16:45

On prend la sortie standard de la commande echo et on la redirige vers l’entrée standard de la commande at grâce au pipe. C’est aussi simple que ça.
Vous voulez lancer la calculatrice Gnome? Là aussi, vous devez préciser le DISPLAY à utiliser.

$ echo "export DISPLAY=:0.0;gcalctool" | at 16:45

Pour supprimer une tâche, utilisez atrm suivi du numéro de la tâche. Pour afficher toutes les tâches qui sont pendantes, utilisez atq.
N’oubliez pas de consulter la page de manuel de at pour avoir tous les détails.

C++ - Classes et fonctions amies

On utilise la notion d’ami lorsque l’on a deux classes dont l’une doit avoir accès aux données membres privées de l’autre.
Cette façon de faire permet de limiter à une seule classe l’accès à des données privées et de ne pas devoir rendre celles-ci publiques ce qui les rendrait disponibles pour tout objet ou classe.

class A
{
  public:
    void f();
};

class B
{
  private:
    friend class A;
    int g(){return x;}
    int x;
};

Il est important de remarquer que c’est la classe qui veut partager ses données privées avec une autre qui donne l’accès à celles-ci en spécifiant que l’autre classe est une amie.
Cela se fait avec le mot-clé friend suivi de la classe qui reçoit l’accès aux données privées.
Les bonnes pratiques de la programmation veulent que même si dans ce cas-ci, A a accès à x dans B, A n’y fasse appel que via une fonction privée g(), qui sert d’interface, et non directement. Rien ne l’empêche néanmoins si ce n’est le code de bonne pratique.

En réalité, cette notion de classe amie est une généralisation des fonctions amies. On peut très bien avoir une fonction membre d’une classe ou une fonction globale à laquelle une classe accorderait l’accès à ses données privées. Le principe est le même que pour une classe.

class A
{
  public:
    int f();

class B
{
  private:
    friend int global_func();
    friend void A::f();
    int x;
};

int A::f()
{
  B b;
  return b.x;
}

int global_func()
{
  B b;
  return b.x;
}

Notez également que les déclarations d’amis peuvent être faites tant dans la partie privée que publique de la classe. Il n’y a aucune différence entre les deux.

Quelques commandes

Voici quelques commandes moins connues mais néanmoins utiles dont je me sers à l’occasion:

Affichage en hexadécimal du contenu d’un fichier

$ od -x filename
$ xxd filename

Cette dernière commande a ma préférence parce qu’elle affiche de manière classique le caractère correspondant au code ASCII et permet d’utiliser grep pour rechercher une chaîne de caractères dans un fichier binaire par exemple. Parfois très utile pour ceux qui font de la programmation.
Par contre l’emploi de la commande od permet le choix de la base (décimal, octal, hexadécimal ou même ASCII).

Affichage du type d’un fichier d’un fichier

Cette commande affiche des renseignements sur le type du fichier contenu dans le fichier. Autrement dit, elle vous dit si le fichier est du type texte, data, image jpg ou autre, audio, vidéo… Très utile parfois. Il ne faut pas perdre de vue que sous Linux, l’extension dans le nom de fichier est facultative et si vous avez un répertoire rempli de fichiers dont vous ignorez le type, cette commande peut vous aider et vous faire gagner pas mal de temps.

$ file filename
$ file *

La commande file avec un * comme argument affiche le type de tous les fichiers ou répertoires (un répertoire est un fichier sous Linux) du répertoire courant.

Compter le nombre de mots ou de lignes dans un fichier

$ wc -l filename
$ wc -w filename

La première commande compte le nombre de lignes, la seconde, le nombre de mots.

Savoir qui est loggé sur une machine

$ w
$ who

Savoir qui s’est loggé sur une machine et quand

$ last
$ last -10

La commande last lit le fichier /var/log/wtmp qui contient les renseignements qu’on recherche. Attention cependant, ce fichier est remis à zéro à chaque reboot de la machine.

Dans tous les cas, n’oubliez pas de consulter la page de manuel de la commande.

KeyStatus

KeyStatus
KeyStatus est un petit programme écrit en python qui permet de monitorer et d’afficher l’utilisation des boutons de la souris, des touches spéciales Ctrl, Alt et Shift et des autres touches du clavier.

Il peut vraiment être utile lorsque vous faites une présentation d’un logiciel en affichant en permanence les touches du clavier et de la souris que vous utilisez.
Pas d’installation compliquée, il vous suffit de le télécharger à cette adresse et de le décompresser là ou vous le désirez. Ensuite, rendez-vous dans le dossier où vous avez décompressé le programme et faites la petite modification suivante au code source pour qu’il soit utilisable avec ubuntu:

$ cd le_répertoire_où_le_fichier_est_décompressé
$ gedit key-status

Remplacez les lignes suivantes:

# Device locations
KEYBOARD_LOCATION   = "/dev/input/event0"
MOUSE_LOCATION      = "/dev/input/event1"

par celles-ci qui donnent les valeurs compatibles avec votre Ubuntu:

# Device locations
KEYBOARD_LOCATION   = "/dev/input/event1"
MOUSE_LOCATION      = "/dev/input/event5"

Le programme doit être lancé avec des droits root:

$ sudo ./key-status

Remarquez que la petite fenêtre de monitoring reste au dessus de toutes les autres et reste donc visible en permanence.