cl-remote: параллельное выполнение команд на рабочих станциях
Updated 9 Novembre 2026
cl-remote est un utilitaire d'administration : il exécute des commandes et des scripts de service prêts à l'emploi sur de nombreuses machines en parallèle, via SSH. L'utilitaire repère d'abord les adresses actives sur le réseau grâce à un port ouvert, puis se connecte à chaque machine qui répond et affiche les résultats dans un tableau unique. Cette page s'adresse aux administrateurs qui maintiennent un parc de postes de travail Calculate Linux.
Cette page s'applique à cl-remote 0.3.2.
Objectif
Il est nécessaire lorsqu'une même action doit être réalisée sur des dizaines de machines à la fois
Il est nécessaire lorsqu'une même action doit être réalisée sur des dizaines de machines à la fois : vérifier les versions des builds, identifier le poste de travail utilisé par un employé, envoyer des notifications sur les bureaux, préparer une mise à jour à partir d'une image. Par rapport au déplacement manuel de machine en machine via ssh, cl-remote apporte :
- pas d'agent sur les machines : tout s'exécute via ssh à l'aide des outils standard du système cible, et aucun script ne reste sur la machine une fois la tâche terminée ;
- filtrage rapide des adresses indisponibles : les vérifications de port s'exécutent en parallèle et durent au plus le SCAN_TIMEOUT pour l'ensemble du segment, de sorte que les machines éteintes ne retardent pas le balayage ;
- exécution parallèle avec un degré de parallélisme contrôlable — le paramètre -j ;
- sélection par utilisateur connecté : exécuter une action là où quelqu'un travaille, ou, inversement, uniquement là où personne n'est connecté et où un redémarrage est sans risque ;
- les réseaux sont décrits une seule fois dans le fichier de configuration — ensuite, on les référence par nom plutôt que par une liste d'adresses ;
- un jeu de scripts prêts à l'emploi pour la maintenance du parc : versions du système, utilisateurs, débits des interfaces, notifications, mise à jour à partir d'une image, configuration des points d'accès.
Pour autant, l'utilitaire reste un simple outil shell : un appel produit un tableau unique avec un résultat pour chaque machine.
Installation
L'utilitaire s'installe depuis le dépôt Calculate, paquet app-admin/cl-remote :
emerge -a cl-remote
Les paramètres sont lus depuis le fichier /etc/calculate/remote.env — dès l'installation, copiez le modèle /etc/calculate/remote.env.example vers ce chemin et décommentez les lignes nécessaires. Sans le fichier de paramètres, l'utilitaire ne fonctionne pas.
cp /etc/calculate/remote.env.example /etc/calculate/remote.env
Connexion SSH
cl-remote appelle ssh sans spécifier d'identifiant
cl-remote appelle ssh sans spécifier d'identifiant : le client ssh choisit donc le compte sur la machine cible. N'importe quel utilisateur peut exécuter l'utilitaire lui-même sur la machine de l'administrateur — l'essentiel est que les actions au niveau système sur la machine cible s'exécutent en tant que root. Pour cela, exécutez cl-remote en tant que root ou indiquez la directive User root dans le ~/.ssh/config du client. Dans les deux cas, configurez la connexion sans mot de passe vers root : générez une paire de clés (ssh-keygen -t ed25519), ajoutez la clé publique au compte root des machines (), ajoutez la clé publique au compte root des machines (ssh-copy-id root@<address>), et indiquez le chemin de la clé privée dans la variable ), et indiquez le chemin de la clé privée dans la variable SSH_KEY..
ssh-keygen -t ed25519), ajoutez la clé publique au compte root des machines (), ajoutez la clé publique au compte root des machines (ssh-copy-id root@<address>), et indiquez le chemin de la clé privée dans la variable ), et indiquez le chemin de la clé privée dans la variable SSH_KEY..
Si la connexion par clé n'est pas en place, lancez l'utilitaire avec le paramètre --ask-pass : il demande le mot de passe SSH une seule fois et l'utilise pour authentifier toutes les connexions via sshpass. Sans
Si la connexion par clé n'est pas en place, lancez l'utilitaire avec le paramètre --ask-pass : il demande le mot de passe SSH une seule fois et l'utilise pour authentifier toutes les connexions via sshpass. Sans --ask-pass, seule la connexion par clé fonctionne : une machine qui n'accepte pas la clé est considérée comme indisponible — l'utilitaire ne présente plus aucune autre invite.
une machine qui n'accepte pas la clé est considérée comme indisponible — l'utilitaire ne présente plus aucune autre invite.Ключи серверов не проверяются
Les connexions s'établissent sans vérifier la clé publique de la machine cible et sans écrire dans known_hosts. L'utilitaire part du principe que l'administrateur fait confiance aux adresses listées dans sa configuration.
Configuration
cl-remote découvre les machines par port. Parmi toute la liste d'adresses, il ne se connecte qu'à celles dont le port de sondage est ouvert. Par défaut, il s'agit du port 22 — adapté lorsque sshd tourne sur chaque machine du parc. Pour distinguer vos machines du reste de l'équipement réseau, marquez-les avec un port supplémentaire : configurez sshd pour qu'il y accepte également les connexions, et indiquez le numéro dans NET_PORT. Le balayage d'un segment de 254 adresses prend moins d'une seconde, les résultats de la découverte n'ont donc pas besoin d'être mis en cache — chaque exécution retrouve les machines.
Les listes d'adresses et les noms des réseaux sont stockés dans le fichier de configuration. NET_ADDR contient les paires « nom — plage d'adresses », NET_NAME les paires « nom — description » (affichées par cl-remote -t list), et la variable NET définit le réseau par défaut ; sans le paramètre -t, c'est ce réseau qui est utilisé. NET_PORT se donne au format probe[:ssh], où le premier port sert à la découverte et le second (à défaut le SSH_PORT commun) sert à la connexion.
Exemple de fichier configuré :
/etc/calculate/remote.env
# Réseau par défaut pour cl-remote NET="labnet" # Noms des réseaux : la paire nom — description est affichée par cl-remote -t list NET_NAME=( labnet "Réseau de laboratoire" officens "Réseau des bureaux" ) # Plages d'adresses des réseaux : la paire nom — liste d'adresses NET_ADDR=( labnet "pc1 pc2 pc3" officens "192.168.1.{10..20}" ) # Ports du réseau au format probe[:ssh] NET_PORT=( labnet "22" ) # Nombre de connexions simultanées JOBS=10 # Clé privée pour la connexion sans mot de passe SSH_KEY="/root/.ssh/id_ed25519"
La requête de liste affiche les réseaux déclarés et le réseau par défaut :
Réseau : [labnet] Réseau de laboratoire [officens] Réseau des bureaux Réseau par défaut : labnet # La valeur par défaut peut être remplacée dans 'remote.env'.
Cibles
Une cible se définit comme un nom de réseau issu de la configuration, une adresse IP, un nom d'hôte, ou une plage avec expansion d'accolades ; le paramètre -t peut être répété plusieurs fois. La commande peut aussi être envoyée à un segment entier — elle n'atteint que les machines qui répondent, et la durée du balayage s'affiche sur la dernière ligne du tableau :
NOM D’HÔTE IP SORTIE
--------------------------------------------------------------------------------
pc1 192.168.1.11 ivan pts/0 2026-11-09 14:10 (192.168.64.5)
petr pts/1 2026-11-09 14:40 (192.168.64.6)
root tty1 2026-11-09 13:40
pc3 192.168.1.13 ivan pts/0 2026-11-09 14:10 (192.168.64.5)
petr pts/1 2026-11-09 14:40 (192.168.64.6)
root tty1 2026-11-09 13:40
pc2 192.168.1.12 ivan pts/0 2026-11-09 14:10 (192.168.64.5)
petr pts/1 2026-11-09 14:40 (192.168.64.6)
root tty1 2026-11-09 13:40
Total : 3 Succès : 3
Temps d'exécution : 0.1 s.
Les exemples utilisent le sous-réseau de laboratoire de l'administrateur, 192.168.1.0/24 : les machines pc1—pc3 répondent sous 192.168.1.11—192.168.1.13 ; remplacez-les par vos propres adresses opérationnelles.
Les adresses supplémentaires sont exclues de la sélection avec le paramètre -x. Excluez une adresse sous la forme même sous laquelle elle est entrée dans la cible — les plages sous forme de numéros, les réseaux sous forme de noms.
NOM D’HÔTE IP SORTIE
--------------------------------------------------------------------------------
pc1 192.168.1.11 ivan pts/0 2026-11-09 14:10 (192.168.64.5)
petr pts/1 2026-11-09 14:40 (192.168.64.6)
root tty1 2026-11-09 13:40
pc3 192.168.1.13 ivan pts/0 2026-11-09 14:10 (192.168.64.5)
petr pts/1 2026-11-09 14:40 (192.168.64.6)
root tty1 2026-11-09 13:40
Total : 2 Succès : 2
Temps d'exécution : 0.0 s.
Si aucune commande n'est indiquée, l'utilitaire se limite à un contrôle de port — c'est ainsi que l'on détermine les adresses d'un segment qui répondent :
NOM D’HÔTE IP SORTIE -------------------------------------------------------------------------------- pc3 192.168.1.13 Le port 22 est ouvert. pc1 192.168.1.11 Le port 22 est ouvert. pc2 192.168.1.12 Le port 22 est ouvert. Total : 3 Temps d'exécution : 0.0 s.
Sélection des machines selon les utilisateurs connectés
Le paramètre -u filtre les machines selon l'état de connexion avant l'exécution de la commande filtre les machines selon l'état de connexion avant l'exécution de la commande :
Le paramètre -u filtre les machines selon l'état de connexion avant l'exécution de la commande filtre les machines selon l'état de connexion avant l'exécution de la commande : ON — uniquement les machines où quelqu'un travaille ; OFF — uniquement les machines où personne n'est connecté (sans risque pour les redémarrages) ; un identifiant — uniquement les machines où l'utilisateur indiqué est connecté ; ALL (la valeur par défaut) — aucun filtre. C'est ainsi que l'on trouve, par exemple, les machines où une console root est ouverte :
NOM D’HÔTE IP SORTIE
--------------------------------------------------------------------------------
pc2 192.168.1.12 ivan pts/0 2026-11-09 14:10 (192.168.64.5)
petr pts/1 2026-11-09 14:40 (192.168.64.6)
root tty1 2026-11-09 13:40
pc3 192.168.1.13 ivan pts/0 2026-11-09 14:10 (192.168.64.5)
petr pts/1 2026-11-09 14:40 (192.168.64.6)
root tty1 2026-11-09 13:40
pc1 192.168.1.11 ivan pts/0 2026-11-09 14:10 (192.168.64.5)
petr pts/1 2026-11-09 14:40 (192.168.64.6)
root tty1 2026-11-09 13:40
Total : 3 Succès : 3
Temps d'exécution : 0.1 s.
Une machine qui ne satisfait pas au filtre n'apparaît pas dans la sortie — une exécution avec un identifiant qu'aucun utilisateur n'a utilisé donne un tableau vide :
NOM D’HÔTE IP SORTIE -------------------------------------------------------------------------------- Temps d'exécution : 0.0 s.
Scripts prêts à l'emploi
Le paramètre -s exécute un script du répertoire exécute un script du répertoire /usr/libexec/cl-remote : le script est transféré intégralement sur la machine, où sa fonction
Le paramètre -s exécute un script du répertoire exécute un script du répertoire /usr/libexec/cl-remote : le script est transféré intégralement sur la machine, où sa fonction run() s'exécute ; les arguments placés après le nom du script deviennent ses paramètres. L'argument list affiche les scripts eux-mêmes, leurs descriptions et des exemples d'appel :
Scripts système:
[aproaming] Configuring OpenWrt access points with seamless Wi-Fi
roaming support (802.11r/k/v).
Example: cl-remote -t ap0812 -p 51022 -s aproaming
[rename-iface] Renaming the default network interface.
Udev in the initramfs assigns unique names to network
interfaces, which can be inconvenient to work with. This
script allows you to rename a network interface.
Warning: It's not recommended to use the name eth0 if
you have multiple network interfaces, as proper renaming
via systemd-udevd has been removed.
Example: 'cl-remote -s rename-iface lan0'
[users] Display system users
[version] Displaying the installed system version.
This script retrieves the installed version of
Calculate Linux. If an argument is provided, it compares
the version with the given value.
Example: 'cl-remote -s version 20250311'
[upgrade] Updating Calculate Linux from a system image without
modifying the existing installation
Example: 'cl-remote -j3 -s upgrade'
[notify] Sending Notifications to Users
Example: cl-remote -s notify "System Update" Reboot in
10 minutes!
[netspeed] Network Interface Speed
Displays the name and speed of the network interface.
If the speed does not match the maximum, an error is
displayed. Takes bridges into account.
Example: 'cl-remote -s netspeed'
Scripts utilisateur:
[kernel] Afficher la version du noyau en cours d'exécution
Mesurée sur la machine cible ; la sortie est la chaîne
de version du noyau
Exemple : 'cl-remote -s kernel'
Vérification de la version du système (version)
Le script lit le numéro de build depuis /var/lib/calculate/calculate.env ; si vous lui passez un numéro de référence, les machines dont le build diffère sont marquées par un avertissement :
NOM D’HÔTE IP SORTIE -------------------------------------------------------------------------------- pc1 192.168.1.11 20261030 pc2 192.168.1.12 20261030 pc3 192.168.1.13 20261030 Total : 3 Avertissements : 3 Temps d'exécution : 0.0 s.
Les machines n'ont pas encore été mises à jour vers la dernière version 20261106 : les builds diffèrent de celui attendu et le récapitulatif a compté ces lignes comme des avertissements.
Utilisateurs de la machine (users)
Le script affiche les utilisateurs connectés — le nom complet issu du compte et le groupe principal ; une connexion root est marquée par un avertissement :
NOM D’HÔTE IP SORTIE
----------------------------------------------------------------------
Name Group
pc1 192.168.1.11 Ivan Petrov users
Petr Sidorov users
root root
Total : 1 Avertissements : 1
Temps d'exécution : 0.0 s.
Notifications de bureau (notify)
Le script recherche les utilisateurs ayant une session graphique ouverte et envoie à chacun une notification notify-send ; le premier argument est le titre, le reste constitue le texte de la notification. La durée d'affichage et l'icône sont définies par les variables NOTIFY_TIME et NOTIFY_ICON dans /etc/calculate/remote-client.env.
Débit de l'interface réseau (netspeed)
Le script affiche l'interface de la route par défaut et son débit actuel ; lorsque ethtool est disponible, il compare le débit actuel au débit maximal pris en charge et marque d'un avertissement les machines fonctionnant en dessous de leur limite. Les bridges sont pris en compte : l'interface physique sous le bridge est affichée.
Mise à niveau depuis une image (upgrade)
Le script lance la préparation de la mise à niveau depuis une image (cl-install -Uf) et ne redémarre la machine que lorsqu'aucun utilisateur n'y est actif. Comme il s'agit d'une opération lourde, les exécutions simultanées sont limitées — comme dans l'exemple tiré de la liste elle-même : cl-remote -j3 -s upgrade.
Unification des noms d'interfaces (rename-iface)
Udev, dans l'initramfs, attribue aux interfaces des noms fondés sur leur position matérielle (enp19s0 et similaires), si bien que les noms diffèrent d'une machine à l'autre. Le script ramène les noms locaux des interfaces à une forme commune à tout le parc : l'interface portant la route par défaut est rebaptisée du nom passé en argument (ou avec la valeur de RENAME_IFACE), et elle porte alors le même nom sur toutes les machines — par exemple, lan0. Outre le renommage, le script modifie /etc/conf.d/net et les liens symboliques des scripts de runlevel, et écrit dans /etc/udev/rules.d/70-persistent-net.rules une règle qui lie le nom à l'adresse MAC, de sorte que le nom survive au redémarrage. Sur les machines dotées de plusieurs interfaces, évitez de choisir eth0 comme nom standard.
Configuration du point d'accès (aproaming)
Le script prépare un point d'accès OpenWrt pour une itinérance fluide 802.11r/k/v. Les noms réseau des deux bandes, le mot de passe Wi-Fi, le domaine réglementaire, la largeur de canal, NTP et le fuseau horaire sont définis par des variables préfixées par AP_ dans /etc/calculate/remote-client.env ; si le mot de passe Wi-Fi est absent, l'utilitaire le demande au démarrage.
Scripts personnalisés
Un script personnalisé est un simple fichier shell. L'essentiel du code s'exécute dans la fonction run(), qui reçoit les arguments indiqués après le nom du script ; la fonction facultative prepare() s'exécute sur la machine de l'administrateur avant la distribution et peut, par exemple, définir l'en-tête d'une colonne supplémentaire du tableau — la variable CLIENT_TABLE_HEADER sert à cela. Les lignes de description commençant par ## apparaissent dans la sortie de cl-remote -s list. Les scripts personnalisés sont recherchés d'abord dans le répertoire utilisateur — par défaut /var/calculate/remote-scripts, dont le chemin est redéfini par la variable USER_SCRIPTS_DIR dans /etc/calculate/remote.env ; le script est ensuite cherché parmi les scripts système dans /usr/libexec/cl-remote. Les scripts prêts à l'emploi de ce répertoire peuvent servir de base pour écrire les vôtres. Les valeurs issues de /etc/calculate/remote-client.env et celles rassemblées par prepare() sont transmises à la machine cible avec le script ; aucune trace du script ne reste sur la machine.
Exemple de script affichant la version du noyau :
/var/calculate/remote-scripts/kernel
## Afficher la version du noyau en cours d'exécution ## Mesurée sur la machine cible ; la sortie est la chaîne de version du noyau ## Exemple : 'cl-remote -s kernel' run() { uname -r }
Lancement d'un script personnalisé sur une machine :
NOM D’HÔTE IP SORTIE -------------------------------------------------------------------------------- pc1 192.168.1.11 6.18.57-calculate Total : 1 Succès : 1 Temps d'exécution : 0.0 s.
Affichage des résultats
Chaque machine traitée devient une ligne du tableau, avec les colonnes NOM D’HÔTE, IP et SORTIE ; la sortie multiligne d'une commande est alignée sur la troisième colonne. Les lignes sont colorées selon le résultat : vert pour un succès, jaune pour un avertissement, rouge pour une erreur ; un script prêt à l'emploi marque son résultat comme un avertissement avec le code de sortie 73. Les lignes apparaissent dans l'ordre d'arrivée des résultats, et non par ordre alphabétique. Les compteurs récapitulatifs et le temps d'exécution sont affichés à la fin.
Le filtre de niveau -r ne conserve dans la sortie que les lignes du niveau demandé :
NOM D’HÔTE IP SORTIE -------------------------------------------------------------------------------- Temps d'exécution : 0.0 s.
L'option --nocolor désactive les couleurs (l'utilitaire le fait automatiquement lorsque la sortie est redirigée vers un fichier).
Options
| Option | Valeur | Action |
|---|---|---|
--ask-pass |
— | Demander le mot de passe SSH et s'authentifier via sshpass |
-x, --exclude |
réseau / adresse / nom | Exclure de la sélection ; répétible |
-h, --help |
— | Afficher l'aide |
-j, --jobs |
nombre (10) | Nombre de connexions simultanées |
--nocolor |
— | Désactiver la sortie en couleurs |
-p, --probe-port |
port (22) | Port de vérification de la disponibilité de l'hôte |
-P, --ssh-port |
port (22) | Port de connexion SSH |
-r, --report |
all / success / warning / error | Ne conserver dans la sortie que les lignes de ce niveau |
-s, --script |
nom ou list | Exécuter un script prêt à l'emploi ; list affiche la liste des scripts |
-t, --target |
réseau / adresse / nom | Indiquer la cible ; option répétible |
-u, --using |
ALL / ON / OFF / identifiant | Exécuter en tenant compte des utilisateurs connectés |
La liste complète avec des exemples figure dans la sortie de cl-remote --help.
Variables de configuration
Les valeurs sont définies dans /etc/calculate/remote.env (sauf les variables des scripts prêts à l'emploi, stockées dans /etc/calculate/remote-client.env).
| Variable | Valeur par défaut | Objectif |
|---|---|---|
EXEC_TIMEOUT |
1200 | Durée maximale d'exécution d'une commande sur l'hôte, secondes |
JOBS |
10 | Nombre de connexions simultanées |
NET |
— | Réseau par défaut pour une exécution sans -t |
NET_ADDR |
— | Paires « nom de réseau — liste d'adresses » |
NET_NAME |
— | Paires « nom de réseau — description » pour -t list |
NET_PORT |
— | Paires « nom de réseau — probe[:ssh] » |
PROBE_PORT |
22 | Port de vérification de la disponibilité de l'hôte |
SCAN_TIMEOUT |
1.5 | Délai d'attente de la vérification du port, secondes |
SSH_KEY |
— | Chemin vers la clé privée SSH |
SSH_PORT |
22 | Port de connexion SSH |
USING |
ALL | Filtre par défaut selon les utilisateurs connectés |
USER_SCRIPTS_DIR |
/var/calculate/remote-scripts | Répertoire des scripts personnalisés |
Dépôt source et exemples supplémentaires : git.calculate-linux.org/calculate/cl-remote
D'autres guides d'administration se trouvent sur la page Travailler avec Calculate.