Les commandes SSH échouent sur les hôtes csh ? Enveloppez-les dans /bin/sh -c

Une commande SSH fonctionne tandis que la suivante échoue sur le même hôte, avec les mêmes identifiants. Le responsable n’est ni la connexion ni l’utilisateur : c’est le shell de connexion sur le serveur.
L’incompatibilité invisible du shell
Sur la configuration par défaut de Sakura Internet, les comptes utilisateurs se connectent avec csh ou tcsh au lieu de bash. Cela compte, car les bibliothèques SSH comme Paramiko de Python transmettent les commandes au shell de connexion de l’utilisateur. Quand le code envoie une syntaxe POSIX comme 2>/dev/null ou [ -f path ], csh lit les caractères littéralement et génère des erreurs comme « opérateur ou primaire inconnu ». La même commande enveloppée dans /bin/sh -c s’exécute sans problème, car POSIX sh interprète correctement la syntaxe.
Corriger un point a révélé l’ampleur du problème
Un correctif précédent avait déjà enveloppé le test de connexion SSH dans /bin/sh -c, mais cette modification ne concernait que test_ssh_profile. Un rapport de bug ultérieur a montré que la « détection automatique du chemin d’installation de WordPress » échouait alors que le bouton de test WP-CLI fonctionnait. Une analyse du codebase a révélé plusieurs sites d’appel SSH envoyant encore des commandes shell brutes : découverte de chemins, détection automatique par WP-CLI, récupération de listes de plugins, et bien plus. Chaque appel reposant sur la syntaxe POSIX sh était silencieusement rompu sur les hôtes csh.
Déployer une seule fonction d’assistance
Plutôt que de modifier manuellement chaque site d’appel, l’équipe a centralisé toutes les commandes SSH dans une fonction d’assistance _safe_run. Toutes les API liées à SSH passent désormais par cette fonction, qui enveloppe automatiquement la commande dans /bin/sh -c. La fonction standardise aussi la gestion des erreurs et les guillemets, réduisant ainsi les surprises liées au shell à l’avenir. Des tests d’analyse statique ont été ajoutés pour repérer toute invocation directe de commandes SSH contournant _safe_run, assurant la pérennité de la correction.
Source : DEV Community. Synthèse éditoriale assistée par IA — TechnoExpress.

