Command Line avec ssh sur raspberry-pi distant

Command Line avec ssh

Je vais partager comment je fais pour lancer des commandes ssh sur des Raspberry-Pi ou autre machines distantes sur le réseau (j’ai une armée de RPi chez moi :slight_smile: )

Je me suis inspirer sur des info. trouvées aussi sur ce forum. Mais je voulais faire une procédure complète ici.

N’hésite pas à me dire si il est possible de faire plus simple ou à corriger les boullettes.

Mon installation est un Home Assistant Supervised avec l’Add-On terminal.

Sur Add-On terminal,

  • Génèrer des clés ssh pou HA (à ne faire qu’une seule fois):
    mkdir -p /config/ssh_keys
    ssh-keygen -t rsa -f /config/ssh_keys/id_rsa -q -P ""
  • Transférer la clé public de HA vers l’hôte distant (à faire pour chaque hôte distant):
    ssh-copy-id -i /config/ssh_keys/id_rsa.pub  pi@192.168.100.5
=> Valider par 'yes'
=> Entrer le mot de passe user 'pi' du Raspberry-Pi distant
  • Tester si une commande ssh passe sur l’ôte distant:
    ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no pi@192.168.100.5 'date'
=> Doit retrourner la date sans demander de mot de passe

Exemple de * Command line Switch* à ajouter dans switch.yaml:

 - platform: command_line
   switches:
     lumiere_salon:
       command_on: ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no pi@192.168.100.5 /home/dan/bin/setchacon.sh salon on
       command_off: ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no pi@192.168.100.5 /home/dan/bin/setchacon.sh salon off

Pour tester, j’ai mis le mode debug pour les command_line

logger:
  default: info
  logs:
    homeassistant.components.mqtt: info
    homeassistant.components.shell_command: debug

Cela permet de voir si la commande passe:

2021-02-04 18:57:29 INFO (SyncWorker_5) [homeassistant.components.command_line.switch] Running command: ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o Str
ictHostKeyChecking=no pi@192.168.100.5 /home/dan/bin/setchacon.sh salon on
2021-02-04 18:57:36 INFO (SyncWorker_5) [homeassistant.components.command_line.switch] Running command: ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o Str
ictHostKeyChecking=no pi@192.168.100.5 /home/dan/bin/setchacon.sh salon off

Pour davantage debugger si probleme pour les courageux , je me connecte directement sur le host home-assistant et puis sur le container *homeassistant pour tester ma commande ssh en direct:

$ docker exec -it homeassistant bash
bash-5.0# ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no dan@192.168.100.5 date
Warning: Permanently added '192.168.100.5' (ECDSA) to the list of known hosts.
jeu. 04 févr. 2021 19:25:49 CET

Voilà,

Ma configuration

System Health

version core-2021.2.0
installation_type Home Assistant Supervised
dev false
hassio true
docker true
virtualenv false
python_version 3.8.7
os_name Linux
os_version 5.4.72-v7+
arch armv7l
timezone Europe/Paris
Home Assistant Community Store
GitHub API ok
Github API Calls Remaining 5000
Installed Version 1.10.1
Stage running
Available Repositories 709
Installed Repositories 5
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Hass.io
host_os Raspbian GNU/Linux 10 (buster)
update_channel stable
supervisor_version supervisor-2021.01.7
docker_version 19.03.13
disk_total 62.5 GB
disk_used 13.5 GB
healthy true
supported failed to load: Unsupported
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (8.10.0), File editor (5.2.0), Bitwarden RS (0.6.2), Mosquitto broker (5.1), MariaDB (2.2.1)
Lovelace
dashboards 4
resources 4
views 14
mode storage
3 « J'aime »

Merci pour le partage :+1:

Je l’ai mis dans Tutoriels & Partage - Intégration

Hello @vdomos, oui j’utilise le même principe que toi pour lancer des scripts ssh sur un autre raspberry (allumer old tv, afficher sur ce pi) . Je suis également en supervised. J’ai dû juste rajouter un -p 2222 car le port 22 est déjà réservé au pi supportant HA.
Quels commandes exécutes-tu en plus de salon on off ?

1 « J'aime »

Hello @Christianb233,

Je viens juste de tester cette config sur HA.
j’utilisais une autre méthode ou je générais les clés dans le compte root du container mais qui était perdus à chaque mise à jour.Donc pas très pratique.

Pour l’instant, je gère seulement mes 4 lumières du rch et des prises avec le même script qui pilote un vieux dongle Tellstick pour des modules DIO.

Je vais surement en rajouter d’autres pour reboot ou shutdown des Pi.
Surement d’autres choses que cela va me permettre d’intégrer dans HA.

1 « J'aime »

Merci bien pour le partage. TOP

1 « J'aime »

Bonjour,

Merci pour ce post, je l’utilise pour commander un Raspberry avec Octopi afin de notamment l’éteindre proprement avant d’éteindre la prise et éviter les corruption de la carte SD, j’ai trois commandes qui fonctionnent par contre HA me remonte des erreurs pour deux commandes (reboot et power off) alors que les commandes passent bien !

Command failed: ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no pi@192.168.1.32 sudo /sbin/shutdown -r now

Command failed: ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no pi@192.168.1.32 sudo /sbin/shutdown -h now

switch:
  - platform: command_line
    switches:
      octoprint_serveur_off:
        command_off: ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no pi@192.168.1.32 sudo /sbin/shutdown -h now
        
  - platform: command_line
    switches:
      octoprint_serveur_reboot:
        command_on: ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no pi@192.168.1.32 sudo /sbin/shutdown -r now
        
  - platform: command_line
    switches:
      octoprint_software_reboot:
        command_on: ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no pi@192.168.1.32 sudo /sbin/service octoprint restart

Une piste ?

Merci :slight_smile:

Bonjour,
@xek, peux tu activer le mode debug pour les commande shell comme ceci dans le configuration.yaml:

logger:
  default: info
  logs:
    homeassistant.components.shell_command: debug

ça devrait être plus parlant.

Bonjour @vdomos ,

Je viens d’activer le debug, j’attend juste que mon impression se termine (1h30) et je teste ça, merci :slight_smile:

Simple hypothese,
Le failed vient peut-etre de la commande shutdown -h now qui coupe la connexion ssh et ne permet pas un retour propre de la commande.

possible car avec le debug activé le log est le même…

Command failed: ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [pi@192.168.1.32](mailto:pi@192.168.1.32) sudo /sbin/shutdown -r now

Peut-etre utiliser un script simple à lancer par HA avec un sleep suivi du shutdown pour avoir un retour propre

1 « J'aime »

a étudier, merci, pour l’instant je pense que je vais laisser comme ça.

Hello @Xek
L’hypothèse de @vdomos me plait bien.
Pour tester, tu peux virer le -h now et mettre à la place un

shutdown -h +1

Dans l’absolu, décaler l’arrêt d’une minute, c’est pas dramatique et en plus ça permet aux différents processus ayant récupéré le signal et de s’arrêter proprement

1 « J'aime »

Salut @Pulpy-Luke ,
Bien vu, c’est parfait avec +1 pour le shutdown :wink:
Par contre pour le reboot je vais laisser par défaut car dans l’absolu l’utilisation du reboot reste relativement rare dans mon cas.
Merci

Bonjour vdomos, et merci pour nous avoir partagés tous ces bons conseils
Moi aussi j’ai une armée de Raspberry chez moi, et j’ai suivi ton tuto, et d’autres pour aller récupérer la température de mon Raspberry « Node-Red » et l’afficher sur mon "Raspberry « HomeAssistant ».
J’ai tout configuré les clés publiques comme tu as expliqué et ca fonctionne.

dans configuration.yaml j’ai écris la ligne de commande à passer, et ca ne fonctionne pas. Je reçois une erreur en retour, alors que si je tape la même commande via une commande SSH du terminal intégré de HomeAssistant ou via une commande SSH dans PUTTY, ca fonctionne.

l’erreur est la suivante :
2022-03-17 08:31:05 ERROR (SyncWorker_1) [homeassistant.components.command_line] Command failed: ssh pi@192.168.1.235 ‹ /opt/vc/bin/vcgencmd measure_temp ›

mon configuration.yaml :
sensor :
- platform: command_line
name: Rasp_NodR_CPU_temp
command: « ssh pi@192.168.1.235 ‹ /bin/cat /sys/class/thermal/thermal_zone0/temp › »
unit_of_measurement: « °C »
value_template: « {{ value | multiply(0.001) | round(1) }} »

quelqu’un aurait il une idée pourquoi ca fonctionne en ligne de commande et que ca ne fonctionne pas intégré dans HomeAssistant ?

Bonjour,

@Jippy, il manque des paramètres dans la commande ssh pour que cela passe:

command: "ssh -i /config/ssh_keys/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@IP 'script.sh'"

Il faut le chemin des clés et aussi de ne pas vérifier le hostfile

Merci @vdomos ; ca fonctionne.

J’ai juste mis 2 des parametres sur 3 ; (puisqu’un des trois envoyait un message de warning)
command: "ssh -i /config/ssh_keys/id_rsa -o StrictHostKeyChecking=no pi@192.168.1.235 'cat /sys/class/thermal/thermal_zone0/temp'"

je n’arrive pas à expliquer pourquoi il faut des paramètres supplémentaires dans HomeAssistant alors que la commande passe directe si on la tape dans le terminal ; mais je résultat est là ; merci encore.