Есть директория, принадлежащая мне. В директорию производится заливка файлов с помощью nginx+upload_module. Засада в том, что файлы при этом принадлежат пользователю, под которым запущен nginx, а надо, чтобы мне.
При попытке сделать chown чужого файла себе меня посылают нафиг. Это при том, что он лежит в моей директории, я имею права на запись к директории и к самому файлу и могу его нафиг удалить, переименовать и сделать всё, что угодно, кроме того, что, собственно, нужно.
Пробовал:
- Поставить suid bit на директорию, оказывается, фиг там, можно только sgid, а suid игнорится. Но факт принадлежности файла группе, в которой я состою, всё равно не даёт мне права забрать его себе.
- Сделать хардлинк на файл, удалить оригинал, переместить хардлинк на место оригинала. Фиг там, хардлинк сохраняет права и владельца оригинального файла.
Можно, конечно, тупо скопировать файл и удалить оригинал. Права на директорию (т. к. она моя) это позволяют. Но файл может весить до фига и на нагруженном сервере это лишнее копирование нафиг не надо.
Файл после загрузки должен обрабатываться рельсовым приложением, запущенным через passenger, прикрученный к этому же nginx'у. Пассажир запускает приложение под тем юзером, которому принадлежит конфиг, соответственно, подо мной. Файло перемещается из директории, куда его положил nginx, в директорию приложения, после чего приложение пытается выставить на него правильные права доступа и отправить на дальнейшую обработку. А хрен — права не выставить, т. к. файл чужой.
Пока что вижу такие варианты:
- Запустить приложение под юзером nginx'a. Минус — неудобно его щупать при необходимости, придётся париться с sudo.
- Повесить смену владельца на закрытие файла в рутовый incrontab. Минус — костыль и надо запускать нафиг не нужный там incron.
- Запустить nginx под своим юзером. Минус — костыль, и если возникнет необходимость запустить другое приложение с аплоадами под другим юзером, то опять вылезут все те же траблы.
Есть ли возможность как-то забрать файл без танцев с бубном и без копирования?