terminal-icon

Linux : ajouter un utilisateur à un groupe sans supprimer ses droits

Il m’est arrivé une mésaventure avec la commande usermod sous Linux. Dans un terminal, usermod sert à modifier un compte utilisateur : groupes, shell, répertoire personnel, nom de login, date d’expiration, etc.

Le cas le plus courant consiste à ajouter un utilisateur à un groupe, par exemple pour lui donner accès à Docker, à des fichiers partagés, à un groupe système, ou à certaines permissions.

Le problème, c’est que beaucoup d’exemples anciens donnent cette commande :

sudo usermod -G groupname username

Elle semble correcte. Elle ne l’est pas, sauf si vous voulez remplacer entièrement la liste des groupes secondaires de l’utilisateur.

La bonne commande pour ajouter un utilisateur à un groupe sans lui retirer ses groupes actuels est :

sudo usermod -aG groupname username

Le petit -a change tout. Sans lui, -G définit la nouvelle liste de groupes supplémentaires. Avec lui, -G ajoute le groupe à la liste existante.

Le piège de usermod -G

Imaginons un utilisateur matt qui appartient déjà à plusieurs groupes :

groups matt

Résultat :

matt : matt sudo adm cdrom dip plugdev lpadmin

Si vous lancez :

sudo usermod -G docker matt

vous ne faites pas seulement “ajouter matt au groupe docker”. Vous remplacez ses groupes secondaires par docker.

Après reconnexion, l’utilisateur peut donc perdre des groupes importants comme sudo, adm, lpadmin ou plugdev. Et là, c’est tout de suite moins drôle. Surtout si vous venez de vous retirer vos propres droits sudo. Grand classique, petit frisson.

Lire la suite

Cron : résoudre l'erreur logrotate_script: 3: [: /var/run/mysqld/mysqld.pid: unexpected operator photo

Logrotate : corriger l’erreur MySQL “unexpected operator”

Depuis que j’ai déplacé les bases de données SQL sur une autre partition, logrotate semble avoir quelques soucis avec l’archivage des logs MySQL/MariaDB.

Voici le message d’erreur complet reçu depuis cron.daily :

/etc/cron.daily/logrotate: logrotate_script: 3: [: /var/run/mysqld/mysqld.pid: unexpected operatorCode language: JavaScript (javascript)

Ce message est un peu cryptique, mais le problème est simple : dans le script exécuté par logrotate, le test shell [ -f ... ] reçoit une valeur inattendue, souvent parce qu’une commande retourne plusieurs lignes au lieu d’un seul chemin de fichier PID.

Résultat : le shell ne comprend plus l’expression et retourne unexpected operator.

Comprendre l’erreur “unexpected operator”

L’erreur vient généralement d’une ligne de ce type dans le fichier de rotation MySQL/MariaDB :

if [ -f `my_print_defaults --mysqld | grep -oP "pid-file=\K[^$]+"` ]; thenCode language: CSS (css)

Le but de cette ligne est de récupérer le chemin du fichier PID de MySQL/MariaDB, puis de vérifier s’il existe.

Le problème apparaît si la commande retourne plusieurs chemins ou plusieurs lignes. Le shell se retrouve alors avec une expression de ce type :

if [ -f /var/run/mysqld/mysqld.pid /run/mysqld/mysqld.pid ]; thenCode language: JavaScript (javascript)

Or [ -f ... ] attend un seul chemin. Avec deux valeurs, il ne sait plus évaluer correctement le test. D’où l’erreur unexpected operator.

C’est souvent lié à une configuration MySQL/MariaDB qui contient plusieurs directives pid-file, parfois après migration, installation depuis un dépôt externe, ou déplacement de datadir/logs.

Lire la suite

MySQL: résoudre l'erreur "Incorrect datetime value" lors d'opérations sur les tables photo

MySQL : résoudre l’erreur “Access denied for user debian-sys-maint@localhost”

Lors de la migration de bases de données d’un serveur à l’autre, j’ai déplacé la base mysql, qui contient les utilisateurs, les privilèges et une partie de la configuration interne du serveur SQL.

Sur le papier, cela évite de recréer tous les comptes SQL à la main. En pratique, cela peut aussi déplacer des comptes système propres à l’ancien serveur et casser les comptes de maintenance du nouveau.

C’est ainsi que l’on peut tomber sur cette erreur au démarrage ou à l’arrêt de MySQL :

Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)Code language: JavaScript (javascript)

Ou encore :

/usr/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'Code language: JavaScript (javascript)

Le problème vient généralement d’un décalage entre l’utilisateur SQL debian-sys-maint présent dans MySQL/MariaDB et le mot de passe stocké dans le fichier système /etc/mysql/debian.cnf.

À quoi sert debian-sys-maint ?

Sur certaines anciennes installations Debian/Ubuntu, le paquet MySQL créait un utilisateur spécial nommé debian-sys-maint.

Cet utilisateur servait aux scripts de maintenance du paquet : vérifier l’état du serveur, recharger certaines informations, arrêter proprement MySQL, effectuer certaines tâches administratives, etc.

Son mot de passe était stocké dans :

/etc/mysql/debian.cnf

Le wiki Evolix résume bien ce comportement : sur Debian 10 et inférieur, certaines tâches passent par l’utilisateur SQL debian-sys-maint, avec un mot de passe stocké dans /etc/mysql/debian.cnf. Evolix Wiki : Howto MySQL

Sur des systèmes plus récents, surtout avec MariaDB et l’authentification par socket Unix, ce compte peut ne plus être présent ou ne plus être nécessaire. Il faut donc adapter le diagnostic à votre version réelle de MySQL/MariaDB.

Lire la suite