Từ website mà lại chmod thư mục không phải của www-data

Như các anh em đã biết, để chmod thư mục nào thì vẫn sở hữu thư mục đấy. Ấy vậy mà anh lại cần phải chmod thư mục từ website chạy bằng PHP mà tài khoản sở hữu thư mục đấy lại không phải là www-data.

– Phải làm sao đây?

– Không làm được thì thuê :v

Có thể anh em chưa từng nghe đến incrontab nhưng chắc chắn đều biết crontab và rất có thể cũng đã biết inotify (nếu không biết thì Google thôi). Và incrontab là sự kết hợp của cả hai.

Nếu như crontab là cứ đến giờ sẽ chạy lệnh thì incrontab là cứ có hoạt động đã chọn liên quan đến tập tin/thư mục là nó sẽ chạy lệnh đã đăng kí.

Quay trở lại với đề bài. Mặc dù không sở hữu thư mục ABC cần chmod nhưng www-data vẫn có thể thay đổi tập tin ở chỗ khác. Khi muốn chmod 750 ABC thì ta bảo thằng PHP ghi yêu cầu này vào tập tin nào đó, ví dụ là chmod-request.sh:

ACTION="chmod 750 ABC"

Sau đó người dùng sở hữu thư mục ABC bảo incrontab theo dõi chmod-request.sh, mỗi khi ghi xong thì chạy action.sh để thực thi yêu cầu ghi trong chmod-request.sh:

/path/to/chmod-request.sh IN_MODIFY /path/to/action.sh $#

Còn nội dung action.sh sẽ đại loại là:

#!/bin/bash

. /path/to/chmod-request.sh

if [ ! -z $ACTION]; then
eval "$ACTION"
fi

Tất nhiên đây là ví dụ mang tính minh hoạ chứ thực tế thì đừng dùng eval kiểu này kẻo có ngày mất mạng, hehe.

Tóm lại, PHP không thực hiện chmod mà chỉ ghi yêu cầu này ra một tập tin để incrontab theo dõi và chạy các lệnh theo yêu cầu. Hơi cồng kềnh một chút và có phần nguy hiểm nếu dùng eval nhưng ít nhất là nó cũng chạy được :v