Portál AbcLinuxu, 6. května 2025 16:25
Řešení dotazu:
#!/bin/bash while :; do autossh -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -o "ExitOnForwardFailure yes" -i /home/user/.ssh/id_rsa -M 0 -N -R 32000:127.0.0.1:8080 user@server.tld -p 22 sleep 300 doneZpristupnite tak na domacim serveru sluzbu ktera bezi na localhostu a portu 8080 tak ze bude dostupna na VPS na portu 32000 Zapis do Cronu:
@reboot /bin/sleep 60; /usr/bin/screen -Sdm screen1 /home/user/httpd/ssh_tunnel.shNo a pro dalsi port si udelate totez akorat prepisete spravne porty. Spolehlivost paradni, tunel pokud padne tak se sam po par minutach znova otevre. Nestalo se mi ze by to nefungovalo.
#!/bin/bash
while :; do
autossh -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -o "ExitOnForwardFailure yes" -i /home/user/.ssh/id_rsa -M 0 -N -R 32000:127.0.0.1:8080 -R 32001:127.0.0.1:8081 user@server.tld -p 22
sleep 300
done
[Unit] Description=AutoSSH tunel #After=networking.service [Service] ExecStart=/usr/bin/autossh -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -o "ExitOnForwardFailure yes" -i /home/user/.ssh/id_rsa -M 0 -N -R 32000:127.0.0.1:8080 user@server.tld -p 22 KillMode=process Restart=always RestartSec=300 [Install] WantedBy=multi-user.target Alias=ssh-tunel.service
systemctl status ssh-tunel.service
ti ukáže stdout a stderr té služby a zda vůbec běží. Pokud chceš víc, než jen pár posledních řádek, tak journalctl -u ssh-tunel.service
. Nastavit to jde volbami StandardOutput a StandardError.
User=…
. Možností je tam spousta.
A zrovna na přeposílání portu by se hodilo využít socket activation a spouštět tunel jen když je používán.
~/.config/systemd/user/moje.service
a pak systemctl --user enable/start/..... moje.serviceJediný problém pak je, že dafaultně se uživatelské služby nestartují po startu systému, ale až po nalogování uživatele a ukončují se po odhlášení uživatele (posledním odhlášení). To se musí uživateli povolit pod rootem
loginctl enable-linger username
enable-linger
pod non-rootom a je to dokonale.
systemd.service
a zjistit si, co znamená RestartSec
, přece není až tak těžké.
Configures the time to sleep before restarting a service (as configured with Restart=). Takes a unit-less value in seconds, or a time span value such as "5min 20s". Defaults to 100ms.Znamena to snad neco jineho, nez ze se bude sluzba kazdych 5 sekund restartovat? Ne? lol..
Restart
), počká se s restartem (v tomto případě) 5 sekund. Konfigurační volba Restart
pak určuje, kdy k tomu restartu má dojít – několik voleb je při ukončení hlavního procesu (a rozlišují se různé návratové kódy ukončení), další možnost je na základě watchdogu. V odkazovaném příkladu je Restart=always
, tj. pokud se hlavní proces ukončí s libovolným návratovým kódem, 5 sekund se počká a pak se nastartuje znovu.
Důvod, proč se používá ten odklad při restartu, je ten, že ukončení a/nebo start mohou být dost často náročné operace. Pokud by ve službě (nebo konfiguraci či datech) byla nějaká chyba, která by způsobovala, že služba nenaběhne správně a brzy se ukončí, můžete skončit s tím, že se služba bude bez přestání pořád dokola jen restartovat a restartovat, a dost tím vytíží počítač.
Ale fascinuje mne, že jste si opravdu myslel, že se každá služba pod systemd ve výchozí nastavení restartuje každých 100 milisekund. To už je záporné IQ, ne?
command="/bin/sleep 4294967001",no-agent-forwarding,no-pty,no-user-rc,no-X11-forwarding,permitopen="localhost:5901",permitopen="localhost:2201" ssh-rsa nasledujeklic...u sleep na konci pouziju stejne cislo jako konec cisla portu, kvuli identifikaci, pokud tunel ma problem zabiju v cili proces sleep s danym cislem a tunel se obnovi ...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.