Mam 2 komputery localpc
i remoteserver
.
Muszę localpc
wykonać kilka poleceń remoteserver
. Jedną z rzeczy, które musi zrobić, jest uruchomienie skryptu kopii zapasowej, który będzie działał przez kilka godzin. Chciałbym, aby polecenie localpc
„strzelało”, a następnie działało całkowicie niezależnie remoteserver
, jak localpc
nigdy wcześniej.
Oto co dotychczas zrobiłem:
remoteserver
zawiera skrypt:
/root/backup.sh
localpc
zaplanowano uruchomienie tego:
ssh root@remoteserver 'nohup /root/backup.sh' &
Czy robię to we właściwy sposób? Czy jest na to lepszy sposób? Czy napotkam jakieś problemy w ten sposób?
ssh
scripting
nohup
background-process
LVLAaron
źródło
źródło
Odpowiedzi:
Prawdopodobnie powinieneś użyć
screen
na zdalnym hoście, aby mieć prawdziwe odłączone polecenie:źródło
Blisko, ale nie do końca.
Niezależnie od dowolnego terminala
Musisz zamknąć wszystkie deskryptory plików, które są podłączone do gniazda ssh, ponieważ sesja ssh nie zostanie zamknięta, dopóki jakiś zdalny proces ma otwarte gniazdo. Jeśli nie interesuje Cię wyjście skryptu (przypuszczalnie dlatego, że sam skrypt zajmuje się zapisywaniem do pliku dziennika), przekieruj go na
/dev/null
(ale pamiętaj, że to ukryje błędy, takie jak niemożność uruchomienia skryptu).Używanie
nohup
nie ma tutaj żadnego użytecznego efektu.nohup
organizuje, że program działa tak, aby nie odbierać sygnału HUP, jeśli terminal kontrolny programu zniknie, ale tutaj nie ma terminala, więc nic nie wyśle SIGHUP do procesu nieoczekiwanie. Ponadtonohup
przekierowuje standardowe wyjście i standardowy błąd (ale nie standardowe wejście) do pliku, ale tylko wtedy, gdy są one podłączone do terminala, co też nie jest.Odłączanie od terminala
Służy
nohup
do odłączania skryptu od terminala sterującego, aby nie otrzymywał POWIĘKSZENIA, gdy terminal zniknie.nohup
przekierowuje również standardowe wyjście skryptu i standardowy błąd do pliku wywoływanego,nohup.out
jeśli jest on podłączony do terminala; musisz sam zadbać o standardowe wejście.Prowadzenie zdalnego terminala
Jeśli chcesz, aby polecenie działało w zdalnym terminalu, ale nie było dołączone do sesji SSH, uruchom je w multiplekserze terminali, takim jak Screen lub Tmux .
Możesz później ponownie połączyć się z terminalem, na którym działa skrypt, wywołując
screen -S backup -rd
jako root na tym komputerze.Automatyzacja jednego zdalnego polecenia
Dla nieco lepszego bezpieczeństwa nie otwieraj zbyt często bezpośrednich zdalnych loginów root. Utwórz parę kluczy specjalnego przeznaczenia i wprowadź do niej wymuszone polecenie
/root/.ssh/authorized_keys
. Zawartość pliku klucza publicznego toAAAA…== [email protected]
; dodaj listę opcji oddzieloną przecinkami, w tymcommand="…"
która określa, że klucza można użyć tylko do wykonania tego konkretnego polecenia. Pamiętaj, aby zachować wszystkie opcje i klucz w jednym wierszu.źródło
-f
opcję, aby uzyskać ssh do „tła” (tj. Zakończyć, zamknąć połączenia) po stronie lokalnej. Będzie to działać w połączeniu z&
.nohup
jest w tym przypadku opcjonalny, ale możesz rozważyć użyciesetsid
zamiast niego.Standardowy przepis na uruchomienie polecenia zdalnego ze zdalnego logowania, takiego jak SSH, jest następujący:
Jeśli
command
jest skryptem powłoki, który zajmuje się logowaniem do samego pliku, możesz zmienićcommand.log
na/dev/null
. Po uruchomieniu wyloguj się od razu.Potrzebujesz wszystkiego na tej linii.
nohup
mówi powłoce, aby nie zakłócała procesu, jeśli sesja logowania zostanie rozłączona.</dev/null
mówi, aby nigdy nie czekać na dane wejściowe>command.log
każe mu wysyłać wiadomości do tego nazwanego pliku dziennika2>&1
nakazuje mu wysyłanie komunikatów stderr do tego samego pliku dziennika. W niektórych przypadkach lepiej jest mieć dwa pliki, drugi do zbierania komunikatów o błędach, a pierwszy do zbierania normalnych komunikatów o aktywności. To może ułatwić sprawdzenie, czy wszystko działało poprawnie.&
każe mu odłączyć ten proces i uruchomić go w tle jako proces demona.źródło
Ten wątek był bardzo pomocny, ale moje rozwiązanie musiało być nieco inne.
Nie podoba mi się rozwiązanie ekranowe, ponieważ pozostawia uruchomiony proces ekranowy, którego nie potrzebuję. Użyte przekierowania i nohups:
NIE działały dla mnie, gdy były używane z poleceniem ssh.
Utworzyłem skrypt opakowania na zdalnej maszynie, która uruchamia właściwy skrypt. Skrypt opakowania ustawia przekierowanie i nohup. Coś takiego:
Następnie uruchamiam na komputerze klienckim (zauważ, że nie ma przekierowań):
Polecenie ssh natychmiast zwraca, połączenie zostaje zakończone, a skrypt pozostaje uruchomiony.
źródło
Jak mówi Nils , zezwolenie rootowi na zalogowanie się przez ssh jest zagrożeniem bezpieczeństwa. I odradzam wykonywanie jakiejkolwiek znaczącej pracy na maszynie bez dziennika. Jeśli coś pójdzie nie tak, zechcesz mieć jakieś komunikaty o rozwiązywaniu problemów. Istnieją inne odpowiedzi pokazujące, jak to zrobić. Ale oto, w jaki sposób zalecam osiągnięcie tego, o co prosiłeś. Wszystko jest wbudowane w sh (1). Nie potrzeba ekranu GNU (choć myślę, że to sprytne rozwiązanie). Dołącz ten ciąg do polecenia:
>&- 2>&- <&- &
.>&-
oznacza zamknij standardowe wyjście.2>&-
oznacza bliski stderr.<&-
oznacza ścisłe standardowe.&
oznacza bieg w tle, npźródło
Powinieneś w tle włączyć zdalne polecenie
remoteserver
. Sposób, w jaki to zrobisz, spowoduje włączenie polecenia ssh w tlelocalpc
.Poza tym złym pomysłem jest zezwolenie na root-ssh.
Więc skonfiguruj
remoteserver
: Linia sudoers, która będzie uruchamiana/root/backup.sh
przez użytkownika jako rootbackup
.Możesz utworzyć tego użytkownika bez „dobrego” hasła.
Umieść polecenie
sudo /root/backup.sh &
jako polecenie w~backup/.ssh/authorized_keys
- razem z kluczem publicznym odlocalpc
(kto uruchamia ten skrypt).źródło
źródło