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

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

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

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 [email protected]

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

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

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

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

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

Таким образом, putty/SSH будет поддерживать соединение активным и не прерывать переадресацию портов.

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

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

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

Для чего мне следует использовать waitTillControlC?

решение1

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

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

echo "Something"; sleep 36500d

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

echo "Something"; read foo

решение2

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

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

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

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

решение3

Это должно привести к вечному сну без потребления (заметного) количества мощности ЦП.

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никогда не вернет байты. И поэтому команда будет спать вечно.

решение4

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

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делай что хочешь?

Связанный контент