Pull to refresh

Comments 46

Вы в инструкции используете явно KDE, это видно по редактору) Не лишним тогда уже будет упомянуть, если уж указываете команды, что всё то же самое делается и из консоли (sudo vim/emacs/nano/editor...), и из GTK+ (тот же gksudo gedit). А то ещё начитаются и пойдут кеды ставить)

Пройдусь небольшой критикой:


Шаг 3. Перезапуск CUPS
sudo service cups restart

Wrong! Правильно использовать в зависимости от системы инициализации вашей системы, соответственно:
systemd: sudo systemctl restart cups.service
upstart: sudo initctl start cups или sudo start cups
SysV: sudo /etc/init.d/cups restart


sudo apt-get install kdesudo
kdesudo kate /etc/modprobe.d/blacklist-cups-usblp.conf
комментирование строки blacklist usblp
sudo gedit /etc/modprobe.d/blacklist-cups-usblp.conf

Тут какая-то злобная копипаста, лучше бы прямо указали, что в kde используйте kdesudo вместо sudo. А то кто-нибудь слепо поведется и затянет себе метров на 200 пакетов в не-kde DE устанавливая kdsudo.


Конечно на вкус и цвет все фломастеры разные, но если от консоли кровь не идет из глаз, то для комментирования 1 строки всяко лучше использовать:
sudoedit /etc/modprobe.d/blacklist-cups-usblp.conf или sudo -e /etc/modprobe.d/blacklist-cups-usblp.conf


Шаг 7. После этого следует запустить демон ccpd
sudo service ccpd start

см.выше


sudo update-rc.d ccpd defaults 20
Затем прописываем в /etc/rc.local
kdesudo kate /etc/rc.local
перед exit 0 добавляем строку /etc/init.d/ccpd restart

Wrong! Мы и так добавили в автозапуск update-rc.d. Зачем еще прописывать в /etc/rc.local? Ну и как вариант, может стоит посмотреть в сторону upstart или systemd ?


Если не секрет какая у вас версия Ubuntu?

> sudo service cups restart
Случайно это не является ли универсальным способом, не зависимым от системы инициализации?

А если и нет, то уж по крайней мере в Ubuntu «sudo service» является предпочтительным способом по сравнению с «/etc/init.d/…» (по крайней мере, в определённых версиях Ubuntu оно ругалось при попытке манипулировать некоторыми скриптами вторым способом и прямым текстом советовало первый — к сожалению, не знаю, с чем это связано).

Да, service — это лишь обёртка, которая дёргает upstart, SysV или systemd в зависимости от того, что установлено. В этом легко убедиться, если посмотреть содержимое /usr/sbin/service. Впрочем, в Ubuntu уже перешли с upstart на systemd, так что можно просто systemctl писать. Команда service осталась лишь для совместимости.

Случайно это не является ли универсальным способом, не зависимым от системы инициализации?

Короткий ответ нет. Более длинный кроется в man service


man service
service(8)                System Managers Manual                 service(8)
NAME
       service - run a System V init script
DESCRIPTION
       service runs a System V init script or upstart job in as predictable an
       environment as possible, removing most environment variables  and  with
       the current working directory set to /.

Правильно будет использовать ту систему инициализации, которая является основной в Вашей системе. Если говорим про Ubuntu, то для 15.04+ то это systemd, если ранние версии то upstart. Конечно отдельное спасибо надо сказать мейнтейнерам Debian, которые так и не осилили переписать скрипты на соответствующие системы инициализации.

UFO just landed and posted this here

service в Ubuntu — угадай что надо запустить SysV или upstart, а может и не угадать и тогда нас ждет веселье. И такой он был сделан на "переходный период" в Ubuntu. В RHEL\Centos 6 пошли другим путем и service используется только для запуска SysV, для upstart используется initctl.


В итоге в Ubuntu мы имеем:
/etc/init.d/ — SysV
initctl — upstart
service — "общая команда" для SysV и upstart
systemctl — systemd

UFO just landed and posted this here
Хоть это в man'е и не отражено, service поддерживает systemd.
Так что таки универсальная в Ubuntu.
Upstart в RHEL6 хоть кто-то использует?
На SO пишут, что оно unsupported и вообще плохое, мне тоже скрипты для EL6 под него не попадались.

Используют, очень редко, но используют. Минусы upstart в RHEL, что версия уж очень древняя, некоторые вещи сделать нетривиально и легче делать через SysV чем городить костыли, ну и в конечном итоге на смену в семерке ему пришел systemd


Однако основной мой посыл был в том, что поведение service более предсказуемое в RHEL, чем в Ubuntu

https://habrahabr.ru/post/312228/#comment_9851838
Centos 6.8: системы инициализации upstart и SysV
$ lsb_release -i -r
Distributor ID: CentOS
Release:    6.8

$ service --version
service ver. 0.91

$ init --version
init (upstart 0.6.5)
Copyright (C) 2010 Canonical Ltd.

This is free software; see the source for copying conditions.  There is NO warranty; not even
for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ ls -l /etc/init/tomcat6.conf 
-rw-r--r--. 1 root root 493 Sep 13 00:07 /etc/init/tomcat6.conf

$ sudo service tomcat6 restart
tomcat6: unrecognized service

$ sudo initctl restart tomcat6
tomcat6 start/running, process 9679

$ sudo restart tomcat6 
tomcat6 start/running, process 9729
То есть в CentOS service неправильно работает?
Но речь-то про Ubuntu.

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial

$ service --version
service ver. 0.91-ubuntu1

$ ls -l /etc/init.d/tomcat8
-rwxr-xr-x 1 root root 7993 вер 16 16:12 /etc/init.d/tomcat8

$ sudo service tomcat8 restart

$ sudo initctl restart tomcat8
sudo: initctl: command not found

$ sudo restart tomcat8
sudo: restart: command not found
То есть в CentOS service неправильно работает?

В CentOS — ванильная версия service от Red Hat которая используется только для запуска SysV скриптов, однако в Ubuntu используется модифицировання версия от Canonical которая запускает SysV и\или Upstart


$ sudo initctl restart tomcat8
sudo: initctl: command not found
$ sudo restart tomcat8
sudo: restart: command not found

Во-первых судя по тому, что command not found у Вас не установлен upstart: apt list --installed upstart
Во-вторых непонятно что вы хотите получить, запуская initctl или restart — эти комманды запустят только upstart job-ы которые расположены в /etc/init/

> которая запускает SysV и\или Upstart
или systemd

Это недокументированная возможность, хотя в коде это есть


Выдержка из /usr/sbin/service
is_systemd=
if [ -d /run/systemd/system ]; then
   is_systemd=1
fi

# When this machine is running systemd, standard service calls are turned into
# systemctl calls.
if [ -n "$is_systemd" ]
then
   UNIT="${SERVICE%.sh}.service"
   # avoid deadlocks during bootup and shutdown from units/hooks
   # which call "invoke-rc.d service reload" and similar, since
   # the synchronous wait plus systemd's normal behaviour of
   # transactionally processing all dependencies first easily
   # causes dependency loops
   if ! systemctl --quiet is-active multi-user.target; then
       sctl_args="--job-mode=ignore-dependencies"
   fi

   case "${ACTION}" in
      restart|status)
         exec systemctl $sctl_args ${ACTION} ${UNIT}
      ;;
      start|stop)
         # Follow the principle of least surprise for SysV people:
         # When running "service foo stop" and foo happens to be a service that
         # has one or more .socket files, we also stop the .socket units.
         # Users who need more control will use systemctl directly.
         for unit in $(systemctl list-unit-files --full --type=socket 2>/dev/null | sed -ne 's/\.socket\s*[a-z]*\s*$/.socket/p'); do
             if [ "$(systemctl -p Triggers show $unit)" = "Triggers=${UNIT}" ]; then
                systemctl $sctl_args ${ACTION} $unit
             fi
         done
         exec systemctl $sctl_args ${ACTION} ${UNIT}
      ;;
      reload)
         _canreload="$(systemctl -p CanReload show ${UNIT} 2>/dev/null)"
         if [ "$_canreload" = "CanReload=no" ]; then
            # The reload action falls back to the sysv init script just in case
            # the systemd service file does not (yet) support reload for a
            # specific service.
            run_via_sysvinit
         else
            exec systemctl $sctl_args reload "${UNIT}"
         fi
         ;;
      force-stop)
         exec systemctl --signal=KILL kill "${UNIT}"
         ;;
      force-reload)
         _canreload="$(systemctl -p CanReload show ${UNIT} 2>/dev/null)"
         if [ "$_canreload" = "CanReload=no" ]; then
            exec systemctl $sctl_args restart "${UNIT}"
         else
            exec systemctl $sctl_args reload "${UNIT}"
         fi
         ;;
      *)
         # We try to run non-standard actions by running
         # the init script directly.
         run_via_sysvinit
         ;;
   esac
fi

По сути, если есть папка /run/systemd/system то дальнейшая работа передается systemd


В любом случае в системе с systemd взаимодействовать со скриптами инициализации стоит все же через systemctl.


P.S.: Еще есть возможность запуска OpenRC.

Читал несколько аналогичных статей, надеясь оживить принтер LBP2900 в Linux Mint 17, 17.2. Всё бесполезно. Линь его как бы почти видит, то есть значок есть, как бы даже в значок что-то отправляется, даже без ошибок, но принтер не оживает.
В чём отличие этой статьи от остальных, которыми забит инет за последние лет 5?
Не уверен, что делал шаг 6, у меня вероятно не KDE. Возможно делал что-то аналогичное.
Я встречал мнение, что из-за особенностей CAPT драйверов от Canon — эти принтеры в принципе не могут работать в линуксе. И, к сожалению, мой случай пока это подтверждает.

Есть кто-то, у кого именно Canon LBP2900 заработал в Ubuntu или Mint?
Есть. Скажу даже больше — завелся как сетевой принтер с ubuntu server в качестве хоста (одно но — я что-то перемудрил с samba, в итоге по сети оно печатало только с linux машин). В общем, у Вас просто что то пошло не так, драйвера ставятся — принтер заводится и печатает
У вас рецепт действий совпадает с этой статьёй или что-то делали по-другому?
+-. Точно не скажу (давненько было), но делал по стандартному мануалу вида «скачать драйвера с canon сайта и завести cups»
Было почти тоже самое только с LBP3010, помогало при включенной системе и принтере, перетыкнуть USB провод, чудно но работало.
Перетыкнуть нужно было один раз? (если да — то в какой момент относительно установки и настройки дров?) Или после каждого рестарта без перетыка не работало?
Каждый раз, после рестарта. Не знаю почему так, если не перетыкать устройства как бы нет.

Под арчем отлично работает. Когда был похожий диагноз, что вроде видит но ничего не печатает — проблема была в том что путь /dev/usb/lp0 не постоянный, привязал по имени устройства вида /dev/lp/by-id/usb-Canon_Canon_CAPT_USB_Device_0000A475R21u. https://wiki.archlinux.org/index.php/udev#Printers

Добрыми людьми давно был написан скрипт автоматической установки — http://help.ubuntu.ru/wiki/canon_capt
Canon lbp2900 я смог заставить работать только на ubuntu 12.04. Подключал по этой инструкции http://help.ubuntu.ru/wiki/canon_capt
Но и то, приходилось частенько перезагружать сам принтер и cups.
У моего отца такой принтер, после нечеловеческих плясок с бубном его удалось оживить на убунте 16.04. Если будет время, то напишу подробную статью. я там даже system.d сервис ручками делал чтобы ccpd поднимался и правила udev хачил.
проверьте следующее:

1) убедитесь что девайс называется именно /dev/usb/lp0. Потому-что в бинарях демона этот путь захардкожен. И если он отличается (у меня принтер опознавался как /dev/usb/lp1) то ничего работать не будет (на тот путь который в ccpdadmin вы указываете драйвер тупо кладет болт). Если девайс отличный от lp0 то нужно создать симлинк на lp0

2) убедитесь что демон ccpd висит в процессах. У меня обычно 2 демона висят (я не знаю почему) если не висит то запустите его ручками.
Ради LBP 1120 держу виртуалку с Windows XP + GhostScript + RedMon. В сеть он раздаётся, как PostScript принтер. Экономлю на печати за счёт ресурсов принтера (мне его ещё лет на 5 хватит для дома) и нечипованных картриджей.
Можно ли теперь то же самое сделать на Linux? Предполагаю, что безопаснее и экономичнее сделать такой же вариант, но на Linux. Что-то типа необслуживаемого Print Server-а.
Вопрос: у кого-нибудь LBP 1120 вообще из под Debian/Ubuntu печатает, в сеть раздаётся?
LBP 1120 элементарно настраивается в web-интерфейсе CUPS'a. Во всяком случае в Арче элементарно.
Главное — поставить драйвера, которые упомянуты в статье.
А как заставить его работать через консоль я написал еще в 2010 году

В сеть не раздаю — нет необходимости.
Но, как подсказали, можно создать виртуальный принтер, расшарить его и перенаправлять все его задания на реальный.
Респектище автору. Настроил по этой статье LBP2900 в CentOS 7, всё работает, пользователь вроде доволен. Причём я эту статью нагуглил, ещё когда она то ли в песочнице лежала, то ли в чулане, то ли где
Ссылка на драйвера Canon не работает.

Вам удалось в конечном итоге запустить ваш LBP2900?

Нет. Бросил эту затею. Починил старый samsung ml1012 — он без проблем сходу заработал и решил проблему.

В общем у меня получилось (для Linux Mint 18).
Установить драйвера.
Затем нужно ВЫКЛЮЧИТЬ принтер.
Потом удалить все уже установленные принтеры(из гуи)
потом, учитывая что принтер висит на 0 usb порту:


sudo /etc/init.d/cups restart
sudo lpadmin -p LBP2900 -m CNCUPSLBP2900CAPTK.ppd -v ccp://localhost:59687 -E
sudo ccpdadmin -p LBP2900 -o /dev/usb/lp0
sudo update-rc.d ccpd defaults

Включить принтер.
Перегрузить.
У меня в результате получилось два принтера LBP2900, и LBP2900-2(который автоматически создает система, и если его удалить или отключить тоже не работает).


В общем мрак.

Большое спасибо автору. Настроил Canon LBP-810 в Mint 17.3, потом сделал его сетевым через Ubuntu Server 14.04.
Есть замечательный скрипт на help.ubuntu.ru. Всё заработало с первого раза, до этого пытался несколько раз настроить вручную, ничего не выходило.
Подскажите пожалуйста как Вы решили проблему с печатью черных листов вместо нормальных страниц из некоторых (достаточно случайных) PDF и PS? Проблема со стандартными средствами gnome/unity, при этом из акробата и libreoffice печатает хорошо. Так-же проблем не наблюдается если печатать из Windows или из Ubuntu через прошареный на Windows принтер.
Ну с capt принтерами у меня проблем не было(я ставил на centos 6.5) x64…
И те, перечисленные, модели уже устаревшие.
а вот вышел новый… уже Canon lbp 6030 через ccpd не работает, а работает через usb напрямки (как HP,Brothers и т.д)
И у меня он так и не завёлся.
В инструкции не хватает 2 шагов.
Шаг 9:
Больше никогда, ни в коем случае, ни при каких условиях не покупаем эти поделки от Cannon.
Шаг 10:
Всеми силами стремимся не допустить приобретение этой «техники» компаниями, в которых мы админим и знакомыми, которые обращаются к нам за советом.

Ибо если сделали печать только по своему недоделанному зашифрованному протоколу и на отрез отказываются открывать спеки, то хотя бы дрова нормальные писали. Сам столкнулся с необходимостью организовать печать с линуксовых тонких клиентов через LBP 2900 и 6000. Эта гадость то печатает, то нет (причём без каких-либо ошибок в логах и с успешным статусом задания), в простое жрёт 100% CPU и ещё слетает беспричинно так, что этот недодрайвер приходится сносить и заново ставить. Так что лично я шаг 9 и 10 вообще перед всей остальной инструкцией поместил бы.
В свое время наткнулся на скрипт, который реально мне помог.

скрипт
#!/bin/bash

##################################################
#версия 2.9 от 5 сентября 2014 года
#http://help.ubuntu.ru/wiki/canon_capt
#http://forum.ubuntu.ru/index.php?topic=189049.0
##################################################

#проверка на суперпользователя
[ $USER != 'root' ] && exec sudo "$0"

#пользователь под которым мы вошли в ситему
LOGIN_USER=$(logname)
[ -z "$LOGIN_USER" ] && LOGIN_USER=$(who | head -1 | awk '{print $1}')

#подгружаем файл содержащий путь до рабочего стола
if [ -f ~/.config/user-dirs.dirs ]; then 
	source ~/.config/user-dirs.dirs
else
	XDG_DESKTOP_DIR="$HOME/Рабочий стол"
fi

#версия драйвера
DRIVER_VERSION='2.60-1'

#ссылки на пакеты драйвера
declare -A URL_DRIVER=([amd64_common]='https://googledrive.com/host/0Byemcyi98JRjUjJKMnlqSVVnVlk/cndrvcups-common_2.60-1_amd64.deb' \
[amd64_capt]='https://googledrive.com/host/0Byemcyi98JRjUjJKMnlqSVVnVlk/cndrvcups-capt_2.60-1_amd64.deb' \
[i386_common]='https://googledrive.com/host/0Byemcyi98JRjUjJKMnlqSVVnVlk/cndrvcups-common_2.60-1_i386.deb' \
[i386_capt]='https://googledrive.com/host/0Byemcyi98JRjUjJKMnlqSVVnVlk/cndrvcups-capt_2.60-1_i386.deb')

#ссылки на утилиту autoshutdowntool
declare -A URL_ASDT=([amd64]='https://googledrive.com/host/0Byemcyi98JRjUjJKMnlqSVVnVlk/autoshutdowntool_1.00-1_amd64_deb.tar.gz' \
[i386]='https://googledrive.com/host/0Byemcyi98JRjUjJKMnlqSVVnVlk/autoshutdowntool_1.00-1_i386_deb.tar.gz')

#соостветствие ppd файлов и моделей принтеров
declare -A LASERSHOT=([LBP-810]=1120 [LBP-1120]=1120 [LBP-1210]=1210 \
[LBP2900]=2900 [LBP3000]=3000 [LBP3010]=3050 [LBP3018]=3050 [LBP3050]=3050 \
[LBP3100]=3150 [LBP3108]=3150 [LBP3150]=3150 [LBP3200]=3200 [LBP3210]=3210 \
[LBP3250]=3250 [LBP3300]=3300 [LBP3310]=3310 [LBP3500]=3500 [LBP5000]=5000 \
[LBP5050]=5050 [LBP5100]=5100 [LBP5300]=5300 [LBP6000]=6018 [LBP6018]=6018 \
[LBP6020]=6020 [LBP6020B]=6020 [LBP6200]=6200 [LBP6300n]=6300n [LBP6300]=6300 \
[LBP6310]=6310 [LBP7010C]=7018C [LBP7018C]=7018C [LBP7200C]=7200C [LBP7210C]=7210C \
[LBP9100C]=9100C [LBP9200C]=9200C)

#отсортированные имена принтеров 
NAMESPRINTERS=$(echo "${!LASERSHOT[@]}" | tr ' ' '\n' | sort -n -k1.4)

#список моделей, которые поддерживаются утилитой автоотключения
declare -A ASDT_SUPPORTED_MODELS=([LBP6020]='MTNA002001 MTNA999999' \
[LBP6020B]='MTMA002001 MTMA999999' [LBP6200]='MTPA00001 MTPA99999' \
[LBP6310]='MTLA002001 MTLA999999' [LBP7010C]='MTQA00001 MTQA99999' \
[LBP7018C]='MTRA00001 MTRA99999' [LBP7210C]='MTKA002001 MTKA999999')

#архитектура операционной системы
if [ "$(uname -m)" == 'x86_64' ]; then
  ARCH='amd64'
else
  ARCH='i386'
fi

#делаем рабочим каталог, в котором находится этот скрипт
cd "$(dirname "$0")"

function valid_ip() {
    local ip=$1
    local stat=1

    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        ip=($(echo "$ip" | tr '.' ' '))
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
        stat=$?
    fi
    return $stat
}

function check_error() {
	if [ $2 -ne 0 ]; then
		case $1 in
			'WGET') echo "Ошибка при скачивании файла $3"				
				[ -n "$3" ] && [ -f "$3" ] && rm "$3";;
			'PACKAGE') echo "Ошибка при установке пакета $3";;
			*) echo 'Ошибка';;
		esac
		echo 'Нажмите любую клавишу для выхода'
		read -s -n1
		exit 1
	fi
}

function canon_unistall() {
	if [ -f /usr/sbin/ccpdadmin ]; then
		installed_model=$(ccpdadmin | grep LBP | awk '{print $3}')
		if [ -n "$installed_model" ]; then
			echo "Найден принтер $installed_model"
			echo "Завершение captstatusui"
			killall captstatusui 2> /dev/null
			echo 'Остановка демона ccpd'
			service ccpd stop
			echo 'Удаление принтера из файла настройки ccpd демона'
			ccpdadmin -x $installed_model
			echo 'Удаление принтера из CUPS'
			lpadmin -x $installed_model
		fi
	fi
	echo 'Удаление пакетов драйвера'
	dpkg --purge cndrvcups-capt
	dpkg --purge cndrvcups-common
	echo 'Удаление неиспользуемых библиотек и пакетов'
	apt-get -y autoremove
	echo 'Удаление настроек'
	[ -f /etc/init/ccpd-start.conf ] && rm /etc/init/ccpd-start.conf
	[ -f /etc/udev/rules.d/85-canon-capt.rules ] && rm /etc/udev/rules.d/85-canon-capt.rules
	[ -f "${XDG_DESKTOP_DIR}/captstatusui.desktop" ] && rm "${XDG_DESKTOP_DIR}/captstatusui.desktop"
	[ -f /usr/bin/autoshutdowntool ] && rm /usr/bin/autoshutdowntool
	echo 'Удаление завершено'
	echo 'Нажмите любую клавишу для выхода'
	read -s -n1
	return 0
}

function canon_install() {
	echo
	PS3='Выбор принтера. Введите нужную цифру и нажмите Enter: '
	select NAMEPRINTER in $NAMESPRINTERS
	do
		[ -n "$NAMEPRINTER" ] && break
	done
	echo "Выбран принтер: $NAMEPRINTER"
	echo
	PS3='Как принтер подключен к комьютеру? Введите нужную цифру и нажмите Enter: '
	select CONECTION in 'Через разъем порта USB' 'Через разъем локальной сети (LAN, NET)'
	do
		if  [ "$REPLY" == "1" ]; then
			CONECTION="usb"
			while true
			do	
				#ищем подключенное к порту USB устройство
				NODE_DEVICE=$(ls -1t /dev/usb/lp* 2> /dev/null | head -1)
				if [ -n "$NODE_DEVICE" ]; then
					#определяем серийный номер принтера
					PRINTER_SERIAL=$(udevadm info --attribute-walk --name=$NODE_DEVICE | sed '/./{H;$!d;};x;/ATTRS{product}=="Canon CAPT USB \(Device\|Printer\)"/!d;' |  awk -F'==' '/ATTRS{serial}/{print $2}')
					#если серийный номер найден, значит найденное устройство принтер Canon
					[ -n "$PRINTER_SERIAL" ] && break
				fi
				echo -ne "Включите принтер\r"
				sleep 2
			done
			PATH_DEVICE="/dev/canon$NAMEPRINTER"
			break
		elif [ "$REPLY" == "2" ]; then
			CONECTION="lan"
			read -p 'Введите IP-адрес принтера: ' IP_ADDRES
			until valid_ip "$IP_ADDRES"
			do
				echo 'Неверный формат IP-адреса, введите четыре десятичных числа значением'
				echo -n 'от 0 до 255, разделённых точками: '
				read IP_ADDRES
			done
			PATH_DEVICE="net:$IP_ADDRES"
			echo 'Включите принтер и нажмите любую клавишу'
			read -s -n1
			sleep 5
			break
		fi		
	done
	echo 'Установка драйвера'
	COMMON_FILE=cndrvcups-common_${DRIVER_VERSION}_${ARCH}.deb
	CAPT_FILE=cndrvcups-capt_${DRIVER_VERSION}_${ARCH}.deb
	if [ ! -f $COMMON_FILE ]; then		
		sudo -u $LOGIN_USER wget -O $COMMON_FILE ${URL_DRIVER[${ARCH}_common]}
		check_error WGET $? $COMMON_FILE
	fi
	if [ ! -f $CAPT_FILE ]; then
		sudo -u $LOGIN_USER wget -O $CAPT_FILE ${URL_DRIVER[${ARCH}_capt]}
		check_error WGET $? $CAPT_FILE
	fi
	apt-get -y update
	apt-get -y install libglade2-0
	check_error PACKAGE $? libglade2-0
	echo 'Установка общего модуля для драйвера CUPS'
	dpkg -i $COMMON_FILE
	check_error PACKAGE $? $COMMON_FILE
	echo 'Установка модуля драйвера принтера CAPT'
	dpkg -i $CAPT_FILE
	check_error PACKAGE $? $CAPT_FILE
	#замена содержимого файла /etc/init.d/ccpd
	echo '#!/bin/bash
# startup script for Canon Printer Daemon for CUPS (ccpd)
DAEMON=/usr/sbin/ccpd
case $1 in
	start)
		start-stop-daemon --start --quiet --oknodo --exec ${DAEMON}
		;;
	stop)
		start-stop-daemon --stop --quiet --oknodo --retry TERM/30/KILL/5 --exec ${DAEMON}
		;;	
	status)
		echo "${DAEMON}:" $(pidof ${DAEMON})
		;;
	restart)
		while true
		do
			start-stop-daemon --stop --quiet --oknodo --retry TERM/30/KILL/5 --exec ${DAEMON}
			start-stop-daemon --start --quiet --oknodo --exec ${DAEMON}
			for (( i = 1 ; i <= 5 ; i++ )) 
			do
				sleep 1
				set -- $(pidof ${DAEMON})
				[ -n "$1" -a -n "$2" ] && exit 0
			done
		done
		;;
	*)
		echo "Usage: ccpd {start|stop|status|restart}"
		exit 1
		;;
esac
exit 0' > /etc/init.d/ccpd
	#установка утилит для управления AppArmor
	apt-get -y install apparmor-utils
	#установка в AppArmor профиля в щадящий режим для cupsd
	aa-complain /usr/sbin/cupsd
	echo 'Перезапуск CUPS'
	service cups restart
	echo 'Установка 32-битных библиотек необходимых для'
	echo '64-разрядной версии драйвера принтера'
	if [ $ARCH == 'amd64' ]; then
		apt-get -y install libatk1.0-0:i386 libcairo2:i386 libgtk2.0-0:i386 libpango1.0-0:i386 libstdc++6:i386 libpopt0:i386 libxml2:i386 libc6:i386
		check_error PACKAGE $?
	fi
	echo 'Установка принтера в CUPS'
	/usr/sbin/lpadmin -p $NAMEPRINTER -P /usr/share/cups/model/CNCUPSLBP${LASERSHOT[$NAMEPRINTER]}CAPTK.ppd -v ccp://localhost:59687 -E
	echo "Установка принтера $NAMEPRINTER, принтером, используемым по умолчанию"
	/usr/sbin/lpadmin -d $NAMEPRINTER
	echo 'Регистрация принтера в файле настройки ccpd демона'
	/usr/sbin/ccpdadmin -p $NAMEPRINTER -o $PATH_DEVICE
	#проверка установки принтера
	installed_printer=$(ccpdadmin | grep $NAMEPRINTER | awk '{print $3}')
	if [ -n "$installed_printer" ]; then
		if [ "$CONECTION" == "usb" ]; then
			echo 'Создание правила для принтера'
			#составлем правило, которое обеспечит альтернативное имя (символическую ссылку) нашему принтеру, чтобы не зависить от меняющихся значений lp0,lp1, ...
			echo 'KERNEL=="lp[0-9]*", SUBSYSTEMS=="usb", ATTRS{serial}=='$PRINTER_SERIAL', SYMLINK+="canon'$NAMEPRINTER'"' > /etc/udev/rules.d/85-canon-capt.rules
			#обновляем правила 
			udevadm control --reload-rules
			#проверка созданного правила
			until [ -e $PATH_DEVICE ]
			do
				echo -ne "Выключите принтер, подождите 2 секунды, затем включите принтер\r"
				sleep 2
			done
		fi
		echo -e "\e[2KЗапуск ccpd"
		service ccpd restart
		#автозагрузка ccpd
		echo '# ccpd-start - запуск ccpd после запуска CUPS
 
description		"start daemon ccpd for Canon printer LBP series"
author			"coden"

start on started cups
stop on runlevel [016]

script
	/etc/init.d/ccpd restart
end script' > /etc/init/ccpd-start.conf	
		#создаем кнопку запуска captstatusui на рабочем столе
		echo '#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Name=captstatusui
GenericName=Status monitor for Canon CAPT Printer
Exec=captstatusui -P '$NAMEPRINTER'
Terminal=false
Type=Application
Icon=/usr/share/icons/Humanity/devices/48/printer.svg' > "${XDG_DESKTOP_DIR}/captstatusui.desktop"
		chmod 775 "${XDG_DESKTOP_DIR}/captstatusui.desktop"
		chown $LOGIN_USER:$LOGIN_USER "${XDG_DESKTOP_DIR}/captstatusui.desktop"
		#установка утилиты автоотключения для поддерживаемых моделей принтеров
		if [[ "${!ASDT_SUPPORTED_MODELS[@]}" =~ "$NAMEPRINTER" ]]; then
			SERIALRANGE=(${ASDT_SUPPORTED_MODELS[$NAMEPRINTER]})
			SERIALMIN=${SERIALRANGE[0]}
			SERIALMAX=${SERIALRANGE[1]}	
			if [[ ${#PRINTER_SERIAL} -eq ${#SERIALMIN} && $PRINTER_SERIAL > $SERIALMIN && $PRINTER_SERIAL < $SERIALMAX || $PRINTER_SERIAL == $SERIALMIN || $PRINTER_SERIAL == $SERIALMAX ]]; then
				echo "Установка утилиты autoshutdowntool"
				ASDT_FILE=autoshutdowntool_1.00-1_${ARCH}_deb.tar.gz
				if [ ! -f $ASDT_FILE ]; then		
					wget -O $ASDT_FILE ${URL_ASDT[$ARCH]}
					check_error WGET $? $ASDT_FILE
				fi
				tar --gzip --extract --file=$ASDT_FILE --totals --directory=/usr/bin
			fi
		fi	
		#запуск  captstatusui
		if [[ -n "$DISPLAY" ]] ; then
			sudo -u $LOGIN_USER nohup captstatusui -P $NAMEPRINTER > /dev/null 2>&1 &
			sleep 5
		fi
		echo 'Установка завершена. Нажмите любую клавишу для выхода'
		read -s -n1
		exit 0
	else
		echo "Принтер $NAMEPRINTER не установлен"
		echo 'Нажмите любую клавишу для выхода'
	 	read -s -n1
		exit 1
	fi
}

function canon_update() {
	if [ -f /usr/sbin/ccpdadmin ]; then
		NAMEPRINTER=$(ccpdadmin | grep LBP | awk '{print $3}')
		if [ -n "$NAMEPRINTER" ]; then
			echo "Найден принтер $NAMEPRINTER"
			SETUP_DRIVER_VERSION=$(dpkg -l | grep cndrvcups-capt | awk '{print $3}')
			echo "Установленная версия драйвера: $SETUP_DRIVER_VERSION"
			echo "Верcия драйвера, которая будет установлена: $DRIVER_VERSION"			
			dpkg --compare-versions $DRIVER_VERSION lt $SETUP_DRIVER_VERSION
			if [ $? -eq 0 ]; then
				echo 'Версия устанавливаемого драйвера меньше версии уже установленного.
Обновление не будет продолжено. Нажмите любую клавишу для выхода'
				read -s -n1
				exit 1
			fi
			echo "Завершение captstatusui"
			killall captstatusui 2> /dev/null
			echo 'Остановка демона ccpd'
			service ccpd stop
			echo 'Удаление принтера из CUPS'
			lpadmin -x $NAMEPRINTER
			#обновление драйвера...'
			COMMON_FILE=cndrvcups-common_${DRIVER_VERSION}_${ARCH}.deb
			CAPT_FILE=cndrvcups-capt_${DRIVER_VERSION}_${ARCH}.deb
			if [ ! -f $COMMON_FILE ]; then		
				sudo -u $LOGIN_USER wget -O $COMMON_FILE ${URL_DRIVER[${ARCH}_common]}
				check_error WGET $? $COMMON_FILE
			fi
			if [ ! -f $CAPT_FILE ]; then
				sudo -u $LOGIN_USER wget -O $CAPT_FILE ${URL_DRIVER[${ARCH}_capt]}
				check_error WGET $? $CAPT_FILE
			fi
			echo 'Обновление общего модуля для драйвера CUPS'
			dpkg -i $COMMON_FILE
			check_error PACKAGE $? $COMMON_FILE
			echo 'Обновление модуля драйвера принтера CAPT'
			dpkg -i $CAPT_FILE
			check_error PACKAGE $? $CAPT_FILE
			echo 'Перезапуск CUPS'
			service cups restart
			echo 'Устанавка принтера в CUPS'
			/usr/sbin/lpadmin -p $NAMEPRINTER -P /usr/share/cups/model/CNCUPSLBP${LASERSHOT[$NAMEPRINTER]}CAPTK.ppd -v ccp://localhost:59687 -E
			echo "Установка принтера $NAMEPRINTER, принтером, используемым по умолчанию"
			/usr/sbin/lpadmin -d $NAMEPRINTER
			if [[ -n "$DISPLAY" ]] ; then			
				echo 'Запуск captstatusui'
				while true
				do
					sleep 1
					set -- $(pidof /usr/sbin/ccpd)
					if [ -n "$1" -a -n "$2" ]; then
						sudo -u $LOGIN_USER nohup captstatusui -P $NAMEPRINTER > /dev/null 2>&1 &
						sleep 5
						break
					fi
				done
			fi
			echo "Драйвер обновлен. Нажмите любую клавишу для выхода"
	 		read -s -n1
			exit 0
		fi
	fi
	echo "Принтеры из серии Canon LBP не установлены"
	echo 'Нажмите любую клавишу для выхода'
	read -s -n1
	exit 1
}

function canon_help {
	clear
	echo 'Замечания по установке
Если вы уже делали какие-либо действия по установке принтера этой серии, 
в текущей системе, то перед началом установки, следует отменить эти действия.
При отсутствии пакетов драйвера они автоматически скачиваются из интернета 
в папку скрипта. Принтеры LBP-810, LBP-1210 подключайте через разъем порта USB
Замечания по проблемам печати
Если принтер перестает печатать, запускаете captstatusui через кнопку запуска 
на рабочем столе или в терминале командой: captstatusui -P <имя_принтера>
В окне captstatusui отображается сообщение о текущем состояние принтера, если
возникает ошибка, выводится её описание. Здесь можно попробывать нажать кнопку 
"Resume Job" для продолжение печати или кнопку "Cancel Job" для отмены задания. 
Если это не помогает, тогда запускаете скрипт canon_restart.sh

команда настройки принтера: cngplp
дополнительные настройки, команда: captstatusui -P <имя_принтера>
настройка автоотключения (не для всех моделей): autoshutdowntool
драйвер и документация: 
http://support-sg.canon-asia.com/contents/SG/EN/0100459601.html
Замечания и ошибки пишите на почту coden@mail.ru или 
на форум http://forum.ubuntu.ru/index.php?topic=189049.0
Для логирования процесса установки запускайте скрипт так:
logsave log.txt ./canon_lbp_setup.sh
'
}

clear
echo 'Установка драйвера Linux CAPT Printer Driver v'${DRIVER_VERSION}' для принтеров Canon LBP
на Ubuntu 12.04, 12.10, 13.04, 13.10, 14.04, 32-битной и 64-битной архитектуры
Поддерживаемые принтеры:'
echo "$NAMESPRINTERS" | sed ':a; /$/N; s/\n/, /; ta' | fold -s

PS3='Выбор действия. Введите нужную цифру и нажмите Enter: '
select opt in 'Установка' 'Удаление' 'Обновление' 'Справка' 'Выход'
do
	if [ "$opt" == 'Установка' ]; then
		canon_install
		break
	elif [ "$opt" == 'Удаление' ]; then
		canon_unistall
		break
	elif [ "$opt" == 'Обновление' ]; then
		canon_update
		break	
	elif [ "$opt" == 'Справка' ]; then
		canon_help
	elif [ "$opt" == 'Выход' ]; then
		break
	fi
done


Посмотрел, когда я использовал в последний раз этот скрипт — май 2015. То есть актуален для тех дистрибутивов того времени.
Ок. А теперь всё то же самое, но для Gentoo!
Местами
sudo
местами
kdesudo
на первом шаге вообще
udo
. Очень глаз режет. Да и куча разных текстовых редакторов, также профессионализма статье не добавляют.
Only those users with full accounts are able to leave comments. Log in, please.