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..

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..

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 :

cl-remote -t list
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 :

cl-remote -t '192.168.1.{1..254}' -- who
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.

cl-remote -t '192.168.1.{1..254}' -x 192.168.1.12 -- who
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 :

cl-remote -t '192.168.1.{1..254}'
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 :

cl-remote -t '192.168.1.{1..254}' -u root -- who
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 :

cl-remote -t pc1 -u natalia -- who
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 :

cl-remote -s list
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 :

cl-remote -t '192.168.1.{1..254}' -s version 20261106
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 :

cl-remote -t pc1 -s users
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 :

cl-remote --nocolor -t pc1 -s kernel
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é :

cl-remote -t pc1 -r error -s version 20261106
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.