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?

5 ответов5

12

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

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

echo "Something"; sleep 36500d

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

echo "Something"; read foo
8

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

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 делать то, что вы хотите?

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .