SSH z HA do innego hosta

Kojarzy może ktoś czy da się wysyłać komendy SSH do hosta innego niż ten na którym jest ha i połączyć to z automatyzacją? Tzn jak czujnik wykryje ruch do wysłać komendę SSH do jakiegoś urządzenia .

Bez problemu, piszesz skrypt z połączeniem przez ssh do innego hosta a wywyłanie tego skryptu robisz w automatyzacjach.

A jakiś wzór lub link jak to ma wyglądać mógłbyś podać ?

Można też inaczej, korzystając z service shell_command:

shell_command:
   remote_shutdown: ssh -i /config/ssh_keys/id_rsa -o 'StrictHostKeyChecking=no' pi@192.168.1.237 sudo /sbin/shutdown -h now

Tutaj wydaje mi się, ze jest dobry opis jak sobie z tym poradzic:

Niestety dzisiaj ani jutro nie dam rady tego odtworzyć u siebie w środowisku, w poniedziałek będę to wstanie zrobić, czytałem o tym sporo ale nie miałem potrzeby skorzystać, teraz sie pojawiła :wink:
Jak się z tym do tego czasu uporasz, daj znać żebym nie tracił czasu na rzeczy wynalezione.

Wielkie dzięki za linka :slight_smile:

Aby wykonać komendę poprzez ssh na zdalnym hoście korzystając z HA musisz zalogować się do HA po ssh:

i wykonać poniższe punkty:

  1. wygenerować klucze, w tym celu wydajesz polecenie:
    ssh-keygen -t rsa
    co spowoduje wygenerowanie pary kluczy (prywatny: id_rsa, publiczny: id_rsa.pub) w katalogu /root/.ssh/ (-> /data/.ssh)
  2. skopiować klucz publiczny na zdalny host - dodać klucz publiczny do authorized_keys, możesz skorzystać z bardzo pomocnego polecenia:
    ssh-copy-id uzytkownik@zdalny_host
    zalogowanie bedzie jeszcze wymagało podania hasła.
  3. zweryfikować czy wszystko zostało poprawnie skonfigurowane:
    ssh uzytkownik@zdalny_host
    zalogowałes się do zdalnego hosta bez podawania hasła, działa :slight_smile:, możesz wylogować się ze zdalnego_hosta poleceniem exit
  4. umieścić klucze w dostępnym dla HA katalogu, w tym celu tworzysz katalog np. /config/.ssh:
    mkdir /config/.ssh
    i tam kopiujesz klucze:
    cp /data/.ssh/id_rsa* /config/.ssh/
  5. po raz kolejny zweryfikować czy konfiguracja jest poprawna:
    ssh -i /config/.ssh/id_rsa uzytkownik@zdalny_host polecenie_do_wykonania
    zalogowałes się po raz kolejny do zdalnego hosta bez podawania hasła i wykonałes komendę poprzez ssh na zdalnym hoście, działa :slight_smile:.

Dopiero po poprawnym wykonaniu powyższych punktów możesz to samo zrobić korzystając z HA, w tym celu musisz:

  • dodać do konfiguracji HA polecenie jakie chcesz wykonać na zdalnym przy pomocy shell_command:

    # Example configuration.yaml entry
    # Exposes service shell_command.host_komenda
    shell_command:
      host_komenda: ssh -i /config/.ssh/id_rsa -o StrictHostKeyChecking=no uzytkownik@zdalny_host polecenie_do_wykonania  
    
  • po restarcie HA będziesz miał dostępną nową usługę :

    image

    którą możesz wykorzystać w automatyzacjach.

Wykonywane komendy po ssh możesz także wykorzystać w konfiguracji switch, szczegóły w dokumentacji https://www.home-assistant.io/integrations/switch.command_line/

Dokładne wytlumaczenie co się dzieje w pkt 1 i 2 znajdziesz na stronie https://kb.iu.edu/d/aews.

Jeżeli coś jest nie jasne, proszę o komentarze, instrukcja zostanie uzupełniona i poprawiona.

@macek dzieki wielkie za instrukcję, dzięki twojej pomocy zagłębiłem się w temat.
U mnie troszke inaczej to wygląda bo mam HA w dockerze ale logika taka sama.
Bezpośrednio z kontenera docker HA też można użyć ssh jednak HA ma dostęp tylko do “/config” i “/” root directory jedynie kontenera a nie całego hosta więc trzeba wykonać następujące kroki:

  1. przenieść klucz prywatny id_rsa z /home/user/.ssh przenieść do /lokalizacja_contenera/klucze_ssh/.
    np.
    cp /home/pi/.ssh/id_rsa ./home/pi/docker/home-assistant/config/klucze_ssh/id_rsa

Na host logujemy się kluczem jako root dzięki czemu będziemy mogli wykonywać wszelkie komendy, nie da sie zalogować jako user i wykonywać komend sudo ponieważ nie mamy jak wpsać hasła (chyba że jest jakaś metoda o ktorej nie wiem)
Aby logować się jako root na hoście na który chcemy wysłać komendy trzeba oczywiście dadać klucz publiczny do authorized_keys można użyć komendy którą podał @macek
ssh-copy-id root@zdalny_host
albo zlogować się jako root np. użyć nano.

Aby używać komend ssh z UI są dwie metody shell_command jako serice albo cmmand_line jako switch takjak wspomniał @macek.
U mnie wgląda to tak:

switch:
  - platform: command_line
    switches:
      restart_tvheadend:
        command_on: "ssh -i /config/klucze_ssh/id_rsa -o StrictHostKeyChecking=no root@192.168.8.14 docker restart tvheadend"
        command_off: "ssh -i /config/klucze_ssh/id_rsa -o StrictHostKeyChecking=no root@192.168.8.14 docker restart tvheadend"
      restart_home_assistant:
        command_on: "ssh -i /config/klucze_ssh/id_rsa -o StrictHostKeyChecking=no root@192.168.8.14 docker restart home-assistant"
        command_off: "ssh -i /config/klucze_ssh/id_rsa -o StrictHostKeyChecking=no root@192.168.8.14 docker restart home-assistant"

    shell_command:
        restart_tvh: ssh -i/config/klucze_ssh/id_rsa -o StrictHostKeyChecking=no root@192.168.8.14 docker restart tvheadend
        restart_ha: ssh -i /config/klucze_ssh/id_rsa -o StrictHostKeyChecking=no root@192.168.8.14 docker restart home-assistant

lokalizacja /config to ściażka -v z komendy docker przy stawianiu kontenera czyli w moim przypadku główny katalog HA punkt montowania plików kontenera

Oczywiście, że się da, to jest linux :slight_smile:. Opisze wszystko dokładnie tylko muszę znaleźć trochę wolnego czasu.

Jak ta konfiguracja wiglda u Ciebie dzisiaj?
mam may problem z przerobieniem swicha na command_line (używany w nowszej wersji)

Stary kod:

#switch:
#  - platform: command_line
#    switches:
#      pihole1_group_111:
#        friendly_name: "Pi-Hole - Block Group 1"
#        value_template: '{{ value == "1" }}'
#        command_on: ssh -o UserKnownHostsFile=/config/.ssh/knownhosts -o StrictHostKeyChecking=no -i /config/.ssh/id_rsa pi@192.168.1.245 'sudo /home/pi/script/PiHole_Group_Block.sh Group1'
#        command_off: !secret pihole_gr1_off
#        command_state: !secret pihole_gr1_state

Nowy powinien zaczynać się od

command_line:
  - switch:
    name: "Pi-Hole - Block Group 1"
    command_on:

Przy kompilacji pojawia się błąd Nie udało się ponownie wczytać konfiguracji

Cannot quick reload all YAML configurations because the configuration is not valid: Invalid config for [command_line]: expected a dictionary for dictionary value @ data[‘command_line’][0][‘switch’]. Got None extra keys not allowed @ data[‘command_line’][0][‘command_off’]. Got "ssh -o

Nie wiem jak powinna wyglądać poprawna składnia?

Tak jak w dokumentacji

(id i friendly_name odeszły do przeszłości, co uwzględniłeś, nie wiem jak się zachowają nazwy z myślnikami po ześlimakowaniu)
za płytkie wcięcia w 3 i 4 linii, pomijam resztę, bo poprzednio miałeś coś innego w tych samych polach, a wystarczy copy+paste + przesunąć o parę spacji

command_line:
  - switch:
      name: "Pi-Hole - Block Group 1"
      command_on:

PS czas na zmianę składni masz do wersji <2023.8.0 (zwykle było 6 miesięcy od ogłoszenia zmian, ale uwzględnianie tego w breaking changes i w naprawach na 2 miesiące przed terminem mogłoby być dobrą tradycją)

1 polubienie

Lub include w configuration.yaml

command_line: !include command_line.yaml