Czy w Linuksie jest polecenie czekające na jego zakończenie?

11

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 ForceCommandz Match Userdeklaracją:

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, pinglub 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?

stuXnet
źródło
Znalazłem pytania takie jak superuser.com/questions/587629/... , ale zostawiają użytkownika z gotową powłoką.
stuXnet,

Odpowiedzi:

13

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ę:

echo "Something"; sleep 36500d

Alternatywnie powinno to również zostać zablokowane, dopóki nie wpiszesz Enterklucza:

echo "Something"; read foo
jlliagre
źródło
9

Wypróbuj -Nopcję zamiast tego. Z plinkdokumentacji :

-N        don't start a shell/command (SSH-2 only)

Jest to takie samo zachowanie jak sshopcja -N, jak opisano na stronie podręcznika :

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).
chepner
źródło
2
To powinna być zaakceptowana odpowiedź. Inni mówią, jak to obejść, ale ten mówi, jak zrobić to dobrze .
Moshe Katz,
Dzięki za edycję; nie mając okna Windows do sprawdzenia, nie pomyślałem o szukaniu dokumentów plink on-line.
chepner,
Ta odpowiedź nie odpowiada moim potrzebom, ponieważ I don't want to allow to execute other commands after authentication. -Nwykona to po stronie klienta, więc możesz po prostu usunąć -N, aby wykonać inne polecenia po uwierzytelnieniu.
stuXnet
8

Powinno to spać wiecznie bez zużywania (zauważalnej) mocy procesora.

echo "Something" && while true; do sleep 9999; done

Nie jestem również pewien, czy możesz wydać polecenie jak w ForceCommandklauzuli. Może być konieczne umieszczenie polecenia w skrypcie powłoki.

#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done

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ć.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

Edytować

Znalazłem polecenie, które wydaje się bardziej eleganckie:

echo "Something" && tail -f /dev/null

tail -fczeka, aż plik lub strumień zwróci bajty. (W przeciwnym razie przydatne do oglądania dzienników w czasie rzeczywistym). /dev/nullNigdy nie zwróci bajtów. I tak rozkaz będzie spał na zawsze.

nitro2k01
źródło
W tej chwili próbowałem dla siebie pętli snu - tak, to działa zdecydowanie! Nawet bezpośrednio z ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet
tail -f /dev/nulljest technicznie gorszy niż pętla 9999. Proces będzie się budził co sekundę zamiast co 2 godziny i 56 minut.
jlliagre
Znalazłem to tutaj: unix.stackexchange.com/questions/42901/ ... Osoba odpowiadająca na to pytanie twierdzi „(zakładając, że używa to inotify wewnętrznie, nie powinno być sondowania ani wybudzeń, więc poza dziwnym wyglądem powinno wystarczyć) „Czy to stwierdzenie lub założenie, że ogon używa, jest inotifynieprawidłowe?
nitro2k01
Założenie jest prawidłowe, tailjest zoptymalizowane pod kątem dźwigni finansowej, inotifyjeś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ść z tailmonitorowaniem, /dev/nullwięc z pewnością gorsze jest to, że śpię pod względem cykli zegara.
jlliagre
Nie wierzę, że tailzawsze budzi się co sekundę. Możliwym powodem tego wyniku jest to, że uruchamiasz go w terminalu, który może komunikować się z tailjakiegokolwiek powodu, podczas gdy sleepnie. Nie ma żadnego powodu, dla którego tailmiałby fałszywie obudzić się tylko monitorowanie /dev/null.
nitro2k01
0

Możesz po prostu spróbować następujących czynności:

echo "your commands" && while :; do sleep 1; done
użytkownik2783132
źródło
1
Dla przyszłych użytkowników należy przedstawić podsumowanie tego, jak to działa. Wielu może wiedzieć, ale nie można zakładać, że wszystko będzie.
nerdwaller
Dłuższy sleepokres będzie łatwiejszy dla procesora, chociaż nawet sleep 1powinien być wystarczająco bezpieczny dla wszystkiego, co zbudowano w ciągu ostatnich dwóch dekad ...
Shadur,
:jest skrótem od true. Wolałbym również dłuższy sleepokres, który byłby całkowicie nieuzasadniony.
nitro2k01
0

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 1na 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?

Gabe
źródło
Problemem nie jest to, że okno się zamyka, ale to, że tunel ssh jest zamknięty. Czy nakazanie PuTTY pozostawienia otwartego okna również utrzymuje tunel ssh?
Adrian Pronk