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
Jak się z tym do tego czasu uporasz, daj znać żebym nie tracił czasu na rzeczy wynalezione.
Wielkie dzięki za linka
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:
- 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) - 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. - zweryfikować czy wszystko zostało poprawnie skonfigurowane:
ssh uzytkownik@zdalny_host
zalogowałes się do zdalnego hosta bez podawania hasła, działa , możesz wylogować się ze zdalnego_hosta poleceniemexit
- 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/
- 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 .
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ę :
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:
- 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 . 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ą)
Lub include
w configuration.yaml
command_line: !include command_line.yaml