Bonjour à tous.
Comment exécuter un programme sur une machine distante, en YAML ?
HASS a la possibilité d’écrire des ordres en ligne de commande. Ces possibilités sont assez réduites, et on ne peut pas les étendre en rajoutant des fonctionnalités (packages).
SSH est cependant présent dans l’installation standard de HASS. On peut se connecter à une autre machine par SSH et y lancer des programmes. Le problème, c’est que dans l’utilisation standard de SSH, il faut entrer le mot de passe de la machine cible, ce que ne sait pas faire YAML (pas d interaction en shell_command).
SSH peut cependant se connecter à une machine cible SANS mot de passe, à condition que celle ci possède une clef de reconnaissance.
C’est le but ici : se connecter en YAML à une machine cible, sans interaction (sans demande de mot de passe).
Dans cet exemple j’utilise lm-sensors, un package installé sur la cible (ha@192.168.xxx.yyy ), qui permet de lire les capteurs hardware de la machine, avec l’ordre sensors.
Si on fait directement sensors dans un terminal de HASS on a une erreur, HASS ne connaît pas sensors.
Si on passe par ssh : ssh ha@192.168.xxx.yyy 'sensors'
ça marche, mais après demande du mot de passe.
Pour contourner cela on utilise l’option –i
de ssh. Cela indique à ssh quelle clef utiliser pour se connecter.
Pour pouvoir utiliser une clef, il faut en générer 2 ! Une publique et une privée. La clef publique (id_rsa.pub ) doit etre transmise à la machine cible, pour que ssh puisse la valider avec la clef privée conservée par la machine appelante.
La particularité de HASS, c’est que son organisation de répertoire est très contrainte, seuls sont partagés avec les autres conteneurs /config & /share, et ce sont les seuls à ne pas être effacés après une mise à jour. Il faut donc conserver ces clefs quelque part dans /config/.
J’ai choisi de les mettre dans /config/_ssh/ (_ssh et non pas .ssh pour les différencier).
Avant de commencer, il faut un terminal dans HASS, il FAUT utiliser SSH & WEB TERMINAL (SWT) ET DESACTIVER LE MODE PROTECTION.
Donc pas l add-on « officiel » mais celui de la communauté, qui possède plus de fonctions.
Cette partie se déroule donc dans SWT :
Création de /config/_ssh/ : mkdir ~/config/_ssh
Création des clefs : ssh-keygen -t rsa
répondre /config/_ssh/id_rsa pour le chemin et ENTER aux autres questions ( ! attention à la syntaxe !)
Sur la machine cible (toujours sur SWT, par ssh avec le mot de passe):
! Attention vérifiez AVANT sur la cible si il n’existe pas par hasard d’autres clefs déjà enregistrées. Une nouvelle génération reconstruit des clefs différentes !
Création du répertoire : ssh ha@192.168.xxx.yyy mkdir .ssh
Copie de la clef : cat /config/_ssh/id_rsa.pub | ssh ha@192.168.xxx.yyy 'cat >> .ssh/authorized_keys'
Test en direct (SWT) : ssh ha@192.168.xxx.yyy -i /config/_ssh/id_rsa 'sensors'
Si ici ça fonctionne (en principe SANS mot de passe), c’est bon signe.
MAIS les fonctions natives shell de HASS, NE SONT PAS LES MEMES que celles disponibles dans les différents addons (et différentes selon les addons). Autrement dit ce qui fonctionne dans un terminal, peut ne pas fonctionner en YAML
La particularité de SWT est de pouvoir se mettre exactement à la place de HASS, avec : docker exec -it homeassistant bash
Donc dans SWT :
docker exec -it homeassistant bash
bash-5.1# ssh ha@192.168.xxx.yyy -i /config/_ssh/id_rsa 'sensors'
Notons le changement de prompt.
Pour sortir: exit
.
Si ça fonctionne ici on peut passer au YAML.
On crée une shell_command
:
shell_command:
test_ssh: ssh ha@192.168.xxx.yyy -i /config/_ssh/id_rsa "sensors" > /config/test_de_sensors.txt
! IL FAUT REBOOTER HA POUR QUE LA COMMANDE SOIT VISIBLE !
Puis dans DEVELOPPER TOOLS > SERVICE > on tape la commande de test : test_ssh
& bouton valider ( ! CE BOUTON MONTRE TOUJOURS OK MEME EN CAS D ERREUR !)
Si tout c’est bien passé on a un nouveau fichier : test_de_sensors.txt dans /config/.
Voilà, si ça peut aider…
@golfvert Merci
PS ATTENTION vous allez bricoler un serveur, ne vous lancez la dedans que si vous savez ce que vous faites, et que vous vous sentez capables de réparer en cas de problèmes !
PS1 Attention à la syntaxe !
PS2 pour ces tests j’utilise DEBIAN + HA SUPERVISED et en réalité la machine distante (cible) est la même machine physique, mais avec un autre utilisateur.