Каждый, кто активно использует виртуальные консоли в обыденной жизни, сталкивается с необходимостью регистрации на каждой из них - от имени ли какого-либо пользователя, или в качестве администратора. Уже при шести умолчальных консолях процесс этот может показаться утомительным. А при существенно большем их количестве - так и просто обременительным. Нельзя ли как-нибудь актоматизировать его?
Напрашивающееся решение - беспарольный вход в систему, - отнюдь не идеально. Во-первых, это вопиющее нарушение техники безопасности. Конечно, на локальной машине ею можно бы принебречь - все равно, доступ к ней легко получить, загрузившись с любого сменного носителя. Но уже при модемном подключении к Сети и динамическом IP-адресе беспарольный вход очень не рекомендуется. Главное же, он не избавляет от необходимости ввода пользовательского имени, то есть техника безопасности не только нарушается, но и нарушается неоправданно.
И потому были придуманы различные способы автоматизации входа в систему, то есть - автоматической регистрации пользователя в момент активации виртуальной консоли. Они работают вне зависимости от того, открывается ли консоль в момент старта системы или на лету в ходе дальнейшей работы. При этом сами по себе учетные записи пользователей (в том числе и их пароли) остаются в неприкосновенности, и потому удаленный доступ к данной машине все равно требует ввода регистрационных данных.
Несколько таких методов автоматизации входа рассмотрены в статье Адриана Чанга. В ней упомянуты патч к программе mingetty и пакет autologin, а также предложена автоматизация методом "правки напильником". Он основан на использовании опции -l программ семейства getty, которая позволяет подменить выполняемую по умолчанию команду login какой-либо альтернативной. В качестве такой альтернативы предложена простенькая Си-программа, выполняющая все ту же команду login в форме
login -f user_name
с предварительной аутентификацией указанного пользователя.
Метод этот не показался мне удобным. Во-первых, при необходимости регистрации более чем одного пользователя потребуется создавать (и компилировать) по экземпляру такой программы на каждого из них. Во-вторых (и главных), он у меня просто не сработал - стадия аутентификации действительно пропускалась, но пароль на вход запрашивался все равно (кстати, в man (1) login я не нашел никаких указаний на то, что опция -f освобождает от ввода пароля).
Интуитивно понятно, что проблема автоидентификации пользователей может быть решена каким-либо скриптовым методом. И я было занялся сочинением такого скрипта, когда благодаря статье Владимира Попова наткнулся на Perl-сценарий qlogin, специально для того и предназначенный. И к тому же подробно описанный в статье его автора - Брайана Хендерсона.
Установка его очень проста - достаточно распаковать архив и скопировать исполняемый сценарий (qlogin) в подходящее место (а подходящим для такого рода программ по понятным причинам является каталог /sbin). Также неплохо поместить и его man-страницу (qlogin.1) куда следует (у меня в системе - в /usr/man/man1), поскольку в ней содержится исчерпывающая информация по применению этого скрипта.
Правда, дополнительно требуется еще и установить два Perl-расширения. Первое, в соответствие с документацией (~/qlogin/README) находим в подкаталоге ~/qlogin/setgroups, перейдя в который, выполняем
perl Makefile.PL make make install
для помещения в должное место (по умолчанию - в /usr/lib/perl5/5.X.X/i686-linux/). Второе расширение относится к методу контроля за авторизацией, использующему файлы /etc/utmp и /etc/wtmp. В моей системе таковые отсутствуют за ненадобностью, и к тому же само расширение следовало еще скачать с http://cpan.org. Однако без него вполне можно обойтисть, для чего достаточно из 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.
Таким образом, мы обеспечили себя достаточным количеством виртуальных консолей и удобным способом доступа к ним. Теперь посмотрим, как создать в единичной консоли максимальный комфорт для практической работы. Задача эта распадается на две части - комфорт при выводе и комфорт при вводе. Поскольку глаз у нас всего двое, и больше уже не будет (а руки на худой конец можно заменить протезами).