Retour au blog

SSH natif pour les agents Comma

CommencerLire la documentation

Votre serveur domestique ne termine plus sa sauvegarde nocturne. Les journaux sont sur le serveur, le serveur est derrière votre routeur, et vous voulez que Comma découvre ce qui s’est passé, pas qu’il vous donne une liste de commandes à recopier dans un sens puis dans l’autre. Les agents de Comma peuvent désormais travailler sur cette machine en SSH, sans y installer un autre agent IA.

L’agent vit en dehors du bac à sable

La plupart des agents cloud s’exécutent dans leur bac à sable : un conteneur ou une VM qui contient la boucle du modèle, les outils et les fichiers, et qui reste allumé aussi longtemps que l’agent. Salix, le harnais distribué derrière Comma, sépare ces éléments. La boucle de l’agent s’exécute dans le harnais, hors de tout bac à sable, à plus de 100 agents par cœur de CPU. Une VM cloud ou un appareil n’est qu’un endroit où s’exécutent des commandes, utilisé seulement quand le travail a besoin d’un ordinateur.

Pour travailler sur votre serveur, l’agent ne s’y déplace donc pas. Il appelle des outils SSH natifs depuis le harnais :

  • ssh.open, ssh.write, ssh.read et ssh.screen pour un terminal interactif, y compris les programmes en plein écran ;

  • ssh.exec pour une seule commande, avec stdout, stderr et le code de sortie séparés ;

  • ssh.list_files, ssh.download et ssh.upload pour les fichiers, en SFTP ;

  • ssh.close et ssh.list pour le cycle de vie de la connexion.

L’agent s’authentifie avec une clé SSH de Group : une clé par espace de travail, partagée par ses agents. ssh.public_key la renvoie, et vous l’ajoutez à ~/.ssh/authorized_keys sur la machine, comme pour n’importe quel autre client SSH.

Le harnais peut atteindre votre machine de trois façons.

1. Une adresse publique

Si la machine a déjà un serveur SSH joignable, l’agent se connecte à son adresse IP ou à son nom DNS :

json
{ "tool": "ssh.open", "params": { "host": "203.0.113.10", "user": "deploy" } }

2. Tailcat, pour une machine sans adresse publique

Un portable ou un serveur domestique derrière un NAT n’a souvent aucune adresse que le harnais puisse joindre. Tailcat le connecte sans port entrant, sans VPN et sans compte. Il s’exécute sur la machine, n’ouvre que des connexions sortantes et affiche une adresse qui commence par tc.

Tailcat peut aussi servir de serveur SSH. Lancez-le avec la clé publique du Group :

sh
tailcat serve --ssh-authorized-keys='ssh-ed25519 AAAA...' ssh

Vous obtenez un shell de connexion, l’exécution de commandes et SFTP sous le compte qui exécute Tailcat. Il n’a pas besoin de sshd et ne modifie pas votre configuration SSH. Si la machine exécute déjà OpenSSH, utilisez plutôt tailcat serve 22, et OpenSSH gère la connexion. Envoyez ensuite l’adresse à l’agent :

json
{ "tool": "ssh.open", "params": { "tailcat": "tc...", "user": "deploy" } }

3. Votre propre réseau Tailscale

Si vos machines sont déjà dans une tailnet, l’espace de travail peut la rejoindre. Connectez-le dans les réglages de l’app Comma, ou demandez-le à l’agent. Un administrateur de la tailnet ouvre un lien de connexion et approuve le nœud. Par défaut, le nœud porte le tag tag:comma-agent, donc la politique de votre tailnet décide précisément quels appareils et quels ports il peut atteindre, par exemple uniquement le port 22 du serveur domestique.

L’agent liste les appareils avec tailnet.peers et se connecte par nom MagicDNS ou par adresse Tailscale :

json
{
  "tool": "ssh.open",
  "params": { "host": "nas.tail1234.ts.net", "via_tailnet": true, "user": "deploy" }
}

Confiance et durée de vie

Quel que soit le chemin, la première connexion à un hôte enregistre sa clé d’hôte. Une connexion ultérieure qui présente une autre clé est refusée avec host_key_mismatch et les deux empreintes, et l’agent vous demande votre accord avant de supprimer l’ancienne clé avec ssh.known_hosts.remove.

Une connexion SSH appartient à une seule session d’agent. Elle se ferme après 30 minutes d’inactivité et ne survit ni à un redémarrage de l’agent ni à un déploiement de la plateforme : les travaux longs ont donc leur place dans tmux ou screen sur la machine distante. Les commandes sont bornées : ssh.exec expire après 60 secondes par défaut et 600 au maximum, et un dépassement de délai est signalé, jamais relancé automatiquement.

Pour la sauvegarde, vous pourriez demander : « Lis les journaux et vérifie l’espace disque, mais ne supprime aucun fichier et ne modifie pas la configuration. Dis-moi d’abord ce que tu trouves. »

Try Comma, Now.

Commencer