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, но отображается только до того момента, когда я последний раз запускал его из CLI

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

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

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 запускается, если скрипт прерван или убит.

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

Например:

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

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

Другие вопросы по тегам