Shell command | Run LINUX programme ... A l'aide

Bonjour à tous
J ai mis a jour aujourd’hui un lecteur de température en utilisant un programme indépendant UNIX.
J ai tenté de suivre le post:

mais j ai une erreur 127 avec donc un fichier généré vide.

sensor:
  - platform: command_line
    name: sensors_read 
    command: sensors -j > packages/sensors_json.txt
    scan_interval: 30
    command_timeout: 30

En explorant le web j’ai trouvé:

et

J’avoue que je ne comprends qu’un mot sur dix :pensive:
J ai peut etre compris l idee générale:
Pour accéder à un programme quelqu’il soit on doit passer par ssh avec une authentification, qui dépend d’une clef que l’on doit générer.
En pratique, je suis perdu…
J’ai 2 accès à HA qui permettraient d’avancer, mais je ne sais pas comment faire:

  • vscode > terminal
  • et depuis un poste distant (w7) mobaXterm > connection en root sur la machine hébergeur de HA

DONC comment générer une clef SSH ?
OU la copier ?
COMMENT l inclure dans une SHELL_COMMAND ?
Je ne connais quasiment rien à UNIX…
A l’aide.

Salut,

Là il va falloir remettre les choses dans le contexte, j’ai l’impression que tu mélange 2 chose, une ligne de commande sur la machine locale et un appel d’une commande à distance au travers de SSH.

Le plus important à savoir c’est:

  • quel type d’installation de HA tu as?
  • quel type de machine?
  • Ton script/programme lecteur de température, il se trouve où, sur quelle machine?

@AlexHass
le script:

  - platform: command_line
    name: sensors_read #Pick a name for the sensor.
    command: sensors -j > packages/sensors_json.json
    scan_interval: 30
    command_timeout: 30

c est sensors -j qui ne marche pas
quand je fais sensors -j en accès root ça fonctionne bien

root@HAcq:/# sensors -j
{
   "it8772-isa-0a30":{
      "Adapter": "ISA adapter",
      "in0":{
         "in0_input": 2.220,
         "in0_min": 0.456,
         "in0_max": 0.588,
         "in0_alarm": 1.000
      },
      "in1":{
         "in1_input": 2.220,
         "in1_min": 2.472,
         "in1_max": 0.900,
         "in1_alarm": 1.000
      },
...
      "temp3":{
         "temp3_input": 43.000,
         "temp3_max": 14.000,
         "temp3_min": -124.000,
         "temp3_alarm": 1.000,
         "temp3_type": 0.000,
         "temp3_offset": 0.000
      },
      "intrusion0":{
         "intrusion0_alarm": 1.000
      }
   },
   "k10temp-pci-00c3":{
      "Adapter": "PCI adapter",
      "temp1":{
         "temp1_input": 43.000,
         "temp1_max": 70.000,
         "temp1_crit": 100.000,
         "temp1_crit_hyst": 97.000
      }
   }
}
root@HAcq:/#

type de machine & HA:

arch: amd64
channel: stable
docker: 20.10.20
features:
- reboot
- shutdown
- services
- network
- hostname
- timedate
- os_agent
- resolved
hassos: null
homeassistant: 2022.9.5
hostname: HAcq
logging: info
machine: qemux86-64
operating_system: Debian GNU/Linux 11 (bullseye)
state: running
supervisor: 2022.11.2
supported: false
supported_arch:
- amd64
- i386
timezone: Europe/Paris

DEBIAN + HA supervisor

La machine:

Ordinateurs de bureau HP et Compaq - Caractéristiques
de la carte mère, H-AFT1-uDTX-1 (Adina2)
: Carte mère Adina2
photos de la carte mère
• Fabricant : Pégatron
• Nom de la carte mère du fabricant : H-AFT1-uDTX-1
• Nom HP/Compaq : Adina2

En fait c’est bien le problème:
ce qui marche en ligne de commande en root est bloqué en ligne de commande en passant par HA.
EDIT
pour le problème initial de lecture de température, j ai résolu le problème en contournant cette limitation. Mais sur le fond, la question reste entière: comment utiliser un programme extérieur à HA avec command_line ?

Salut,

Command_line ça marche comme tu l’as fait.
Mais je pense que cétait plus une soucis d’autorisation, comme ça marche Root.
Je ne sais pas quel utilisateur est utilisé par HA Supervised, mais cet utilisateur doit soit pouvoir exécuter la commande, soit être autorisé à faire un « sudo »

Sinon si tout ce que tu voulais c’est trouver la température de to système.

Sur un PC tu peux directement faire ça: (le numéro de thermal_zone peut changer…)

  - platform: command_line
    name: CPU Temperature
    command: "cat /sys/class/thermal/thermal_zone1/temp"
    unit_of_measurement: "°C"
    value_template: "{{ value | multiply(0.001) | round(1) }}"

ou sinon pour plus d’infos système il y a l’intégration:

EDIT: OK je viens de voir qu’il y a déjà un 2eme sujet similaire de ta part :slight_smile:

@AlexHass
Oui j ai résolu le problème immédiat de la température, avec le meme style de sensor que tu écris, en modifiant le fichier à lire.
C’est en cherchant sur ce sujet que j ai été bloqué par les droits , puisque donc sensors fonctionne en ligne de commande sur un terminal en root, mais pas à partir de HA, avec Command_line.
D’ou ce nouveau sujet plus général:
Comment lancer un programme UNIX à partir de HA ?
Ou bien Comment s affranchir des erreurs 127 de droits d exécution ?

Alors déjà c’est Linux pas Unix ici :wink: . La différence peut-être ténue, mais importante pour la solution à apporter surtout si tu cherches sur google…

Après comme je disais commande_line exécute la commande que tu lui donnes directement, mais le résultat varie suivant le contexte.

Suivant ton type d’installation, la commande est exécutée dans un container ou sur le système hôte et c’est là qu’il faut comprendre quel est ton cas, quel utilisateur est utilisé et quels sont ses droits.

Si le programme nécessite d’être root pour s’exécuter, il faut comme je disais plus haut que le user utilisé par HA ait le droit de faire un sudo pour pouvoir lancer le programme en tant que root.

Et la commande sera alors:
« sudo sensors -j > packages/sensors_json.json »

Mais pour que ça marche le faut savoir quel est ce user et vérifier qu’il soit listé dans /etc/sudoers.

!Disclaimer! Je ne sais pas si c’est la solution recommandée par des admin sys linux dans un contexte de sécurité professionnelle. Merci de me corriger si ça choque quelqu’un :wink:

Merci de reprendre la conversation.
Je connais très peu LINUX.
De fait j’ai un peu oublié comment j ai installé HA :pensive:
D après mes notes:

  • installation de DEBIAN puis:
  • wget https://github.com/home-assistant/os-agent/releases/latest/download/os-agent_1.2.2_linux_x86_64.deb
    dpkg -i os-agent_1.2.2_linux_x86_64.deb
  • wget https://github.com/home-assistant/supervised-installer/releases/latest/download/homeassistant-supervised.deb
    dpkg -i homeassistant-supervised.deb

Donc, je pense DEBIAN + HA SUPERVISED.
Ca parait cohérent ?
Avec donc 2 accès à la machine a partir d un poste window distant.

  • soit par MOBAXTERM en root
  • soit par l interface (CHROME) avec VStudio et son TERMINAL
    Tous les posts demandent Terminal & SSH que j ai rajouté, mais je pense que le terminal de VStudio est le même, non ?

en pratique, dans l’un ou l’autre des terminaux (Terminal & SSH ou VStudio):

sudo sensors -j > packages/sensors_json.json

donne:
command not found: sudo
:face_with_spiral_eyes:

command not found: sudo

Le package ‹ sudo › est-il installé ?
tommy@server:~$ which sudo
/usr/bin/sudo
tommy@server:~$ dpkg -S /usr/bin/sudo
sudo: /usr/bin/sudo

La commande ‹ dpkg -l sudo › t’indiquera également si le package est installé.


Mais pour que ça marche le faut savoir quel est ce user et vérifier qu’il soit listé dans /etc/sudoers.

J’ai une préférence pour positionner les droits dans des fichiers présents dans le dossier ‹ /etc/sudoers.d ›

Salut,
Va falloir s’y mettre car une installation en supervised nécessite tout de même quelques connaissances car il faudra maintenir ta Debian à jour.

Alors là en revanche c’et ptet normal, les terminaux que tu utilise donnent un shell qui se trouve dans les containers docker repectifs. Et ton lm-sensors je ne pense pas qu’il soit accessible dans les containers.

Mais maintenant, petit conseil pour HA, essaye plutôt de faire les choses avec des intégrations et les fonctionnalités fournies par HA, comme ça tu n’as pas trop de dépendances avec la machine hôte, il n’y a vraiment pas besoin de commandes shell normalement.

@Tommy
c est simple, je comprends 1 mot sur 10 :scream:
si je fais (terminal distant > root):


root@HAcq:/# which sudo
/usr/bin/sudo

et:

root@HAcq:/# dpkg -l sudo
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements
|/ Err?=(aucune)/besoin Réinstallation (État,Err: majuscule=mauvais)
||/ Nom            Version      Architecture Description
+++-==============-============-============-=======================================================
ii  sudo           1.9.5p2-3    amd64        Provide limited super user privileges to specific users

en fait je me suis déjà servi de sudo et ca marche.
MAIS PAS dans le terminal de HA (d’après ce que j’ai lu, c’est normal):

 /config which sudo
sudo not found

C’est la que je ne comprends rien !

@AlexHass
OK pour restreindre à HA, mais par exemple pour la température du processeur, c est pour moi nécessaire d’installer un autre programme (lm-sensor).
Je comprends bien, alors la dépendance par rapport à la machine hote, mais dans mon cas je n’en ai qu’une seule, et probablement pas de changement à prévoir avant quelques temps.
Je ne cherche pas non plus à multiplier les programmes externes, c’est juste frustrant de pas pouvoir accéder à la bibliothèque de programmes linux (si besoin).

Oui bien sûr moi aussi mon HA tourne sur un PC et la température du proc, je dois la récupérer avec une commande shell, celle que je t’ai partagée avant. A part celle-là je n’en ai pas eu besoin d’autre depuis plusieurs années. :+1:

C’est effectivement normal.
Mais si tu entres sensors -j > packages/sensors_json.json dans le terminal de HA tu devrais aussi avoir un command not found je pense.
C’est sur l’autre terminal, sur debian, qu’il faut le lancer.
Maintenant si tu ne maitrises pas trop toutes ces notions, ça ne va pas être évident :wink:

J’ai essayé la procédure pour l’installation/configuration de la commande ‹ sensors ›.

Je rencontre le même problème (erreur 127).
Ce qui est normal dans mon cas, puisque HA est démarré dans un container docker.

Pour utiliser la commande ‹ sensors ›, il faudrait donc modifier l’image docker HA pour installer le package ‹ sensors ›.

Sinon, peut-être plus simple:

  • Depuis l’hôte debian, lancer la commande ‹ sensors › à intervalle régulier et rediriger les informations dans un fichier (commande ‹ sensors -j > sensors.txt ›) donc.

  • Dans le fichier ‹ configuration.yaml ›, lire le contenu du fichier généré et l’afficher sur le dashboard (et c’est là que je n’ai pas réussi à afficher les données (problème syntaxe json ?))

1 « J'aime »

On ne peut pas. Si on comprend « extérieur » comme n’étant pas dans le container de HA mais sur la machine linux ou est installé le dit container.
C’est le principe de base des containers d’isoler le contexte d’exécution de celui de la machine hôte.

Si je pends un exemple de la vie courante. Tu es dans ta salle de bain (le container) tu veux allumer la cuisinière (qui logiquement est dans le container cuisine), tu ne peux pas.
Là, c’est la même chose.

La façon de communiquer avec l’hôte local c’est de faire du SSH vers cet hôte.

Il me semble que ta méthode d’installation, debian + HA Supervised ne correspond pas à ton besoin (tes connaissances).
Voir Changement de plate-forme

Dans ta situation, HA OS me semblerait plus adapté.

2 « J'aime »

@Tommy
Exact j’avais pensé à ça, mais il y a moyen de faire tourner sensors en tache de fond:

/etc/init.d/kmod start

donc le fichier à lire est mis à jour régulièrement
D’autre part (en root)

root@HAcq:~# sensors -j > /usr/share/hassio/homeassistant/packages/sensors_json.json

donne un beau fichier JSON, bien formaté:

{
   "it8772-isa-0a30":{
      "Adapter": "ISA adapter",
      "in0":{
         "in0_input": 2.220,
         "in0_min": 0.456,
         "in0_max": 0.588,
         "in0_alarm": 1.000
      },
      "in1":{
         "in1_input": 2.220,
         "in1_min": 2.472,
         "in1_max": 0.900,
         "in1_alarm": 1.000
      },
      "in2":{
         "in2_input": 3.000,
         "in2_min": 2.280,
         "in2_max": 1.620,
         "in2_alarm": 1.000
      },
      "in3":{
         "in3_input": 2.940,
         "in3_min": 1.020,
         "in3_max": 0.120,
         "in3_alarm": 1.000
      },
      "in4":{
         "in4_input": 2.220,
         "in4_min": 1.620,
         "in4_max": 1.392,
         "in4_alarm": 1.000
      },
      "in5":{
         "in5_input": 2.220,
         "in5_min": 2.688,
         "in5_max": 0.000,
         "in5_alarm": 1.000
      },
      "in6":{
         "in6_input": 2.220,
         "in6_min": 2.088,
         "in6_max": 0.504,
         "in6_alarm": 1.000
      },
      "3VSB":{
         "in7_input": 3.264,
         "in7_min": 0.624,
         "in7_max": 4.320,
         "in7_alarm": 0.000
      },
      "Vbat":{
         "in8_input": 3.288
      },
      "fan1":{
         "fan1_input": 0.000,
         "fan1_min": 27.000,
         "fan1_alarm": 1.000
      },
      "fan2":{
         "fan2_input": 0.000,
         "fan2_min": 14.000,
         "fan2_alarm": 1.000
      },
      "fan3":{
         "fan3_input": 2848.000,
         "fan3_min": 24.000,
         "fan3_alarm": 0.000
      },
      "temp1":{
         "temp1_input": -70.000,
         "temp1_max": -99.000,
         "temp1_min": 74.000,
         "temp1_alarm": 1.000,
         "temp1_type": 3.000,
         "temp1_offset": 0.000
      },
      "temp2":{
         "temp2_input": -70.000,
         "temp2_max": 5.000,
         "temp2_min": -117.000,
         "temp2_alarm": 0.000,
         "temp2_type": 3.000,
         "temp2_offset": 0.000
      },
      "temp3":{
         "temp3_input": 42.000,
         "temp3_max": 14.000,
         "temp3_min": -124.000,
         "temp3_alarm": 1.000,
         "temp3_type": 0.000,
         "temp3_offset": 0.000
      },
      "intrusion0":{
         "intrusion0_alarm": 1.000
      }
   },
   "k10temp-pci-00c3":{
      "Adapter": "PCI adapter",
      "temp1":{
         "temp1_input": 42.875,
         "temp1_max": 70.000,
         "temp1_crit": 100.000,
         "temp1_crit_hyst": 97.000
      }
   }
}

je n ai pas poussé plus loin la lecture par yaml, puisque on est bloqué dans l exécution de la command_line, et pour l heure la lecture du fichier température dans un sensor de HA fonctionne.
@golfvert @AlexHass
J’ai bien compris ça, je cherche à comprendre justement, la transmission d’un container à un autre par SSH (en passant par HA).

PS: J’ai bien appris, dans l’ordre, l assembleur, le BATCH, le Basic, le Pascal, le C (pas trop !), VBA, LUA, AHK, je pourrais bien me mettre à LINUX.

Cesser d’apprendre, c’est commencer à vieillir.

Voici un lien qui explique le fonctionnement de SSH en clé publique/privée.

1 « J'aime »

Merci, je vais lire ça.

Plus on rate, plus on a de chances de réussir. :smirk: