
Я пытаюсь создать пакетный файл 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делай что хочешь?