Usiłuję zbudować plik wsadowy systemu Windows, który rozpoczyna putty / plink z przekierowaniem portów i nic więcej. Część Windows jest do tej pory gotowa:
start plink.exe -ssh -i key.ppk -L 1234:localhost:80 sampleUser@192.168.0.1
Ponieważ nie chcę zezwalać na wykonywanie innych poleceń po uwierzytelnieniu, używam ForceCommand
z Match User
deklaracją:
Match User sampleUser
ForceCommand echo 'Success! Close this window to log out.'
Problem polega na tym, że uruchomienie mojego pliku wsadowego uruchamia szpachlę poprawnie, ale zamyka się natychmiast po wykonaniu echa podanego tekstu.
Moim pomysłem jest użycie czegoś takiego:
ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC
W ten sposób putty / SSH powinien utrzymać połączenie przy życiu i nie wychodzić z mojego przekierowania portów.
Myślałam poleceń takich jak yes
, ping
lub read
, ale
- spamują moje okno terminala
- robią rzeczy / generują niepotrzebne obciążenie procesora
- może niespodziewanie zamknąć się, jeśli ktoś naciśnie klawisz Enter
Czy istnieje polecenie, które nic nie zrobi, na zawsze, dopóki ktoś nie zakończy go za pomocą Ctrl + C lub nie zamknie połączenia SSH przez zamknięcie okna kitu?
Do czego mam używać waitTillControlC
?
Odpowiedzi:
Nie rozumiem, dlaczego wszystkie inne odpowiedzi tutaj chcą użyć pętli, sen jest w stanie czekać wystarczająco długo na dowolny praktyczny cel i nie użyje przy tym żadnych cykli zegara.
Na przykład spróbuje tutaj spać przez wątpliwe sto lat i prawdopodobnie zrobi to wystarczająco, aby spełnić prośbę:
Alternatywnie powinno to również zostać zablokowane, dopóki nie wpiszesz Enterklucza:
źródło
Wypróbuj
-N
opcję zamiast tego. Zplink
dokumentacji :Jest to takie samo zachowanie jak
ssh
opcja-N
, jak opisano na stronie podręcznika :źródło
I don't want to allow to execute other commands after authentication
.-N
wykona to po stronie klienta, więc możesz po prostu usunąć -N, aby wykonać inne polecenia po uwierzytelnieniu.Powinno to spać wiecznie bez zużywania (zauważalnej) mocy procesora.
Nie jestem również pewien, czy możesz wydać polecenie jak w
ForceCommand
klauzuli. Może być konieczne umieszczenie polecenia w skrypcie powłoki.Ten skrypt powinien oczywiście znajdować się w miejscu i mieć takie uprawnienia, aby żaden zwykły użytkownik na serwerze nie mógł do niego pisać.
Edytować
Znalazłem polecenie, które wydaje się bardziej eleganckie:
tail -f
czeka, aż plik lub strumień zwróci bajty. (W przeciwnym razie przydatne do oglądania dzienników w czasie rzeczywistym)./dev/null
Nigdy nie zwróci bajtów. I tak rozkaz będzie spał na zawsze.źródło
ForceCommand echo 'congrats' && while true; do sleep 9999; done
tail -f /dev/null
jest technicznie gorszy niż pętla 9999. Proces będzie się budził co sekundę zamiast co 2 godziny i 56 minut.inotify
nieprawidłowe?tail
jest zoptymalizowane pod kątem dźwigni finansowej,inotify
jeśli jest dostępne. Powinien to być domyślny przypadek w przypadku większości, jeśli nie wszystkich, ostatnich dystrybucji. Jednak właśnie przetestowałem na laptopie z systemem Linux i zaobserwowałem fałszywą aktywność ztail
monitorowaniem,/dev/null
więc z pewnością gorsze jest to, że śpię pod względem cykli zegara.tail
zawsze budzi się co sekundę. Możliwym powodem tego wyniku jest to, że uruchamiasz go w terminalu, który może komunikować się ztail
jakiegokolwiek powodu, podczas gdysleep
nie. Nie ma żadnego powodu, dla któregotail
miałby fałszywie obudzić się tylko monitorowanie/dev/null
.Możesz po prostu spróbować następujących czynności:
źródło
sleep
okres będzie łatwiejszy dla procesora, chociaż nawetsleep 1
powinien być wystarczająco bezpieczny dla wszystkiego, co zbudowano w ciągu ostatnich dwóch dekad ...:
jest skrótem odtrue
. Wolałbym również dłuższysleep
okres, który byłby całkowicie nieuzasadniony.Próbujesz rozwiązać ten problem z niewłaściwego końca. Nie chcesz, aby powłoka nie wychodziła, chcesz, aby kit pozostawił otwarte okno.
http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit - dokładnie opisuje, co należy zmienić. Jeśli chcesz użyć opcji „tylko przy czystym wyjściu”, po prostu dodaj
exit 1
na końcu ForceCommand.Edycja: źle zrozumiałem; chcesz tylko zachować przekierowane porty, nie chcesz zachować wyjścia ForceCommand. W takim przypadku, czy http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell nie robi tego, co chcesz?
źródło