Я пытаюсь создать пакетный файл 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
?
Ответы:
Я не понимаю, почему все другие ответы хотят использовать цикл здесь, сон способен ждать достаточно долго для любых практических целей и не будет использовать такты для этого.
Например, он попытается уснуть здесь на сомнительную сотню лет и, скорее всего, сделает это достаточно, чтобы выполнить запрос в любом случае:
В качестве альтернативы, это также должно блокироваться, пока вы не введете Enterключ:
источник
Попробуйте
-N
вариант вместо этого. Изplink
документации :Это то же поведение, что и у
ssh
опции-N
, как описано на странице man :источник
I don't want to allow to execute other commands after authentication
.-N
выполнит это на стороне клиента, так что вы можете просто удалить -N для выполнения других команд после аутентификации.Это должно спать вечно, не потребляя (заметного) количества энергии процессора.
Я также не уверен, что вы можете дать команду, как в
ForceCommand
предложении. Возможно, вам придется поместить команду в сценарий оболочки.Этот сценарий, конечно, должен находиться в определенном месте и иметь такие разрешения, чтобы ни один обычный пользователь на сервере не мог писать в него.
редактировать
Я нашел команду, которая кажется более элегантной:
tail -f
ждет файла или потока, чтобы вернуть байты. (В противном случае полезно для просмотра журналов в реальном времени.)/dev/null
Никогда не будет возвращать байты. И поэтому команда будет спать вечно.источник
ForceCommand echo 'congrats' && while true; do sleep 9999; done
tail -f /dev/null
технически хуже, чем петля 9999. Процесс будет активироваться каждую секунду, а не каждые 2 часа и 56 минут.inotify
неправильно?tail
оптимизировано для использованияinotify
при наличии. Это должен быть случай по умолчанию с большинством, если не со всеми достаточно свежими дистрибутивами. Тем не менее, я только что проверил на ноутбуке Linux и наблюдал ложную активность сtail
мониторингом,/dev/null
так что, конечно, хуже спать в терминах тактов.tail
всегда буду просыпаться каждую секунду. Возможная причина результата заключается в том, что вы запускаете его в терминале, с которымtail
по какой-либо причине может обмениваться данными , аsleep
не будет. Нет никаких причин, почемуtail
следует с энтузиазмом просыпаться только от наблюдения/dev/null
.Вы можете просто попробовать следующее:
источник
sleep
период будет проще для процессора, хотя даже онsleep 1
должен быть достаточно безопасным для всего, что было построено за последние два десятилетия ...:
это сокращение дляtrue
. Я также предпочел бы более длительныйsleep
период просто из принципа.Вы пытаетесь решить это не с того конца. Вы не хотите, чтобы оболочка не выходила, вы хотите, чтобы замазка оставила окно открытым.
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 делать то, что вы хотите?
источник