Сценарий печати оболочки ничего не печатает

Я пытаюсь создать службу печати на моем Raspberry Pi. Идея состоит в том, чтобы иметь учетную запись pop3 для заданий печати, куда я могу отправлять PDF-файлы и распечатывать их дома. Поэтому я настроил fetchmail & rarr; procmail & rarr; uudeview для сбора электронных писем (используя белый список), извлечения документов и сохранения их в /home/pi/attachments/. До этого момента все работает.

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

Вот как выглядит мой скрипт:

#!/bin/bash
fetchmail                 # gets the emails, extracts the PDFs to ~/attachments
wait $!                   # takes some time so I have to wait for it to finish
FILES=/home/pi/attachments/*
for f in $FILES; do       # go through all files in the directory
   if  $f == "*.pdf"      # print them if they're PDFs
   then
      lpr -P ColorLaserJet1525 $f
   fi
   sudo rm $f             # delete the files
done;
sudo rm /var/mail/pi      # delete emails

После выполнения скрипта я получаю следующую обратную связь:

1 message for [email protected] at pop3.MYDOMAIN.TLD (32139 octets).
Loaded from /tmp/uudk7XsG: 'Test 2' (Test): Stage2.pdf part 1   Base64
Opened file /tmp/uudk7XsG
procmail: Lock failure on "/var/mail/pi.lock"
reading message [email protected]@SERVER.HOSTER.TLD:1 of 1 (32139 octets) flushed
mail2print.sh: 6: mail2print.sh: /home/pi/attachments/Stage2.pdf: Permission denied

Электронное письмо извлекается из учетной записи pop3, вложение извлекается и появляется на короткое время в ~/attachements/, а затем удаляется. Но распечатки нет.

Любые идеи, что я делаю неправильно?


person BeetleZuma    schedule 09.07.2014    source источник
comment
Какой пользователь на самом деле выполняет скрипт (другими словами, под каким пользователем вы выполняете crontab)? Это тот же пользователь, с которым вы можете запустить скрипт вручную?   -  person Charles Wood    schedule 10.07.2014
comment
Это тот же пользователь, который запускает crontab и сценарий. Проблема была в том, что даже при запуске скрипта я столкнулся с ошибками. Однако выполнение отдельных команд (fetchmail, lpr -P ColorLaserJet1525 test.pdf, sudo rm test.pdf, sudo rm /var/mail/pi) сработало.   -  person BeetleZuma    schedule 10.07.2014


Ответы (2)


if  $f == "*.pdf"

должно быть

if  [[ $f == *.pdf ]]

Также я думаю

FILES=/home/pi/attachments/*

следует цитировать:

FILES='/home/pi/attachments/*'

Предложение:

#!/bin/bash
fetchmail                      # gets the emails, extracts the PDFs to ~/attachments
wait "$!"                      # takes some time so I have to wait for it to finish
shopt -s nullglob              # don't present pattern if no files are matched
FILES=(/home/pi/attachments/*)
for f in "${FILES[@]}"; do                              # go through all files in the directory
    [[ $f == *.pdf ]] && lpr -P ColorLaserJet1525 "$f"  # print them if they're PDFs
done
sudo rm -- "${FILES[@]}" /var/mail/pi         # delete files and emails at once
person konsolebox    schedule 09.07.2014
comment
+1 за исправление условного. Хотя нет никакого вреда в заключении /home/pi/attachments/* в кавычки, это не обязательно — расширение имени пути не применяется к правой части назначений переменных bash. Использование for f in $FILES и rm -- $FILES прекрасно работает (пока $FILES без кавычек) — нет необходимости во вспомогательном массиве. - person mklement0; 10.07.2014
comment
Должен признать, что я запускал скрипт с sh mail2print.sh вместо bash mail2print.sh. Использование shopt привело меня к этой ошибке. Я все еще новичок и усвоил урок на сегодня;) - person BeetleZuma; 10.07.2014
comment
@mklement0 mklement0 Я не уверен, что имена файлов нужно расширять дважды, но это не так уж плохо и иногда может быть предпочтительным. Возможно, во время вызовов lpr могут быть сгенерированы какие-то мошеннические файлы, и поэтому ваша идея может принести пользу, поскольку они также будут удалены. - person konsolebox; 10.07.2014
comment
@konsolebox: Хороший вопрос; спасибо за объяснение разницы. - person mklement0; 10.07.2014
comment
Почему бы просто не использовать for f in /home/pi/attachments/* или, учитывая, что вы все равно удаляете все файлы на более позднем этапе, .../*.pdf? - person tripleee; 11.07.2014
comment
@tripleee Да, я думаю, это может быть другой путь. - person konsolebox; 11.07.2014

Используйте ниже, чтобы сначала отфильтровать файлы PDF, а затем вы можете удалить этот оператор if внутри цикла for.

FILES="ls /home/pi/attachments/*.pdf" 
person dganesh2002    schedule 09.07.2014
comment
Спасибо за предложение, но в этом случае файлы, отличные от PDF, не будут удалены в папке ~/attachments/. - person BeetleZuma; 10.07.2014
comment
Также присваивание ls переменной вряд ли полезно или правильно. Если целью было выполнить ls, синтаксис неверен, но в любом случае это было бы бесполезно. - person tripleee; 10.07.2014
comment
@tripleee Я согласен с тем, что синтаксис был неправильным для ls, но я не понимаю, почему он не будет правильным? - person dganesh2002; 10.07.2014
comment
В лучшем случае использование ls для печати имен файлов после того, как оболочка уже расширила подстановочный знак, просто расточительно. В худшем случае будут подкаталоги, и ls напечатает их содержимое вместо их имен, поэтому вывод будет неверным. - person tripleee; 10.07.2014