Есть ли в 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?

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

Ответы:

13

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

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

echo "Something"; sleep 36500d

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

echo "Something"; read foo
jlliagre
источник
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).
chepner
источник
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Никогда не будет возвращать байты. И поэтому команда будет спать вечно.

nitro2k01
источник
В этот момент я пытался зациклить себя - да, это работает определенно! Даже напрямую с 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
user2783132
источник
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-туннель?
Адриан Пронк