Как я могу заставить /bin/login не делать таймаут

Если я правильно вас понял, вы ищете все имена файлов, которые существуют с каждым из целевых расширений. Если это так, вы можете сделать:

( shopt -s nullglob; 
  for i in *.wed; do 
    set --  "${i//.wed}"{.tis,.are,LM.bmp}*; 
    [[ $# -eq 3 ]] && printf '%s\n'  "${i//.wed}"; 
done )

Explanation

  • shopt -s nullglob : это специфическая для bash опция, которая заставляет глобусы расширяться до нулевой строки вместо себя, если не найдено ни одного подходящего файла. ( ) здесь только для того, чтобы гарантировать, что опция будет установлена только для этой команды и не повлияет на родительскую оболочку.
  • for i in *.wed; do ...; done : перебирает все файлы или каталоги в текущем каталоге, имя которых заканчивается на .wed, сохраняя каждый из них как $i.
  • "${i//.wed}" : имя файла без расширения .wed.
  • set -- "${i//.wed}"{.tis,.are, LM.bmp}* : скобки расширяются до foo.tis, foo.are и т.д., а * - это трюк, чтобы заставить bash попытаться сопоставить их как глобы. Это означает, что он сработает только в том случае, если фактическое имя файла существует.
  • [[ $# -eq 3 ]] && printf '%s\n' "${i//.wed}" : если в $@ находится ровно 3 файла, то есть 3 в дополнение к исходному .wed, выведите имя файла без расширения.

Если вы хотите вывести все 4 имени файла, включая расширение, просто измените printf '%s\n' "${i//.wed}" на printf '%s\n' "$i".

5
26.01.2017, 18:42
2 ответа

Очевидно, невозможно без изменения исходного кода.

Поиск login.defs или LOGIN_TIMEOUT действительно не дает релевантных результатов, а при просмотре loginutils / login.c действительно кажется, что значение и все таймер жестко запрограммирован:

 enum {
TIMEOUT = 60, 
EMPTY_USERNAME_COUNT = 10, 
 / * Некоторые пользователи обнаружили, что ограничение в 32 символа слишком мало: * / 
USERNAME_SIZE = 64, 
TTYNAME_SIZE = 32, 
}; 
  

[…]

 static void alarm_handler (int sig UNUSED_PARAM) 
 {
 / * Это аварийный люк! Бедные пользователи последовательной линии и тому подобное 
 * прибывают сюда, когда их соединение обрывается. 
 * Мы не хотим блокировать здесь * / 
ndelay_on (STDOUT_FILENO); {{1 }} / * Проверка правильности восстановления attr: 
 * запустить "getty 0 -" из оболочки, ввести поддельное имя пользователя, остановиться на запросе пароля 
 *, подождать время ожидания. Без приведенного ниже tcsetattr 
 *, когда вы вернетесь к приглашению оболочки, эхо будет по-прежнему отключено. 
 * / 
tcsetattr_stdin_TCSANOW (& G.tty_attrs); 
printf ("\ r \ nLogin time out after% u seconds \ r \ n", TIMEOUT); 
fflush_all (); 
 / * unix API - это мозг поврежден в отношении O_NONBLOCK, 
 * мы должны отменить его, иначе мы можем повлиять на другие процессы * / 
ndelay_off (STDOUT_FILENO); 
 _exit (EXIT_SUCCESS); 
} 
  

[…]

 int login_main (int argc, char ** argv) MAIN_EXTERNALLY_VISIBLE; 
int login_main (int argc UNUSED_PARAM, char ** argv) 
 {
  

[…]

  / * Мы устанавливаем только обработчик тайм-аута _после_ сохранения G.tty_attrs * / 
signal (SIGALRM, alarm_handler); 
alarm (TIMEOUT); 
 

Обратите внимание, что последняя часть не с отступом кажется, что вокруг него нет if , поэтому он всегда выполняется. Возможно, вы могли бы раскомментировать последние две строки и заново скомпилировать busybox , если это возможно.

Альтернативная идея

Из примера inittab busybox :

# <action>: Valid actions include: sysinit, respawn, askfirst, wait, once,
#                                  restart, ctrlaltdel, and shutdown.
#
#       Note: askfirst acts just like respawn, but before running the specified
#       process it displays the line "Please press Enter to activate this
#       console." and then waits for the user to press enter before starting
#       the specified process.

Таким образом, вы можете просто изменить respawn на askfirst . Таким образом, / bin / login по истечении тайм-аута просто вернется к приглашению Пожалуйста, нажмите Enter… вместо того, чтобы сразу снова запустить / bin / login .

2
27.01.2020, 20:38

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

К сожалению, программы входа различаются в этом отношении. логин из (скажем) пакета входа в Debian учитывает конфигурационный файл /etc/login.defs . У меня для параметра LOGIN_TIMEOUT установлено значение 0. Но другие программы входа в систему имеют это неконфигурируемое и жестко запрограммированное. В мире существует не только одна программа входа в систему . ☺

Программа login во FreeBSD - увы! - один такой. То же самое можно сказать о программе входа в систему , которая встроена в Busybox. В первом случае тайм-аут составляет 300 секунд; последнее, всего за 60 секунд .

Код Busybox - это константа времени компиляции. Вам придется фактически изменить исходный код программы и перестроить его, чтобы отключить такое поведение. Согласно комментарию в коде программы FreeBSD login , который объясняет, почему это переменная времени выполнения, а не константа времени компиляции, авторы FreeBSD ожидают, что вы измените это, исправив / usr / bin / login сам двоичный файл.

Есть несколько смягчающих стратегий. Один - увы! - сохранить getty в цикле. Вход FreeBSD вызывается FreeBSD getty , у которого есть возможность - в / etc / gettydefs , которая обычно равна нулю. getty Busybox аналогично имеет параметр -t . Оба означают, что незанятый, не авторизованный последовательный терминал постоянно находится в приглашении login: , отображаемом getty , и тайм-аут в login не начинается.

Я сам не использую getty на виртуальных терминалах. Итак, для FreeBSD у меня есть очень простая программа с приглашением входа в систему , которая просто ждет, пока пользователь нажмет клавишу возврата. А в Linux я выключаю тайм-аут с помощью login.defs , как упоминалось.

Однако для реальных терминалов на последовательных линиях я все еще использую getty .

Дополнительная литература

4
27.01.2020, 20:38

Теги

Похожие вопросы