Есть ли в Linux команда, которая ждет, пока она не прекратится?


11

Я пытаюсь создать пакетный файл Windows, который запускает putty / plink с переадресацией портов и ничего больше. Часть Windows уже готова:

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 sampleUser@192.168.0.1

Поскольку я не хочу разрешать выполнение других команд после аутентификации, я использую ForceCommandс Match Userобъявлением:

Match User sampleUser
    ForceCommand echo 'Success! Close this window to log out.'

Проблема в том, что при запуске моего командного файла правильно запускается шпаклевка, но он сразу же закрывается после выполнения моего указанного текста.

Моя идея состоит в том, чтобы использовать что-то вроде этого:

ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC

Таким образом, putty / SSH должен поддерживать соединение и не выходить из моего перенаправления портов.

Я думал о таких командах, как yes, pingили read, но они

  • спамят мое окно терминала
  • фактически делают вещи / генерируют ненужную загрузку процессора
  • может неожиданно закрыться, если кто-то нажмет ввод

Есть ли команда, которая ничего не будет делать, навсегда, пока кто-нибудь не завершит ее с помощью Ctrl + C или закроет соединение SSH, закрыв окно замазки?

Что я должен использовать для waitTillControlC?


Я нашел такие вопросы, как superuser.com/questions/587629/… , но они оставили бы пользователя с готовой оболочкой.
— stuXnet

Ответы:


13

Я не понимаю, почему все другие ответы хотят использовать цикл здесь, сон способен ждать достаточно долго для любых практических целей и не будет использовать такты для этого.

Например, он попытается уснуть здесь на сомнительную сотню лет и, скорее всего, сделает это достаточно, чтобы выполнить запрос в любом случае:

echo "Something"; sleep 36500d

В качестве альтернативы, это также должно блокироваться, пока вы не введете Enterключ:

echo "Something"; read foo

9

Попробуйте -Nвариант вместо этого. Из plinkдокументации :

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

Это то же поведение, что и у sshопции -N, как описано на странице man :

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).

2
Это должен быть принятый ответ. Другие говорят, как сделать обходной путь, но этот говорит, как сделать это правильно .
— Моше Кац

Спасибо за редактирование; не имея окна Windows, чтобы проверить, я не думал искать plink документы в Интернете.
— chepner

Этот ответ не соответствует моим потребностям, потому что I don't want to allow to execute other commands after authentication. -Nвыполнит это на стороне клиента, так что вы можете просто удалить -N для выполнения других команд после аутентификации.
— stuXnet

8

Это должно спать вечно, не потребляя (заметного) количества энергии процессора.

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

Я также не уверен, что вы можете дать команду, как в ForceCommandпредложении. Возможно, вам придется поместить команду в сценарий оболочки.

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

Этот сценарий, конечно, должен находиться в определенном месте и иметь такие разрешения, чтобы ни один обычный пользователь на сервере не мог писать в него.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

редактировать

Я нашел команду, которая кажется более элегантной:

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

tail -fждет файла или потока, чтобы вернуть байты. (В противном случае полезно для просмотра журналов в реальном времени.) /dev/nullНикогда не будет возвращать байты. И поэтому команда будет спать вечно.


В этот момент я пытался зациклить себя - да, это работает определенно! Даже напрямую с ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
— stuXnet

tail -f /dev/nullтехнически хуже, чем петля 9999. Процесс будет активироваться каждую секунду, а не каждые 2 часа и 56 минут.
— Jlliagre

Я нашел его здесь: unix.stackexchange.com/questions/42901/… Человек, отвечающий на этот вопрос, заявляет: «(Предполагая, что это использует inotify внутри, не должно быть никаких опросов или пробуждений, поэтому, кроме странного вида, этого должно быть достаточно) «Это утверждение или предположение, что хвост использует inotifyнеправильно?
— nitro2k01

Предположение верно, tailоптимизировано для использования inotifyпри наличии. Это должен быть случай по умолчанию с большинством, если не со всеми достаточно свежими дистрибутивами. Тем не менее, я только что проверил на ноутбуке Linux и наблюдал ложную активность с tailмониторингом, /dev/nullтак что, конечно, хуже спать в терминах тактов.
— Jlliagre

Я не верю, что tailвсегда буду просыпаться каждую секунду. Возможная причина результата заключается в том, что вы запускаете его в терминале, с которым tailпо какой-либо причине может обмениваться данными , а sleepне будет. Нет никаких причин, почему tailследует с энтузиазмом просыпаться только от наблюдения /dev/null.
— nitro2k01

0

Вы можете просто попробовать следующее:

echo "your commands" && while :; do sleep 1; done

1
Для будущих посетителей вы должны предоставить краткую информацию о том, как это работает. Многие могут знать, но вы не можете предполагать, что все будет.
— nerdwaller

Более длительный sleepпериод будет проще для процессора, хотя даже он sleep 1должен быть достаточно безопасным для всего, что было построено за последние два десятилетия ...
— Шадур

:это сокращение для true. Я также предпочел бы более длительный sleepпериод просто из принципа.
— nitro2k01

0

Вы пытаетесь решить это не с того конца. Вы не хотите, чтобы оболочка не выходила, вы хотите, чтобы замазка оставила окно открытым.

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit - описывает, что именно вам нужно изменить. Если вы хотите использовать опцию «только при чистом выходе», просто добавьте exit 1в конце ForceCommand.

Редактировать: я неправильно понял; вам нужно только поддерживать перенаправленные порты, вы не хотите сохранять выходные данные ForceCommand. В этом случае, не может ли http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell делать то, что вы хотите?


Проблема не в том, что окно закрывается, а в том, что ssh-туннель закрыт. Говорит ли PuTTY, что окно оставлено открытым, также поддерживает ssh-туннель?
— Адриан Пронк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.