Open Source, Ubuntu и не только

пятница, 19 сентября 2008 г.

HP LaserJet 1020, принт-сервер и GNU/Linux

Название статьи: HP LaserJet 1020, принт-сервер и GNU/Linux.
Версия: 0.99 (авторская)
Автор: Андрей Василенко
URL публикации 1.0: http://rus-linux.net/lib.php?name=MyLDP/hard/HPLJ_10xx_and_print-server.html

Содержание:
Введение.

В этой статье я расскажу как подружить через сеть принтеры HP LaserJet линейки 10xx и операционные системы семейства GNU/Linux. Данный метод был опробован на Ubuntu Linux 8.04.1 и Debian Lenny (netinst).
Отмечу, что уже в этом случае есть небольшие различия в настройке, так что если у вас другой дистрибутив — будьте осторожнее и лучше не выполняйте непонятные для вас команды. Там, где команды для Ubuntu и Debian отличаются, я буду давать их отдельно.
О железе. Сам я пользуюсь маршрутизатором D-Link DI-704P, к которому подключёны компьютеры, а так же принт-сервер D-Link DP-301U, уже к которому в свою очередь и подключён наш источник проблем — лазерный принтер HP LaserJet 1020. Если у вас другая конфигурация и принтер 10xx, то этот способ всё-равно должен сработать. Но не ручаюсь за модель 1018: как я понял, он, будучи подучи подключённым к принт-серверу и управляемый специализированной программой PS Monitor под Windows®, печатать всё-равно отказывается.
Итак, сначала обрисую проблему, а затем займёмся её решением, благо оно на самом деле довольно простое.

Почему мой не работает, когда соседский отлично печатает?

Это происходит потому, что наш принтер использует технологию WPS (Windows® Printing System). Заключается она в следующем: маршрутизатор запросов печати принимает данные от приложений, которые хотят воспользоваться принтером, и перенаправляет их на провайдер печати. Провайдер печати преобразует передаваемые данные к виду, пригодному для передачи, принтеру (в т.ч. и по сети). Он же и возвращает необходимую информацию от принтера приложению, производя обратное преобразование. Так же в этой системе может существовать специальный монитор, следящий за работой принтера, исправляющий возникающие ошибки и выполняющий прочие функции.
В нашем случае не хватает как-раз такого монитора. Если конкретнее, то при включении наш принтер по большому счёту представляет из себя просто высокотехнологичный, но бесполезный кусок железа. В нём нет прошивки. Если подключение производится по USB, то вроде бы всё понятно: принтер определяется UDEV, после чего для него создаётся нода и выполняется специальное правило, подгружающее прошивку. Но как быть, если принтер физически не подключён к ПК? Выход есть. Рассмотрим процесс настройки принтера с самого начала.

Шаг за шагом.

Перво-на-перво делаем бекап оригинальных файлов, с которыми будем работать.
P.S. «$» перед командой означает, что достаточно прав пользователя, а «#» — нужны полномочия администратора. Лучше используйте две сессии в терминале.

Ubuntu:

$ mkdir ~/_Backup_ && cp ~/.config/menus/applications.menu ~/_Backup_ && cp /usr/bin/foomatic-rip ~/_Backup_

Debian:

$ mkdir ~/_Backup_ && cp ~/.config/menus/gnome-applications.menu ~/_Backup_ && cp /usr/bin/foomatic-rip ~/_Backup_

Нам понадобится Common UNIX Printing System или, проще говоря, CUPS, а так же набор драйверов (на самом деле драйверов много больше, просто в этом пакете есть PPD для нашей линейки 10xx). Устанавливаем, соглашаясь с загрузкой зависимостей:

# apt-get install cupsys foo2zjs

Но, скорее всего, всё это уже установлено в вашей системе.
После этого запустите любой веб-браузер и откройте следующий адрес (подключение к Интернет не потребуется):

http://localhost:631

Будет показана стартовая страница настройки CUPS. Далее по шагам (по завершении каждого жмите «Continue»):

1. Add printer

Введите (произвольно) название, место расположения и описание принтера соответственно.

2. Device for Printer

Из раскрывающегося списка выберите «LPD/LPR Host or Printer»

3. Device URI for Printer

Здесь нам предлагают указать полный LPD-адрес до принтера. Его можно узнать в веб-меню принт-сервера (по умолчанию это http://192.168.0.10) на вкладки «Home», раздела «Printer Status», после «Printer Name». Должно быть что-то вроде «PS-C6D4D2-U1». Таким образом, в зависимости от настроек принт-сервера, нужно ввести:

lpd://192.168.0.10/PS-C6D4D2-U1

4. Make/Manufacturer for Printer

В этом меню необходимо выбрать производителя и модель принтера. Мы используем имеющиеся у нас драйверы, так что в «Make» выбирем «HP», а после нажатия «Continue» отметим пункт «HP LaserJet 1020 Foomatic/foo2zjs (recommended) (en)». Нажмите «Add Printer».

После этого вас потребуют ввести имя пользователя, имеющего привилегии администратора (root) и пароль. Всё, основная часть настройки принтера позади. Теперь вы можете заглянуть, при необходимости, в раздел «Manage printers» главного меню настройки CUPS и обнаружить там свой принтер. Помимо всего прочего можно сделать данный принтер используемым по умолчанию, нажав на кнопку «Set As Default», а так же произвести его настройку в меню «Set Printer Options».
Если появились проблемы, то в Интернете есть уйма информации по «банальной» установки и настройки принтера под GNU/Linux и, думаю, читатель без труда её отыщет. В этом материале рассказывается не об этом.
Теперь настало время перейти к оживлению нашего принтера.

Первый вздох.

Итак, всё вроде бы настроено, но при попытке произвести пробную печать, воспользовавшись кнопкой «Print Test Page», получаем молчание, хотя если посмотреть в лог принт-сервера, то задание для печати там должно быть. Как уже писалось выше, на данный момент в принтере отсутствуют «мозги». Чтобы это исправить, нам будет нужна сама прошивка, в последствии немного модифицированная.

Загружаем прошивку:

# getweb 1020

Модифицируем для возможности загрузки «печатью», удаляем оригинал, после чего переносим прошивку на новое место:

# arm2hpdl sihp1020.img > sihp1020.dl
# rm sihp1020.img && mv sihp1020.dl /usr/share/foo2zjs/firmware


Теперь, убедившись что принт-сервер и CUPS настроены верно, снова произведём тестовую печать, но в этот раз уже определённого файла (наверно уже догадались какого ;) ):

$ lp /usr/share/foo2zjs/firmware/sihp1020.dl

Принтер должен зашевелиться! Но ничего не печатать. С этого момента он обрёл разум и теперь может печатать что вы укажите, но до первой перезагрузки, после которой процедуру «печати» прошивки нужно будет повторить. На этом можно было бы и закончить, но рассмотрим как можно сделать процесс «оживления» более удобным, не лазя каждый раз в терминал.

Just for Fun.

1. Если не лень

Сделаем скрипт и иконку для него в главном меню (с картинкой только для Ubuntu, т.к. в пакет foo2zjs для Debian соответствующая gif'ка не входит). Начнём со скрипта. Создадим его и выставим права чтения и исполнения для всех пользователей ПК:

# echo -e "#! /bin/sh\n\nlp /usr/share/foo2zjs/firmware/sihp1020.dl" > /usr/bin/hploader
# chmod 0775 /usr/bin/hploader


Следующая страшнющая с виду команда (всё это — одна строка) создаст ярлык запуска «Активация принтера» с изображением самого принтера и добавит его в меню «Приложения» - «Прочие»:

Ubuntu:

$ echo -e "[Desktop Entry]\nEncoding=UTF-8\nVersion=1.0\nType=Application\nTerminal=false\nIcon[ru_RU]=/usr/share/foo2zjs/hplj1020_icon.gif\nName[ru_RU]=Активация принтера\nExec=/usr/bin/hploader\nComment[ru_RU]=Активирует по сети принтер HP LaserJet 10xx\nName=Активация принтера\nComment=Активирует по сети принтер HP LaserJet 10xx\nIcon=/usr/share/foo2zjs/hplj1020_icon.gif" > ~/.local/share/applications/hploader.desktop && sed -i -e '/Other<\/Name>/ a \ \t\t\n\t\t\thploader.desktop\n\t\t' ~/.config/menus/applications.menu

Debian:

$ echo -e "[Desktop Entry]\nEncoding=UTF-8\nVersion=1.0\nType=Application\nTerminal=false\nName[ru_RU]=Активация принтера\nExec=/usr/bin/hploader\nComment[ru_RU]=Активирует по сети принтер HP LaserJet 10xx\nName=Активация принтера\nComment=Активирует по сети принтер HP LaserJet 10xx" > ~/.local/share/applications/hploader.desktop && sed -i -e '/Other<\/Name>/ a \ \t\t\n\t\t\thploader.desktop\n\t\t' ~/.config/menus/gnome-applications.menu

Если боитесь испортить меню (у меня всё сработало), запустите

$ alacarte

входящий с состав обоих дистрибутивов или

$ gmenu-simple-editor

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

2. Если лень

Вариант для тех, у кого в аптайме не недели и месяцы, да и принтер включён не постоянно.
Здесь будет рассмотрено, как изменить один фильтр для CUPS, добавив запуск нашего скрипта после каждой подачи задания на печать, что избавит вас от специального тыканья по кнопке. Конечно, если вы много и часто печатаете, то этот вариант вас, полагаю, не устроит. Но для тех, кто не держит принтер постоянно в режиме готовности и не печатает тонны документов, он вполне подойдёт.
Проведя не очень большое, но достаточно нудное исследование, я обнаружил в своей системе скрипт-фильтр на Perl, который исполняется при каждой печати. Его-то и было решено модифицировать. Наше задание с прошивкой будет добавляться после основного. Хотя и после первой печати основное задание пропадает, а «печатается» только прошивка (конечно, если не была загружена до этого), но зато потом она будет подгружаться уже после основного задания, не задерживая его. Теперь рассмотрим как это реализовать.

Сначала идут такие же действия, как и в предыдущем варианте:

# echo -e "#! /bin/sh\n\nlp /usr/share/foo2zjs/firmware/sihp1020.dl" > /usr/bin/hploader
# chmod 0775 /usr/bin/hploader


Но затем никаких значков создавать не будем, а просто добавим в тот самый скрипт пару строк:

# sed -i -e '/#!\/usr\/bin\/perl/ a \$cmd="hploader";\nsystem $cmd;' /usr/bin/foomatic-rip

Теперь можете произвести пробную печать и в случае успеха перейти к Заключению :)

Заключение.

Автор статьи искренне надеется, что его труд не прошёл даром и помог читателю. Если же вас постигла неудача — не отчаивайтесь. Внимательно повторите шаги, попробовав сделать что можете «вручную» (всякое возможно, в т.ч. дистрибутивно-специфические отличия), предварительно подчистив то, что насоздавали и восстановив файлы из заблаговременно созданного бекапа:

$ sudo -i

или

$ su

потом

# export USER=<имя вашей учётной записи, например vasya>


Ubuntu:

# rm -f /usr/share/foo2zjs/firmware/sihp1020.dl /usr/bin/hploader /home/$USER/.local/share/applications/hploader.desktop && cp -f /home/$USER/_Backup_/applications.menu /home/$USER/.config/menus && cp -f /home/$USER/_Backup_/foomatic-rip /usr/bin && chmod 0775 /usr/bin/foomatic-rip

Debian:

# rm -f /usr/share/foo2zjs/firmware/sihp1020.dl /usr/bin/hploader /home/$USER/.local/share/applications/hploader.desktop && cp -f /home/$USER/_Backup_/gnome-applications.menu /home/$USER/.config/menus && cp -f /home/$USER/_Backup_/foomatic-rip /usr/bin && chmod 0775 /usr/bin/foomatic-rip

Если возникли вопросы или хотите что-то уточнить/дополнить, то свяжитесь со мной по электронной почте. Удачи!


Текст документа распространяется под лицензией GNU Free Documentation Licence

вторник, 2 сентября 2008 г.

Удалённый доступ Linux-to-Linux, или Просто об SSH и VNC.

     Когда пришлось решать проблему удалённого доступа между правильными ОС, встал вполне логичный вопрос о том, как это осуществить. В голову сразу пришёл протокол SSH, о котором уже как-то читал, но не решался попробовать в действии, т.к. полагал что всё будет нудно и сложно, да и вообще мне это было не нужно. На самом деле, в простейшем случае, это совсем не так. Итак, если у вас и на обоих ПК установлен дистрибутив Ubuntu Linux, то получить графический доступ к рабочему столу, но по протоколу VNC, можно вообще в пару кликов мыши.

VNC

     Для этого сначала на удалённом ПК зайдите в "Система -> Параметры -> Удалённый рабочий стол" или в терминале выполните (сразу условимся: "$" перед командой - достаточно прав пользователя, а "#" означает, что нужны привилегии рута):

$ vino-preferences

После этого откроется окно настроек.
     Итак, для предоставления доступа нужно отметить пункт "Позволять другим пользователям видеть ваш рабочий стол". На этом можно и остановиться, но посмотрим, что предложили нам в дополнительных настройках. Здесь можно обратить внимание на разделы "Безопасность" вкладки "Общие" и "Уведомления" вкладки "Дополнительно". Можно вообще отключить какое-либо уведомление о подключении, убрав отметки пунктов в разделе "Безопасность", а в "Уведомления" отметив "Никогда не показывать значок". В принципе, настройки не нуждаются в комментариях, всё элементарно. После произведения настроек жмём "Закрыть". Так же необходимо убедиться, что открыты порты диапазона 5000-5006. Всё, ПК готов к соединению.
     Теперь, когда настройки удалённого ПК завершены, перейдём к осуществлению подключения. Для этого уже на рабочем ПК наберём:

$ vncviewer 111.111.111.111:0

Где "111.111.111.111" - IP удалённого ПК, а "0" (нуль) после двоеточия - номер дисплея удалённого ПК. Всё. Если в настройках не были указаны подтверждение или ввод пароля, то сразу откроется окно, в котором и будет отображён рабочий стол удалённого ПК. Можно пользоваться не только управлением мышью, но и клавиатурой. Хочу отметить, что если запустить вот так:

$ vncviewer FullScreen=1 111.111.111.111:0

то рабочий стол будет отображён в полноэкранном режиме, а не в окне. Если вы захотите выйти из полноэкранного режима, то нажмите F8 и уберите соответствующую галочку. Так же здесь имеются дополнительные настройки соединения в меню "Settings", которые так же доступны в виде свойств при запуске vncviewer (в терминале: $ vncviewer --help).
     Данный метод есть смысл использовать только в случае достаточно быстрого Интернет-соединения и на десктоп-ориентированных ПК с X Window System. А так как сам по себе этот протокол всё-таки не отличается особой безопасностью, то работать с ПК, содержащим важные данные, не рекомендуется. В случае работы с важными данными гораздо лучше запускать VNC-сессию через SSH-тоннель. Но это не входит в данный обзор, поэтому пока ограничимся шифрованным доступом к командной оболочки удалённого ПК.

SSH

     С помощью SSH всё не так красочно, но зато быстро и надёжно. Используя SSH можно без проблем организовать надёжный и шифрованный канал между двумя машинами. Приступим.
     Для начала необходимо убедится, что на удалённом ПК работает SSH-сервер:

$ ps -ax|grep sshd

Должна появится строка вроде "5437 ? Ss 0:00 /usr/sbin/sshd". Если это не так, то запускаем

# /etc/init.d/ssh start

или устанавливаем его (демон запустится автоматически):

# apt-get install openssh-server

Убедитесь, что порт 22 для TCP-соединений не закрыт. С удалённой машиной всё :)
     Теперь переходим к поднятию соединения. Убедитесь, что у вас установлен SSH-клиент:

$ aptitude search openssh-client

В начале строки должна стоять буква "i". Если это не так, то:

# apt-get install openssh-client


     Осуществлять аутентификацию будем по двум ключам - приватному (шифрованный) и публичному. Это просто и удобно, лучше чем по паролю на удалённом ПК. Для этого нужно сначала создать эти два ключа:

$ ssh-keygen

Будет задана как минимум пара вопросов. Место расположения ключа оставьте по умолчанию, т.е. на первый вопрос просто нажмите Ввод, а вот потом введите ключевую фразу и в следующем шаге подтвердите ввод. Фраза должна быть более 4-х байт, но лучше с запасом. 6-8 символов вполне подойдут. После этого скопируем публичный ключ на тот самый удалённый ПК через Сеть (трафик шифруется):

$ ssh-copy-id user@ip

Где "user" - название учётной записи пользователя удалённого ПК, от имени которого вы будете работать, а "ip" - IP того ПК. После установления соединения ответьте "yes" на подтверждение передачи публичного ключа через интернет, а потом введите пароль этого аккуанта. Всё, ключ скопирован на удалённый ПК. С этого момента вы сможете заходить на него без ввода пароля пользователя, а лишь вводя свою ключевую фразу для расшифровки своего же (приватного) ключа. Делается это очень просто:

$ ssh user@ip

Таким образом, если вы будет работать под чьим-то аккуантом, то его владелец сможет сменить пароль после передачи ключа, а вы этого даже не заметите.
     Итак, после подключения у вас в терминале/консоли будет выведено информационное сообщение, а строка приглашения изменится на user@server, где "server" - уже имя удалённой машины.



     ВНИМАНИЕ! Это на словах всё должно так просто заработать, на деле могут возникнуть проблемы. Цель статьи - максимально быстро поднять соединение. Я сократил изложение до минимума, опустив даже дополнительные свойства команд.
     НАСТОЯТЕЛЬНО рекомендую ознакомиться с не очень длинной, но крайне познавательной статьёй, по которой автор данного блога SSH и настраивал:
http://www.nixp.ru/articles/ssh
Из неё вы узнаете как перенести ключ "вручную", настроить клиентский и удалённые ПК, о файлах, так или иначе связанных с работой SSH, а так же о повышении безопасности.



Текст сообщения распространяется под лицензией GNU Free Documentation Licence