Скрипт cgi-bin для перехвата файла, принадлежащего пользователю

Я использую сервер Ubuntu, и у меня есть сценарий cgi-bin, выполняющий следующие действия. . .

#!/bin/bash
echo Content-type: text/plain
echo ""
cat /home/user/.program/logs/file.log | tail -400  | col -b > /tmp/o.txt
cat /tmp/o.txt

Теперь, если я запускаю этот сценарий с помощью «su», сценарий заполняет o.txt, а затем запускается host.com/cgi-bin/script, но отображается только до того момента, когда я последний раз запускал его из интерфейса командной строки.

В моем журнале ошибок apache отображаются ошибки типа "доступ запрещен". Итак, я знаю, что пользовательский apache работает под каким-то образом не может обработать этот файл. Я безуспешно пытался использовать chown. Поскольку этот файл находится в каталоге пользователя, как лучше всего его продублировать, создать символическую ссылку или что-то в этом роде?

Я даже подумал о том, чтобы запустить сценарий от имени root в crontab, чтобы как бы «обновить» файл в / tmp /, но у меня это не сработало. Как кто-нибудь, имеющий опыт работы с cgi-bin, сможет обрабатывать доступ к файлу в каталоге пользователей?


person Matt3324    schedule 13.03.2014    source источник
comment
Запуск tail -n 400 logfile | sudo -u www-data tee /var/www/tail.txt >/dev/null один раз в минуту вообще избавит от необходимости в сценарии CGI.   -  person tripleee    schedule 13.03.2014


Ответы (2)


Пользователь Apache www-data не имеет права записи во временный файл, принадлежащий другому пользователю.

Но в данном конкретном случае временный файл не требуется.

tail -n 400 logfile | col -b

Однако, если Apache работает в ограниченном chroot, он также не имеет доступа к /home.

Файл журнала должен быть chmod o+r, а все каталоги, ведущие к нему, должны быть chmod o+x. Убедитесь, что вы понимаете последствия этого! Если у пользователя есть причина запретить доступ к промежуточному каталогу, права на чтение самого файла будет недостаточно. (Создание чего-либо с www-data в качестве владельца группы возможно, но непрактично и бессмысленно, поскольку любой, кто найдет сценарий CGI, все равно получит доступ к файлу.)

В более общем плане, если вам действительно нужен временный файл, простое исправление (даже не обходное решение) состоит в создании уникального временного имени файла и его последующем удалении.

temp=$(mktemp -t cgi.XXXXXXXX) || exit $?
trap 'rm -f "$temp"' 0
trap 'exit 127' 1 2 15

tail -n 400 logfile | col -b >"$temp"

Первый trap гарантирует, что файл будет удален после завершения сценария. Второй гарантирует, что первый trap запускается, если сценарий прерывается или прерывается.

person tripleee    schedule 13.03.2014
comment
Я попытался использовать только хвост сам по себе, и вот новая ошибка в моем хвосте журнала ошибок apache: не удается открыть `/home/user/.program/log 'для чтения: Permission denied - person Matt3324; 13.03.2014
comment
Номера сигналов в trap должны быть символическими. Слишком стар и ленив, чтобы их искать. EXIT и ... что-то вроде HUP и INT? - person tripleee; 13.03.2014
comment
Знает ли об этом и одобряет ли это пользователь? Тогда получение разрешений и / или перемещение файла в более доступное место должно быть простым делом. - person tripleee; 13.03.2014
comment
да, пользователь - мой пользователь, файл - это журнал, созданный программой в пользовательской среде, которую не следует запускать от имени пользователя root. Есть ли простой способ скопировать этот файл вживую, когда он растет до места, к которому apache может получить доступ? Я думал crontab, но вы можете знать более простой способ. - person Matt3324; 13.03.2014
comment
Вероятно, лучше для начала разместить файл в разумном месте. Обратите внимание на недавнее обновление re: permissions для каталогов. - person tripleee; 13.03.2014
comment
Вы сделали это, я понятия не имею, что делают o + r и o + x, но я прочитаю об этом. Я думал, что chmod 777 будет достаточно, но я думаю, что нет. - person Matt3324; 13.03.2014
comment
Вы знаете, что сейчас он что-то производит, но на самом деле это старая часть журнала, и когда журнал обновляется, и я обновляю страницу, страница остается прежней. Я понятия не имею. - person Matt3324; 13.03.2014
comment
Я единственный пользователь на сервере, только root и мой пользователь, chmod 777 все еще плохая идея? - person Matt3324; 13.03.2014
comment
Хорошо, так что это действительно работает, но только один раз, тогда каждый раз, когда я иду обновлять страницу, он загружает только исходную кошку журнала, он не будет повторять процесс. Понятия не имею почему. - person Matt3324; 13.03.2014

Я был бы склонен изменить программу, которая в первую очередь создает журнал, и записывать его в какое-то место, видимое Apache - возможно, через символические ссылки.

Например:

ln -s /var/www/cgi-bin/logs /home/user/.program/logs

Итак, ваша программа продолжает запись в /home/user/.program/logs, но данные фактически попадают в /var/www/cgi-bin/logs, откуда Apache может их прочитать.

person Mark Setchell    schedule 13.03.2014
comment
Если конечный пункт назначения не разрешен, Apache также не сможет пройти по символической ссылке. В противном случае было бы тривиально получить доступ к тому, что вам заблокировано! - person tripleee; 13.03.2014
comment
Apache не нужно использовать символическую ссылку. Исходная программа OP пишет через символическую ссылку, Apache читает настоящий файл. Извините, у меня была обратная ссылка. - person Mark Setchell; 13.03.2014
comment
символические ссылки имеют для меня смысл, я подумал, что может быть так, я запустил эквивалент логики в своей системе, но я сказал, что не удалось создать, файл существует. Извините, я не знаю, иногда скрипт cgi запускается, кстати. . . Я смущен. - person Matt3324; 13.03.2014
comment
Вам нужно переместить старый файл в сторону или запустить ln -fs, чтобы заставить его. Однако это перезапишет любой существующий журнал. - person tripleee; 13.03.2014