Заметки о Linux-консоли
4. Вопросы автоматизации

Алексей Федорчук
[email protected]

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

Напрашивающееся решение - беспарольный вход в систему, - отнюдь не идеально. Во-первых, это вопиющее нарушение техники безопасности. Конечно, на локальной машине ею можно бы принебречь - все равно, доступ к ней легко получить, загрузившись с любого сменного носителя. Но уже при модемном подключении к Сети и динамическом 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.

Таким образом, мы обеспечили себя достаточным количеством виртуальных консолей и удобным способом доступа к ним. Теперь посмотрим, как создать в единичной консоли максимальный комфорт для практической работы. Задача эта распадается на две части - комфорт при выводе и комфорт при вводе. Поскольку глаз у нас всего двое, и больше уже не будет (а руки на худой конец можно заменить протезами), начнем с вывода.