Чи є в 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, закривши вікно putty?

Для чого я повинен користуватися waitTillControlC?


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

Відповіді:


13

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

Наприклад, він спробує тут поспати протягом сумнівної ста років і, швидше за все, зробить це достатньо, щоб все-таки виконати запит:

echo "Something"; sleep 36500d

Крім того, це також має блокуватися, поки ви не введете Enterключ:

echo "Something"; read foo

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).

2
Це має бути прийнятою відповіддю. Інші кажуть, як зробити спосіб подолання, але цей говорить, як це зробити правильно .
Моше Кац

Дякую за редагування; не маючи вікна для перевірки, я не думав шукати онлайн-документів.
чепнер

Ця відповідь не відповідає моїм потребам, оскільки 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Ніколи не повертається байтами. І так команда буде спати назавжди.


У цю мить я спробував спробувати петлю сну для себе - так, це точно працює! Навіть безпосередньо з 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невірно?
nitro2k01

Припущення правильне, tailоптимізоване для використання inotifyза наявності. Це має бути випадок за замовчуванням для більшості, якщо не всіх останніх достатньо розповсюджень. Однак я просто тестував на ноутбуці Linux і спостерігав помилкову активність з tailмоніторингом, /dev/nullтому, звичайно, гірше спати протягом циклів годин.
jlliagre

Я не вірю, що tailзавжди прокинеться кожну секунду. Можливою причиною результату є те, що ви запускаєте його в терміналі, з яким може спілкуватися з tailбудь-якої причини, тоді як sleepне буде. Немає жодних причин, чому tailслід неправдиво прокидатись лише за спостереженням /dev/null.
nitro2k01

0

Ви можете просто спробувати наступне:

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

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 тунель?
Адріан Пронк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.