После долгого сеанса отладки я наконец-то решил эту проблему. В случае, если другие люди столкнутся с такими же трудностями, вот что я узнал о бэкэндах CUPS под Mac OS X Yosemite:
Backends - это исполняемые файлы (в моем случае это скрипт оболочки) в /usr/libexec/cups/backend/
каталог. Информация о задании на печать передается в эти программы через аргументы командной строки ( $1
= Работа-идентификатор, $2
= Пользователь, $3
= Название, $4
= копия, $5
= опция, $6
= файл) и переменные окружения ( например $DEVICE_URI
).
Бэкэнды выполняются как пользователь _lp
, группа _lp
, с разрешениями, дополнительно ограниченными sandboxd. Текущий каталог при запуске бэкэнда является корневым каталогом /
, но бэкэнд не имеет разрешения на чтение этого каталога. Каталоги, которые можно прочитать, включают /usr/libexec/cups/backend/
, /etc/
и их подкаталоги. Только очень ограниченный (или вообще нет?) Доступ к домашнему каталогу пользователя _lp
(в /var/spool/cups
) разрешено.
Мой бэкэнд требует использования ssh. Чтобы это работало, ssh должен иметь доступ к закрытому ключу, необходимому для входа на удаленный сервер, и known_hosts
файл, который идентифицирует удаленный сервер. Требуемый ключ может быть помещен в /usr/libexec/cups/backend/
или подкаталог, он должен быть доступен для чтения только пользователю _lp
, Кажется, что ssh при запуске из бэкэнда CUPS не имеет доступа к /var/spool/cups/.ssh/
даже если этот каталог существует; Таким образом known_hosts
файл должен храниться в /etc/
, как /etc/ssh_known_hosts
, (Обратите внимание, что страница справочника ssh неправильно утверждает, что это должно быть /etc/ssh/ssh_known_hosts
.)
Редактировать: На MacOS X 10.11 (El Capitan) ssh теперь использует
задокументированное местоположение /etc/ssh/ssh_known_hosts
для известных
файл hosts. Я должен был переместить мой файл в /etc/ssh/
сделать фильтр принтера
работать после обновления ОС.
Чтобы отладить такие проблемы, используя cupsctl --debug-logging
неоценимо: после выполнения этой команды все, что записано в stderr в бэкэнде CUPS, появляется в /var/log/cups/error_log
, Регистрация может быть снова отключена с помощью cupsctl --no-debug-logging
, Кроме того, всякий раз, когда sandboxd отказывает в попытке доступа к файлу, sandboxd[426] ([15998]): sh(15998) deny file-read-data /
можно найти в /var/log/system.log
,