Заметки о консоли. Вопросы автоматизации
Каждый, кто активно использует виртуальные консоли в обыденной жизни, сталкивается с необходимостью регистрации на каждой из них — от имени ли какого-либо пользователя, или в качестве администратора. Уже при шести умолчальных консолях процесс этот может показаться утомительным. А при существенно большем их количестве — так и просто обременительным. Нельзя ли как-нибудь автоматизировать его?
Напрашивающееся решение — беспарольный вход в систему, — отнюдь не идеально. Во-первых, это вопиющее нарушение правил техники безопасности. Конечно, на локальной машине ими можно бы пренебречь — все равно, доступ к ней легко получить, загрузившись с любого сменного носителя. Но уже при модемном подключении к Сети и динамическом IP-адресе беспарольный вход очень не рекомендуется. Главное же, он не избавляет от необходимости ввода пользовательского имени, то есть техника безопасности не только нарушается, но и нарушается неоправданно.
И потому были придуманы различные способы автоматизации входа в систему, то есть — автоматической регистрации пользователя в момент активации виртуальной консоли. Они работают вне зависимости от того, открывается ли консоль в момент старта системы или на лету в ходе дальнейшей работы. При этом сами по себе учетные записи пользователей (в том числе и их пароли) остаются в неприкосновенности, и потому удаленный доступ к данной машине все равно требует ввода регистрационных данных.
Несколько таких методов автоматизации входа рассмотрены в статье Адриана Чанга (имеющейся в русском переводе
). В ней упомянуты патч к программе mingetty
и пакет autologin
, а также предложена автоматизация методом “правки напильником”. Он основан на использовании опции -l
программ семейства getty
, которая позволяет подменить выполняемую по умолчанию команду login
какой-либо альтернативной. В качестве такой альтернативы предложена простенькая Си-программа, выполняющая все ту же команду login
в форме
$ login -f user_name
с предварительной аутентификацией указанного пользователя.
Метод этот не показался мне удобным. Во-первых, при необходимости регистрации более чем одного пользователя потребуется создавать (и компилировать) по экземпляру такой программы на каждого из них. Во-вторых (и главных), он у меня просто не сработал — стадия аутентификации действительно пропускалась, но пароль на вход запрашивался все равно (кстати, в man (1) login
я не нашел никаких указаний на то, что опция -f
освобождает от ввода пароля).
Интуитивно понятно, что проблема автоматической идентификации пользователей может быть решена каким-либо скриптовым методом. И я было занялся сочинением такого скрипта, когда благодаря статье
Установка его очень проста — достаточно распаковать архив и скопировать исполняемый сценарий (qlogin
) в подходящее место (а подходящим для такого рода программ по понятным причинам является каталог /sbin
). Также неплохо поместить и его man-страницу (qlogin.1
) куда следует (у меня в системе — в /usr/man/man1
), поскольку в ней содержится исчерпывающая информация по применению этого скрипта.
Правда, дополнительно требуется еще и установить два Perl-расширения. Первое, в соответствие с документацией (~/qlogin/README
) находим в подкаталоге path_to_src/qlogin/setgroups
, перейдя в который, выполняем
perl Makefile.PL make make install
для помещения в должное место (по умолчанию — в /usr/lib/perl5/5.X.X/i686-linux/
). Второе расширение относится к методу контроля за авторизацией, использующему файлы /etc/utmp
и /etc/wtmp
. В моей системе таковые отсутствуют за ненадобностью, и к тому же само расширение следовало еще скачать с qlogin
удалить строки, имеющие отношение к utmp
.
Скрипт qlogin
в равной мере пригоден как для интерактивной активизации консолей “на лету” (выступая как замена команды openvt
), так и для автоматической регистрации на них при старте системы (то есть для подмены программ семейства getty
). При использовании qlogin
во втором качестве автор настоятельно рекомендует предварительно “потренироваться в тряпичный” — то есть запустить его с нужными опциями и аргументами из командной строки. Помня при этом, что управляющим терминалом для qlogin
будет та виртуальная консоль, с которой он был запущен.
Аргументов для команды qlogin
, вне зависимости от способа ее применения, требуется два — имя файла целевой консоли и имя пользователя:
$ qlogin /dev/vc/# user_name
Обращаю внимание, что имя файла устройства, в отличие от команды agetty
, должно сопровождаться полным путем (как в моем примере).
Из опций qlogin
(напомню, что их вдоволь можно найти в man-странице) наиболее важна --command
, значением которой будет имя команды, запускаемой на новой консоли вслед за ее открытием и автоидентификацией пользователя. При необходимости команда может сопровождаться собственными опциями и аргументами:
$ qlogin /dev/vc/# user_name --command="command [options] [arguments]"
При этом очевидно, что для экранирования пробелов в этом случае должны использоваться двойные, то есть не строгие, кавычки. Полный путь к исполняемого файлу команды при интерактивном запуске qlogin
не обязателен (если, конечно, путь этот описан в переменной окружения $PATH
).
Очевидно, что интерактивный запуск qlogin
возможен только от лица root’а, поскольку ни один обычный пользователь не имеет соответствующих прав доступа к файлам устройств неактивизированных виртуальных консолей.
Для автоматической регистрации пользователей при старте системы вызов команды qlogin
следует поместить в файл /etc/inittab
вместо команды getty
. Например, если мы хотим на первой виртуальной консоли автоматически авторизовать некоего пользователя “имя рек”, следует изменить первую строку секции описания виртуальных консолей таким образом:
c1:2:respawn:/sbin/qlogin /dev/vc/1 имя_рек
Повторяю, указание полного пути к файлу устройства при этом обязательно, иначе init
, не обнаружив оного, впадет посредством акции respawn
в пятиминутный цикл перезапуска процесса qlogin
.
Опции команды qlogin
можно использовать и при вызове ее из файла /etc/inittab
. Так, благодаря строке
c1:2:respawn:/sbin/qlogin /dev/vc/1 имя_рек --command="/bin/tcsh -l"
при старте системы на первой виртуальной консоли будет не только зарегистрирован пользователь “имя рек”, но для него в качестве login shell загрузится командная оболочка tcsh
вместо той, что предписана ему по умолчанию (например, bash
). А строка вроде
c6:2:respawn:/sbin/qlogin /dev/vc/6 имя_рек --command=/usr/bin/top
обеспечит на шестой консоли вывод программы top
для контроля над запущенными процессами.
Следует только помнить, что вызов какой-либо программы как опции команды qlogin
при этом происходит до считывания каких-либо пользовательских (и многих общесистемных) профильных файлов. Из чего следует, во-первых, необходимость указания полного пути к исполняемому файлу вызываемой программы (как в примере) — ведь переменная $PATH
еще не определена. А во-вторых, сложные программы, зависящие от многих конфигурационных файлов, запустить как опцию команды qlogin
не удастся. Так, моя попытка автоматом грузить на 6-й консоли Инксы “в лоб”, с помощью опции вида --command="/usr/X11/bin/startx"
успехом не увенчалась, вызвав только поток сообщений об отсутствии файлов типа xinit
, xautority
и т.д. Вероятно, задача эта решаема, но как — пока руки не дошли…
И еще следует помнить, что консоль, на которой через /etc/inittab
и qlogin
запущена какая-либо программа, уже не удастся использовать для иных целей: попытка выйти из программы top
(в приведенном выше примере) приведет, благодаря акции respawn
, к перезапуску qlogin
и, через его опцию, нового экземпляра той же программы top
.
Таким образом, мы обеспечили себя достаточным количеством виртуальных консолей и удобным способом доступа к ним. Теперь посмотрим, как создать в единичной консоли максимальный комфорт для практической работы. Задача эта распадается на две части — комфорт при выводе и комфорт при вводе. Поскольку глаз у нас всего двое, и больше уже не будет (а руки на худой конец можно заменить протезами), начнем с вывода.
Содержание . . . .