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 может это прочитать.