Wysyłamy komendy po SSH z Asystenta Domowego

Inspirację do założenia tego tematu dał @macek, przy okazji moich i @Cino111 PYTAŃ odnośnie możliwości sterowania z bramki komputerem z systemem Linux.
Pojawiły się linki do ciekawych opcji korzystających z SSH oraz usługi w HA jaką jest shell_command.
Na bramce mamy serwer i klienta SSH oraz usługę ais_shell_command.execute_command

Dla chętnych, trochę wprowadzenia w temat:
SSH z HA do innego hosta (https://forum.arturhome.pl/t/ssh-z-ha-do-innego-hosta/476)
oraz
Running a shell command from Home Assistant to remote linux PC

Z zebranych informacji, udało mi się skutecznie dodać klucz SSH dla połączenia bramki z komputerem pod Linuxem.

Wygenerowany na komputerze publiczny klucz SSH, dzięki linuxowej funkcji:

ssh-copy-id username@remote-user-IP

Zaimportowałem na bramkę do katalogu:

/data/data/pl.sviete.dom/files/home/.ssh/id_rsa.pub

@macek - proszę o pomoc w prawidłowym napisaniu wsadu dla danych usługi ais_shell_command.execute_command pod linuxowe komendy typu shutdown -h now.

Kolejnym krokiem będzie wykorzystanie funkcji:

1 polubienie

Takie polecenie shutdown wymaga praw roota a zdalne wykonywanie połączenia ssh z uprawnieniami roota jest domyślnie w systemie blokowane ze względów bezpieczeństwa. Bez problemu da się jednak tak skonfigurować system aby bo funkcjonalnie i bezpiecznie.
@Cezary.K dla potwierdzenia: chcesz z bramki AIS poprzez platform: command_line zrobić shutdown zdalnego linuxa?

Tak - zdarza mi się pozostawić w warsztacie włączony komputer. Chciałbym móc go wyłączyć komendą z czystego lenistwa. Mógłbym podpiąć smart gniazdko i odcinać zasilanie ale w końcu to komputer a nie żelazko.

Przy okazji - jak bezpiecznie wyłączacie bramki (czasami może być taka rzadka potrzeba)? Bo shutdown nie działa; działa tylko halt a raczej to chyba nie jest ok… :slightly_smiling_face:

@Cezary.K co prawda nie używam AIS Command, tylko shell_command, ale to pewnie działa tak samo:
‘ssh stravi@192.168.1.15 sudo mkdir testdir’

Czy masz na myśli edycję tego pliku?

@Stravi - komendy takie jak podałeś działają. Jedyny problem jest w tym, że należy podawać za każdym razem hasło dla sudo.

Oj to coś z kluczem masz nie tak.

Klucz jest OK. Tak jak pisał @macek, komendy do powłoki systemu wymagają dostępu root, a taki jest wyłączony przy połączeniu SSH.
Dodałem wiersz uprawniający użytkownika cezary, do wykonania bez podawania hasła, komendy shutdown
Z konsoli bramki działa…

Teraz pozostaje usługa ais_shell_command.execute_command

Edit:
Wpis w polu usługi działa command: ssh cezary@192.168.2.52 sudo shutdown -r now
ale
komputer się restartuje zamiast pozostać wyłączony… :thinking:
O co tu chodzi?

Użyj
shutdown -h now

1 polubienie

@Angust - dzięki. Tak przypuszczałem, że popełniłem błąd z przedszkola Linux.
Dziękuję wszystkim, za inspirację i podpowiedzi. Satysfakcja jest, ponieważ mam gotowy, działający przycisk dla bezpiecznego wyłączenia komputera :partying_face:

tap_action:
  action: call-service
  service: ais_shell_command.execute_command
  service_data:
    command: ssh cezary@192.168.2.52 sudo shutdown -h now
show_state: false
entity: input_boolean.wylacz_dell

Zrob z tego sensor switch i dopisz włączanie ON komputera przez Wake On LAN :wink:

Update: moja pomyłka, chodziło o switch.

Sensor - czego?
Czy masz na myśli wykorzystanie połączenia LAN do badania stanu ON / OFF?
Ten komputer używam jako roboczy, warsztatowy desktop. Więc włączanie przez WOL nie jest mi do niczego potrzebne (na ten moment). Zwłaszcza, ze pod Linux uruchamia się w 3s (no może do 6-9s z przywracaniem kart przeglądarki).
W tej kwestii pozostawię temat otwarty dla innych…

Pewnie chodzi nie o sensor tylko switch. Resztę rozpracowałem odpowiednio :slight_smile:
Jakby ktoś szukał to pod turn_on i pod turn_off w pliku konfiguracyjnym switch’a trzeba podać odpowiednie wywołania serwisów (które można przetestować za pomocą narzędzi deweloperskich).

To jedziemy z Wake on LAN pod Linuxem (Debian/Ubuntu/Mint).
Czy ktoś podpowie jak na stałe ustawić Wake-on: g (czyli włączone) w ethtool?
Dodam, że teoretycznie w BIOS Dell’a wszystko włączone. Po restarcie mam ponownie Wake-on: d.

cezary@cezary-OptiPlex-3020 ~> sudo ethtool enp2s0
Settings for enp2s0:
	Supported ports: [ TP MII ]
	Supported link modes:   10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Supported pause frame use: Symmetric Receive-only
	Supports auto-negotiation: Yes
	Supported FEC modes: Not reported
	Advertised link modes:  10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Advertised pause frame use: Symmetric Receive-only
	Advertised auto-negotiation: Yes
	Advertised FEC modes: Not reported
	Link partner advertised link modes:  10baseT/Half 10baseT/Full 
	                                     100baseT/Half 100baseT/Full 
	                                     1000baseT/Full 
	Link partner advertised pause frame use: No
	Link partner advertised auto-negotiation: Yes
	Link partner advertised FEC modes: Not reported
	Speed: 1000Mb/s
	Duplex: Full
	Port: MII
	PHYAD: 0
	Transceiver: internal
	Auto-negotiation: on
	Supports Wake-on: pumbg
	Wake-on: d
	Current message level: 0x00000033 (51)
			       drv probe ifdown ifup
	Link detected: yes
cezary@cezary-OptiPlex-3020 ~> sudo ethtool -s enp2s0 wol g
cezary@cezary-OptiPlex-3020 ~> sudo ethtool enp2s0
Settings for enp2s0:
	Supported ports: [ TP MII ]
	Supported link modes:   10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Supported pause frame use: Symmetric Receive-only
	Supports auto-negotiation: Yes
	Supported FEC modes: Not reported
	Advertised link modes:  10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Advertised pause frame use: Symmetric Receive-only
	Advertised auto-negotiation: Yes
	Advertised FEC modes: Not reported
	Link partner advertised link modes:  10baseT/Half 10baseT/Full 
	                                     100baseT/Half 100baseT/Full 
	                                     1000baseT/Full 
	Link partner advertised pause frame use: No
	Link partner advertised auto-negotiation: Yes
	Link partner advertised FEC modes: Not reported
	Speed: 1000Mb/s
	Duplex: Full
	Port: MII
	PHYAD: 0
	Transceiver: internal
	Auto-negotiation: on
	Supports Wake-on: pumbg
	Wake-on: g
	Current message level: 0x00000033 (51)
			       drv probe ifdown ifup
	Link detected: yes
cezary@cezary-OptiPlex-3020 ~> 

EDIT:
Mam to…
Dla Mint wykonałem dopisując usługę pod systemctl

[Unit]
Description=Wake-on-LAN (%i)
Requires=network.target
After=network.target

[Service]
ExecStart=/sbin/ethtool -s %i wol g
Type=oneshot

[Install]
WantedBy=multi-user.target

Po włączeniu usługi komendą sudo systemctl enable wol@enp2s0 mam włączone domyślnie WoL po restarcie komputera.

Po dodaniu w pliku konfiguracji wiersza wake_on_lan:, usługa wake_on_lan.send_magic_packet komputer włącza się.

Dodałem wpis switch - lecz zdaje się nie działać. Przełącznik pokazuje ON - nawet gdy komputer wyłączony.
W wierszu host wpisałem adres bramki, broadcast_address - podałem adres włączanego komputera.

wake_on_lan:
  
switch:
  - platform: wake_on_lan
    mac: "C8:1F:66:2B:EC:E1"
    name: "Dell"
    host: "192.168.2.192"
    broadcast_address: "192.168.2.52"

obraz

Coś robię nie tak?
@Stravi - jak mam już działające dwie usługi, to może podrzucisz konfigurację dla przełącznika na nich?
Chciałem mieć jeszcze odczyt stanu ON/OFF komputera…

Mogę skorzystać z integracji z moim routerem i z niego wyciągnąć stan danego klienta:

Tak na sucho pisane bez testowania. Jutro możemy to dopracować :slight_smile:

   switch:
      - platform: template
        switches:
          linux_pc:
            value_template: "{{ is_state('sensor.cezary_optiplex_3020', 'home') }}"
            turn_on:
              service: wake_on_lan.send_magic_packet
              data:
                mac: 'C8:1F:66:2B:EC:E1'
            turn_off:
              service: ais_shell_command.execute_command
              data:
                command: ssh cezary@192.168.2.52 sudo shutdown -h now
1 polubienie

@Stravi - dzięki wielkie, turn_on i turn_off działają super ale status z integracji z router’em Asus nie nadaje się… po prostu przy włączonej opcji WoL zawsze pokazuje home ponieważ połączenie LAN nie jest zrywane a karta czuwa. Pomyślę nad innym sensorem.

value_template: "{{ is_state('sensor.cezary_optiplex_3020', 'home') }}"

1 polubienie