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.