poniedziałek, 19 stycznia 2026

Zdalne wywołanie poleceń w Linuxie (ssh / port knocking / fwknop / shell2http)

Szukałem ostatnio rozwiązania, które pozwoliłoby mi na zdalne wywołanie dowolnego polecenia na jednym z komputerów. 
Docelowy komputer czasami pracuje u mnie po *naście albo *dziesiąt godzin a że jest to ekonomicznie uzasadnione rozwiązanie smart tv to posiada pełnoprawny interfejs graficzny. A Xorg, jak to Xorg, swoje wady ma i często po kilkunastu godzinach pracy po prostu lubi się całkowicie sfreezować (zamrozić / zawiesić) i wówczas pomaga tylko twardy reset. Poszukiwane rozwiązanie problemu i docelowy zamysł był taki, żeby gui na czas wyjścia z domu wyłączyć (o ile nic się nie renderuje), a można to rozwiązać na cztery sposoby.

Pierwszy sposób to ssh. A zrobimy to w taki sposób:
ssh user@pc 'sudo systemctl stop lightdm.service; sudo chvt 1'
Powyższa komenda zatrzymuje nam menedżera logowania, a tty przełącza z 7 (domyślnie dla Debiana) na 1. Gdybyśmy chcieli tylko podejrzeć, czy menedżer logowania się wyłączył to możemy włączyć sprawdzić np htopem:
ssh -t user@pc htop
Po zamknięciu htopa oczywiście zostaniemy rozłączeni.


Drugim sposobem jest tzw port knocking. Metoda - podobno - trochę przestarzała i mało bezpieczna. Poleganiu na wysłaniu "sygnału" na określone przez nas porty, po czym wykonuje określone w konfiguracji komendy. Rozwiązanie dobre, ale tylko lokalnie.

Instalacja (w Debianie):
apt install knockd
Konfiguracja z sekwencjami portów znajduje się w /etc/knockd.conf, przykładowo:
[options]
UseSyslog
LogFile = /var/log/knockd.log
Interface = eno1

[echo]
        sequence    = 1,1,1
        seq_timeout = 1
        command     = echo
        tcpflags    = syn
W sekcji [options] warto uwzględnić nazwę interfejsu oraz gdzie ma być zapisywany log.
Plik "aktywacyjny" /etc/default/knockd:
# control if we start knockd at init or not
# 1 = start
# anything else = don't start
# PLEASE EDIT /etc/knockd.conf BEFORE ENABLING
START_KNOCKD=1

# command line options
KNOCKD_OPTS="-i eno1"
START_KNOCKD domyślnie jest na 0, nazwę sieci ustawiamy wedle potrzeb.
Z poziomu klienta, jeśli klientem również jest Debian instalujemy tę samą paczkę:
apt install knockd
I terminalu wystarczy wykonać:
knock -v host port1 port2 port3
Opcja -v powoduje wypisanie nam na ekranie poszczególnych działań.
Knocking działa również na interfejsach wifi. Po resztę informacji zapraszam do manuali.


Trzecim sposobem jest fwknop. W tym przypadku "logowanie" do serwera działa jak w przeglądarce internetowej. Tzn tworzymy klucz, który przesyłamy do serwera, prawie jak ciasteczko w przeglądarce. Jak serwer odbierze nasze dane to zaakceptuje nasze połączenie i wykorzysta według konfiguracji.

Przedstawię bardzo uproszczoną konfigurację. W przeciwieństwie do poprzedniego rozwiązania musimy zainstalować dwie różne paczki.

Na kliencie instalujemy:
apt install fwknop-client
A na serwerze:
apt install fwknop-server 
Na kliencie uruchamiamy:
fwknop -a ip.klienta -D ip.serwera --key-gen -C /sciezka/do/komendy --save-rc-stanza
--save-rc-stanza powoduje zapisanie konfiguracje w ~/.fwknoprc. W tym pliku mamy dwa klucze, KEY_BASE64 oraz HMAC_KEY_BASE64 które musimy przenieść na serwer (o tym niżej). Jak do jednego serwera chcemy wysłać kilka różnych komend (raz jedną, innym razem drugą) to przy generowaniu klucza możemy wykorzystać opcję -n nazwa. Dokładny opis w manualu.
Na serwerze włączamy usługę w /etc/default/fwknop-server z poniższymi argumentami:
START_DAEMON="yes"
DAEMON_ARGS="-f -U"
Dodatkowo mamy pliki /etc/fwknop/fwknopd.conf oraz /etc/fwknop/access.conf. Pierwszy zostawiamy z domyślną konfiguracją a do access.conf wrzucamy klucze z ~/.fwknoprc:
SOURCE              ip.klienta
KEY_BASE64          klucz1
HMAC_KEY_BASE64     klucz2
ENABLE_CMD_EXEC     Y
ENABLE_CMD_EXEC zezwala nam na uruchomienie zdalnej komendy. Z poziomu klienta:
fwknop -n 192.168.1.97 -C /sciezka/do/komendy
I to wszystko :D fwknop docelowo służy do zdalnej modyfikacji reguł firewalla ale równie dobrze możemy wykorzystać go do zdalnego wykonania komend. W manualu mamy opcje CMD_CYCLE_OPEN, CMD_CYCLE_CLOSE oraz CMD_CYCLE_TIMER. Być może też mogłyby zamknąć gui :D
W przeciwieństwie do knockd, za pomocą fwknop udało mi się uruchomić kilka komend jednocześnie (w skrypcie).
Na Androida jest aplikacja fwknop. Nie testowałem.

Czwartym i ostatnim sposobem jest shell2http. To taka mała usługa, która pozwala na wykonanie poleceń z poziomu np przeglądarki internetowej (poprzez uprzednio skonfigurowany adress www). Jest to chyba najprostszy sposób jaki udało mi się znaleźć, teoretycznie najmniej problemowy i z tego co widzę to nie wymaga żadnych zależności. Póki co gotowej paczki nie ma w repozytoriach Debiana (stan na 19.01.2026) ale można znaleźć w sieci paczkę *.deb i na luzie ją zainstalować np z wykorzystaniem gdebi:
gdebi shell2http_1.17.0_linux_amd64.deb
Składnia polecenia jest prosta. Tworzymy usługę /etc/systemd/system/shell2http.service:
[Unit]
Description=shell2http
[Service]
Type=oneshot
ExecStart=/bin/shell2http  /polecenie1 "/sciezka/do/polecenia1" /polecenie2 "/sciezka/do/polecenia2"
[Install]
WantedBy=multi-user.target
W miejscu "/sciezka/do/polecenia1" możemy wpisać (między cudzysłowami) kilka poleceń oddzielonych znakiem ";". Następnie aktywujemy:
systemctl enable shell2http.service
Oraz uruchamiamy:
systemctl start shell2http.service
W przeglądarce internetowej odpalamy adres:
adres.ip.serwera:8080/polecenie1
Lub:
adres.ip.serwera:8080/polecenie2
Domyślny port to 8080, ale można to zmienić. Polecam zajrzeć do manuala. Odnoszę wrażenie, że shell2http reaguje najwolniej ze wszystkich opisanych rozwiązań.


I to wszystko :D
Najbezpieczniejszym rozwiązaniem wydaje się być fwknop z racji takiej że "sygnał" jest prawie nie do podrobienia (chyba, ze ktoś ma założony podsłuch) :D

Brak komentarzy:

Prześlij komentarz