воскресенье, декабря 19, 2010

несколько заметок о sudo

Имеется система с несколькими пользователями и необходимость запускать программу, требующей для своего запуска привилегии суперпользователя, однако давать привилегии суперпользователя обычным юзерам вы не можете.

Решение можно разделить на несколько этапов:
1)Сначала нужно установить группу пользователей или убедится в их принадлежности к какой-либо имеющейся группе (например. группе users). Для этого идем Yast — Безопасность и пользователи- управление пользователями и группами (в 10.3 - это два отдельных раздела) выбрать пользователя и нажать редактировать, перейти на вкладку «подробности». Здесь в окошке «дополнительные группы» (или просто «группы» в 10.3) мы проверяем принадлежность пользователя к выбранной группе т.е проверяем наличие галочки напротив нужной группы (чтобы не заморачиваться, я выбирал группу users, но при желании можно выбрать любую другую, и если надо что-то оригинальное, таковую можно создать в разделе управление группами) после чего жмем на ОК.
2)Настраиваем sudo. Идем Yast - Безопасность и пользователи - Sudo — в открывшемся окне выбираем правила sudo (обычно это стоит по умолчанию) и жмем добавить. Теперь в меню «Пользователь — группа или псевдоним пользователя» выбираем группу из выпадающего списка (я, как упоминал ранее, выбрал % users); в меню «хост или псевдоним хоста» выбираем ALL, меню «RunAs» оставляем пустым, и самое главное: ставим галочку напротив «Нет пароля». Чуть ниже расположено окно «команды для запуска» здесь мы жмем кнопку добавить и вводим собственно команду, доступ к которой мы хотим разрешить, с указанием полного пути, например /usr/sbin/ ваша_команда ( кстати, если путь указан неправильно, система предупредит об этом), а также, если это необходимо, можно указать дополнительные параметры команды. Теперь два раза жмем ОК и переходим к следующему этапу.
3)Необходимо немного отредактировать файл /etc/sudoers, сделав предварительно резервную копию. Это делается в любом текстовом редакторе, запущенном от рута. Нужно найти строку, которая выглядит примерно так:
%users ALL = NOPASSWD: /usr/sbin/ваша_команда.
Нужно поместить курсор в конец этой строки, удалить бекспейсом символ, отображаемый визуально как точка (подозреваю, что у него есть своё специфическое название) и нажать на Enter и сохранить получившийся файл. (Как мне объяснили, после строчки должен быть знак переноса строки, что, собственно, мы и добились редактированием.)
4)Осталось проверить работоспособность нашей конструкции: открываем терминал и пишем sudo ваша_команда (с дополнительными параметрами, если это необходимо). Если команда сработала — поздравляю, всё получилось.
5)Осталось создать на рабочем столе каждому пользователю иконку и указать в её свойствах команду типа sudo /usr/sbin/ваша_команда.
Удачи!
Из какого то блога:

digger@dignux:~$ sudo cat /etc/sudoers
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root ALL=(ALL) ALL

# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
digger ALL=NOPASSWD: ALL

Добавить в судоерсы как вариант, я о нем думал, но интересно почему так получается в стандартной реализации и где баг. Все-таки забью на проблему и пропишу себя :) Спасиб.

Это не баг. По дефолту дебиан запрещает использование команды sudo тем пользователям которые не прописаны в /etc/sudoers

А если в группу sudo добавить своего пользователя? :)

Такой вопрос: я выключаю комп, вводя sudo halt в консоли, и перегружаю через sudo reboot там же. Надоело уже каждый раз при выключении вводить свой пароль; можно ли как-нибудь сделать так, чтобы при вводе этих двух команд пароль бы не запрашивался?

Это ,кажись, через /etc/sudoers делается. Нужно строчку раскомментировать или добавить. Воспользуйся visudo. В терминале sudo visudo и редактируй файл. И читай , что digger написал.

2Константин digger Поводич: спс огромный за разъяснение. теперь все как надо. :)

2Константин mixer82 Широков: пропиши в судоерсах отмену пароля на эти комманды или вообще отмени запрос пароля при судо.

>digger ALL=NOPASSWD: ALL
вот эта строка ух как опасна

Да это же почти как под рутом сидеть, как я понимаю! Вот лично мне не влом вводить 16-тисимвольный пароль каждый раз, когда нужно, тем более что пароль действует минут пятнадцать... А на ребут можно отдельно поставить nopasswd.

Так, что касается ребута без пароля, то вроде разобрался как это сделать. А есть ли фронтенд к sudo, типа gksu или kdesu, но чтобы не тянул пол-гнома/кедов по зависимостям?

Макс, ага, правильно понимаешь.

Константин, надеюсь, Вы понимаете что есть Фронтенд? Это графика. Так чего вы хотите? Вы используете gksu, у Вас стоит Gnome, так какого банана он с собой еще потащит? GTK есть - все. Так же и с кде.
КДЕ стоит, стоит kdesu. Что за ерунду пишете? Потащит, может быть, пару либ для работы, но это в любом случае.

вот kdesudo, gksudo не ставится по дефолту, а kdesu и gksu тянутся зависимостями

А если не стоит ни гном, ни кде, а стоит какой-нибудь флюксбокс или, как в моём случае, icewm. И принцип анонимуса о том, что десктоп не нужен и все эти его либы тоже.
А хотя ладно, чёрт с ним. Если независимого от десктопов фронтенда нет, то и консольный su-to-root устроит.

>digger ALL=NOPASSWD: ALL
вот эта строка ух как опасна

Извини, но у меня в системе только один юзер - я. ЗАчем мне извращатся чтобы выполнить команду с помощью sudo?

Блин, пофиг сколько юзверей на машине. Фишка не в этом.

Cmnd_Alias SYS = /sbin/halt, /sbin/reboot
digger ALL = NOPASSWD: SYS

Вот этого хватит. Нефиг делать еще что-то беспарольное.

Или ползи под обратно винду и сиди там под админом.

Уважаемый, попрошу повежливее. Я ведь тоже послать могу, и не только в винду

Посылайте. Вот только объясните мне свою точку зрения, почему можно выставлять ALL? В данном случае абсолютно всё равно сколько пользователей в системе, это не для того сделано

sudo perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

Воистину... не сочтите за паранойю, но я и на домашней машине убрал 10-минутное окно на sudo. Теперь сначала стоит подумать, стоит ли что-либо делать под судо, перед тем как вводить. Они же сами пишут, что
great knowledge leads to great responsibility.

Кстати, в x таки объяснили, что в дебиане по дефолту для sudo надо вводить пароль юзера а не рута.

Ема народ, так это естесственно!

Это и есть основная идея sudo, что требуется пароль юзера.
Кстати, я так и не понял, таймстампы в судо всетаки опасны, или их не удастся никак использовать сторонней программе? И если они - таки опасны, то как их отключить? Я не нашел в мане.:)

Убрал таки отмену запроса пароля и прописал себя в судоерсы :)

Всем спасиб за ответы.

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

попадется скрипток, по дурости запускаешь, а в нутри волшебные самые элементарные строки:
#!/bin/sh
sudo rm -rf /*

а потом будете орать, что никсы дырявые! Сами же себе проблемы делаете.

>Знаешь Миша, а можно еще хер себе дверью специально прищемить
>и потом всем рассказывать про неправильные двери.

(с) LOR ( )

2Артём Thomas Павлович: я наоборот убрал беспарольное судо и прописал юзера чтобы он мог пускать судо (ведь не прописав юзера в sudoers он даже судо пускать не может), НО с обязательным запросом пароля. Ещё раз повторюсь что раньше я жил под SuSe, где по дефолту надо вводить пароль рута, и столкнувшись в дебиане с непоняткой я спросил.

А. Извините, не правильно понял. К стати, цитата с Лора тоже на тему suse :)

Я когда на SuSe жил пару лет, сначала не мог понять почему её все ругают. С выходом 10.3 я начал достигать просветления. Ушел в убунту но тоже что-то не то, ставил слаку, поднимал на моем буке все, т.е. все работало, но не совсем мне подходит её идеология. Вот пришел к логическому завершению скитаний :) А на безопасности я никогда не экономил, т.к. видел что можно сделать с дырявой системой. :)

И ещё из одного:

о поводу использования Sudo в Ubuntu и отсутствие как такового рута - сказано много. Я лишь выскажу своё мнение. Sudo отличная утилита с помощью которой можно например дать права рута отдельному пользователю и только к примеру на выполнение одной единственной команды. Но в случае с UBUNTU не все так гладко, объясню чуть ниже. Что нужно было сделать, нужно создать пользователя на всех серверах UNIX (Ubuntu, Debian Lenny, FreeBSD) и дать ему права только на выполнение команды shutdown, вот сводка примеров того, что может sudo (файл настроек /etc/sudoerc):


ПРИМЕРЫ

Ниже приведены примеры записей sudoers. Возможно, некоторые из них являются выдуманными. Сначала мы определяем свои псевдонимы:


# Определение псевдонимов пользователя
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBMASTERS = will, wendy, wim


# Определение псевдонимов Runas (Выполнить как)
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase


# Определение псевдонимов машин
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Host_Alias CUNETS = 128.138.0.0/255.255.0.0
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = master, mail, www, ns
Host_Alias CDROM = orion, perseus, hercules


# Определение псевдонимов Cmnd (команд)
Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
/usr/sbin/restore, /usr/sbin/rrestore
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias HALT = /usr/sbin/halt, /usr/sbin/fasthalt
Cmnd_Alias REBOOT = /usr/sbin/reboot, /usr/sbin/fastboot
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \
/usr/local/bin/tcsh, /usr/bin/rsh, \
/usr/local/bin/zsh
Cmnd_Alias SU = /usr/bin/su

Здесь мы переопределим некоторые встроенные значения по умолчанию. Мы хотим, чтобы sudo регистрировал события при помощи syslog(3), во всех случаях используя метод auth. Мы не хотим, что бы sudo читало лекции всем пользователям, и пользователь millert не должен указывать пароль. В добавок, на машинах в SERVERS Host_Alias мы держим дополнительный локальный файл журнала и удостоверимся, что мы регистрируем год в каждой строке файла журнала, так как записи журнала будут сохраняться в течение нескольких лет.


# Переопределяем встроенные значения по умолчанию
Defaults syslog=auth
Defaults:FULLTIMERS !lecture
Defaults:millert !authenticate
Defaults@SERVERS log_year, logfile=/var/log/sudo.log

Определение пользователя является частью, которая фактически определяет кто что может выполнять.


root ALL = (ALL) ALL
%wheel ALL = (ALL) ALL

Мы позволим супер-пользователю (root) и любому пользователю в группе wheel выполнить любую команду на любой машине от имени любого пользователя.


FULLTIMERS ALL = NOPASSWD: ALL

Системные администраторы занятые полный рабочий день (millert, mikef и dowdy) могут выполнить любую команду на любой машине без аутентификации.


PARTTIMERS ALL = ALL

Системные администраторы занятые не полный рабочий день (bostley, jwfox и crawl) могут выполнить любую команду на любом компьютере, но сначала должны себя аутентифицировать (так как в записи отсутствует тэг NOPASSWD).


jack CSNETS = ALL

Пользователь jack может выполнить любую команду на машинах с псевдонимом CSNETS (сети 128.138.243.0, 128.138.204.0 и 128.138.242.0). Из этих сетей только <128.138.204.0> имеет явную сетевую маску (в соответствии с CIDR) означающую сеть класса C. Для остальных сетей в CSNETS в случае соответствия будет использоваться сетевая маска машины.


lisa CUNETS = ALL

Пользователь lisa может выполнять любую команду на любой машине с псевдонимом CUNETS (сеть класса B 128.138.0.0).


operator ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,\
/usr/oper/bin/

Пользователь operator может выполнять команды ограничивающиеся простым обслуживанием. В данном случае таковыми являются резервное копирование, уничтожение процессов, система печати, выключение системы и любая команда в каталоге /usr/oper/bin/.


joe ALL = /usr/bin/su operator

Пользователь joe может выполнять только su(1) оператору.


pete HPPA = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root

Пользователю pete разрешено изменять любой пароль, за исключением пароля супер-пользователя (root) на машинах HPPA. Учтите, что passwd(1) не воспринимает несколько имен пользователей подряд в одной командной строке.


bob SPARC = (OP) ALL : SGI = (OP) ALL

Пользователь bob может выполнять любые команды на машинах SPARC и SGI, как пользователь описанный в Runas_Alias в OP (root и operator).


jim +biglab = ALL

Пользователь jim может выполнить любую команду на машинах в сетевой группе biglab. Sudo знает, что biglab является сетевой группой из-за префикса +.


+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser

Пользователи в сетевой группе secretaries должны как помогать в управлении принтерами, так и добавлять или удалять пользователей. Таким образом им позволено выполнять эти команды на всех машинах.


fred ALL = (DB) NOPASSWD: ALL

Пользователь fred может выполнять команды от имени любого пользователя в Runas_Alias DB (oracle или sybase), без указания пароля.


john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*

На машинах ALPHA пользователь john может выполнить su любому пользователю, за исключением супер-пользователя (root), но не имеет права задавать su(1) какие-либо флаги.


jen ALL, !SERVERS = ALL

Пользователь jen может выполнить любую команду на любой машине, за исключением машин в Host_Alias SERVERS (master, mail, www и ns).


jill SERVERS = /usr/bin/, !SU, !SHELLS

Для любой машины в Host_Alias SERVERS jill может выполнить любую команду в каталоге /usr/bin/, за исключением команд относящихся к Cmnd_Aliases SU и SHELLS.


steve CSNETS = (operator) /usr/local/op_commands/

Пользователь steve может выполнить любую команду в каталоге /usr/local/op_commands/, но только как пользователь operator.


matt valkyrie = KILL

На своей персональной рабочей станции, valkyrie, matt необходима возможность уничтожать зависшие процессы.


WEBMASTERS www = (www) ALL, (root) /usr/bin/su www

На машинах www, любой пользователь в User_Alias WEBMASTERS (will, wendy и wim), может выполнить любую команду как пользователь www (который является владельцем web-страниц) или просто su(1) к www.


ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
/sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM

Любой пользователь может монтировать или размонтировать CD-ROM на машинах в Host_Alias CDROM (orion, perseus, hercules) без ввода пароля. Ввод этого несколько утомителен для пользователей, поэтому это первейший кандидат для включения в сценарий оболочки.


Взято из мануала к sudoerc на opennet.

Согласно выше написанному, мне подходит срока:

operator ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,/usr/oper/bin/


Меняю ее под свои нужды:

user ALL = SHUTDOWN


(Не забудте создать пользователя user в системе!)
ВАЖНО! настройки начал с Debian Lenny, как известно встроенный root имеется. Так вот, захожу под этим пользователем и ввожу

sudo shutdown -r now


на что система говорит, данную команду может выполнить только root. Так вот!!!! в DEBIAN формат строки в sudoerc немного отличается и надо было прописать

user ALL = /sbin/shutdown


ИМЕННО ТАК! после этого пользователь user в Debian Lenny смог выполнить команду

user ALL = /sbin/shutdown


Остальные команды и операции в системе от имени рута ему запрещены, что и требовалось настроить.

Следующий этап, это настройка системы UBUNTU, все тоже самое. Создаю пользователя user и так как есть уже рабочая строка в sudoerc на Debian ее и добавляю в sudoerc

user ALL = /sbin/shutdown


Сохраняю файл и выхожу и вот тут самое интересное, при попытке выполнить sudo любая команда от системного пользователя или от пользователя user я получаю ошибку в строке 23 (это добавленная строка). Что это значит, это значит, что раз в системе нет как такового рута я не смогу поправить файл sudoerc! не смогу выполнить ни одной команды требующей прав рута, даже выключить или перезагрузить корректно сервер не смогу. Ситуация в которой приходится править файл sudoerc, если это не домашний ПК, достаточно частая и достаточно часто получается такая незадача. Возможно кто то подумает что я драматизирую и что достаточно подойти к серверу, ребутнуть его, загрузится с лайв СД и делов то. Но что если сервер за 350 км? и все настройки выполняются удаленно через консоль SSH?
Меня спасло то, что root в системе был создан очень давно, пароль к сожалению не помнил, но смог сменить его через Webmin, который так же присутствовал на системе, иначе было бы худо.
После смены пароля зашел в систему уже рутом, через su и пароль рута, далее поправил файл sudoerc, в UBUNTU синтаксис строки не такой как в Debian и надо писать:

Cmnd_Alias SHUTDOWN = /sbin/shutdown


user ALL = SHUTDOWN



ИТОГ: Создавайте в системе полноценного ROOT, даже если вы им не пользуетесь, это спасет в непредвиденных ситуациях с ошибками в файле sudoerc или его порчей. Как это сделать, можно прочитать здесь...

P.S. ... производите правки sudoerc с помощью специальной утилитой visudo, защита sudo и проверка синтаксиса обеспечены, возможно это сохранит вам немного нервов и позволит избежать вышеописанного.

Удачи!
H@wk!
/Охальников Олег/

Настройка принтера на Linux

From: Сергей(Mkay82)
Newsgroups: email
Date: Mon, 23 May 2006 14:31:37 +0000 (UTC)
Subject: Настройка рабочего места ( Linux + принтер + клиент rdesktop)

Настройка рабочего места ( Linux + Open Office + HP LaserJet 1000 + rdesktop)

Доброго времени суток! Как-то мне поручили собрать рабочее место которое бы
работало бы как печатная машинка и одновременно работало бы с терминал сервером
(win 2003) в качестве клиента. Так же мне необходимо было зацепить на эту машину
принтер hp1000. В этой статье я опишу вкратце мои действия.

За основу я взял Linux Fedora Core 4.

1) Устанавливается он почти так же как и win XP, надо только при установке не
забыть поставить галки напротив CUPSD и FOOMATIC - обе эти приблуды должны
располагаться в секции, каким-то образом связанной с печатью, например,
"Печать" или "Printing" или что-то в этом духе. Так же при установке можно
настроить и сетевуху, можно, конечно, этого и не делать, но сеть вам все равно
рано или поздно понадобиться. После того как много раз нажали "Нехт" и
перегрузились можно переходить к шагу 2.

2) Будем считать, что при установке мы все сделали правильно в том числе
выставили и корректный язык - а именно русский. В итоге у нас должна быть
голая машина которая слегка прикрыта kde или gnom'om, а так же способна
пинговать все, что только дозволил провайдер. И если ваш админ не жмот - то
позволит стянуть вам с http://www.openoffice.org около 120 Mb офиса (там на
сайте есть ссылка "Projects": в ней надо найти RU - там
есть полностью локализованный офис). Распаковываем все что скачали и
устанавливаем следующим образом:

# rpm -Uhiv *rpm


По выполнению этой команды оно все развернется в /opt/openoffice.org2.0 ну или
около того ;)

После того как развернули офис надо добавить виндовые шрифты

Для этого надо папку Fonts из каталога Windows скопировать ну скажем в
/usr/X11R6/lib/X11/fonts/TTF
хотя куда вы их зальете это дело вкуса.

Затем надо добавить этот путь в переменную FontPath в /etc/X11/xorg.conf,
но я поступил проще - в /etc/fonts/fonts.cong добавил следующую строчку

/usr/X11R6/lib/X11/fonts/TTF


и все заработало.

3) Самое веселое - настраиваем принтер!!!

Если вы специально ни чего не делали с вашим ядром, то там уже есть поддержка
USB, поэтому смело заходим на http://foo2zjs.rkkda.com/ и скачиваем
http://foo2zjs.rkkda.com/foo2zjs.tar.gz

после чего вводим следующее:

# tar zxf foo2zjs.tar.gz ; это мы вроде как распаковали
# cd foo2zjs ; переходим в создавшийся каталог
# make ; очень сложная команда которая не поддается описанию, но без нее не обойтись ;))))
# make install ; а эта команда устанавливает результат предыдущей команды (ее желательно исполнить от root'a)


далее вводим:

# cat sihp1000.img > /dev/usb/lp0 ; при вводе этого принтер должен зашуршать


Теперь все готово для запуска CUPSD. Для этого вводим:

# /etc/init.d/cups start


Но для наглядности, и если у вас KDE (я не помню где это в Gnom искать) можно
сделать "Пуск->Системные параметры->Настройка сервера->Службы" Там все демоны
можно запускать одним тычком мыши. Если же у вас нет KDE то попробуйте ввести:

# /usr/bin/system-config-services ; это даст тот же эффект


4) Далее настраиваем foomatic!
Для этого втыкиваем следующую команду:

# foomatic-configure -s cups -p HP-LaserJet_1000 -c file:/dev/usb/lp0 -n hp1000 -d foo2zjs


в данном случае /dev/usb/lp0 это то к чему подключен принтер.

После этого надо любым браузером (ну скажем мозиллой так как она тоже входит в
дистрибутив) зайти на http://localhost:631 (там спросят рутовый пароль),
находим кнопку "Add printer" - в общем с приятным интерфейсом я думаю вы
разберетесь. Там же вы найдете кнопку печати тестовой страницы - "Print Test Page".

Ну, в принципе, можно печатать! (Там есть еще один нюанс - в /etc/init.d/cups
в процедуру старта можно прописать руками строчку

cat sihp1000.img > /dev/usb/lp0


чтоб принтер оживал вместе с его запуском)

5) Ну вот и самое последнее - настраиваем терминал-клиент!

Делается это очень просто: находим в сети rdesktop*.tar.gz (я лично просто
воспользовался http://www.filesearch.ru), распаковываем, набираем
последовательно:

# ./configure
# make
# make install


Вот и все! терминал клиент стоит! Чтобы им законектиться нужно ввести

# man rdesktop


и прочитать все что там написано - но если читать лень то привожу командочку
которая соединяется с сервером, таща за собой принтер и при этом не запускает
експлорер, а напрямую подключается в 1С:

# rdesktop -f -u admin -p g1pErpassw0Rd -a 16 -E -s \
'c:\Program files\1Cv77\bin\1cv7s.exe' 192.168.1.11


(все имена, пароли, пути запуска и IP адреса являются вымышленными -
любое совпадение - совпадение)

Вот собственно и все!

З.Ы. Огромное спасибо GentooMan за статью на
http://uls.gnu.kz/articles/2.html по настройке принтера!

HP 1020 и Debian Lenny

Проблемы с данным принтером у меня были на всех дистрах.
Погуглив, в третьей строке увидел ссылку: http://www.helplinux.ru/hp-laserjet-10xx

Принтеры Hp Laserjet 10xx (1000 1005 1018 1020) в Linux
Отвечаем на вопрос почему данные принтеры не работают в Linux и как это исправить.
Преамбула

Принтеры HP LaserJet 1000, 1005, 1018 и 1020 сразу после включения питания не имеют в себе прошивку (firmware, arm binary). Операционная система при обнаружении принтера должна "залить" в него необходимую прошивку и после этого работать как с обычным принтером. (Именно этим объясняется тот факт, что если не выключая принтер перезагрузиться из известной нам операционной системы от MS в Linux, принтер будет работать).
Как происходит "заливка" прошивки?

В современном Linux события о появлении новых устройств обрабатывает специальная служба udev. Правила обработки событий, т.е. что будет происходить при обнаружении новой железки, находятся в /etc/udev/rules.d/. В Ubuntu правила для принтеров обсуждаемых в данной статье находятся в файле /etc/udev/rules.d/85-hplj10xx.rules (пример для Ubuntu Gutsy).
Если правила в udev есть, почему принтер не работает?

Дело в том, что правила есть, а самих прошивок нет. Причины этого не понятны, но и не особо интересны. Мы можем скачать их сами и положить туда, где udev, в соответствии с правилами, их найдёт.
Как скачать прошивки?

В Ubuntu по умолчанию установлен пакет foo2zjs, которые содержит необходимые нам утилиты:
getweb - утилита которая "сливает" прошивки с foo2zjs.rkkda.com (вызывается следующим образом: getweb 1020 - скачает прошивку для HP LaserJet 1020)
arm2hpdl - утилита, которая добавляет необходимые заголовки для принтера HP к бинарному файлу arm (смотрите man arm2hpdl), после добавления заголовков прошивку можно заливать в принтер (этим и занимается udev)

Для проверки можно залить прошивку вручную следующим образом: cat sihp1020.dl > /dev/usb/lp0, где /dev/usb/lp0 нода устройства принтера. Нода может быть и другой, например /dev/usblp0, чтобы узнать наверняка, можно посмотреть dmesg|tail -20 после включения принтера.
Куда их положить?

Положить нужно в /usr/share/foo2zjs/firmware/
А теперь готовое решение в виде скрипта

Проверенно в Ubuntu 7.04 и 7.10
#!/bin/bash
printers="1000 1005 1018 1020"
cd /tmp
for prn in $printers; do
img="sihp${prn}.img"
dl="sihp${prn}.dl"
getweb $prn
if [ -f $img ]; then
arm2hpdl $img > $dl
sudo cp $dl /usr/share/foo2zjs/firmware/$dl
rm $img $dl
fi;
done

Чем данное решение лучше других, которые можно найти в интернет?

Другие решения помимо основной задачи, а именно, установки прошивок, выполняют другие лишние действия, например, заново устанавливают foo2zjs (который уже есть в системе), но не из deb-пакета, а из исходных кодов. Это не даёт преимуществ, но может создать проблемы при обновлении системы.

мне хватило:
#getweb 1020
#arm2hpdl sihp1020.img > sihp1020.dl

После этого все заработало
-------------------------------------Не моё, взято с http://semenovevgeni.livejournal.com/tag/hp%201020--------