
Script sửa lỗi ownership và permissions trên cPanel
Khi máy chủ cPanel gặp vấn đề về quyền truy cập file – sau khi di chuyển dữ liệu, thao tác thủ công với file, hoặc do script hoạt động không đúng – các trang web có thể trở nên không truy cập được, email có thể gặp lỗi, hoặc bảo mật có thể gặp rủi ro. Script này tự động hóa quá trình sửa chữa quyền sở hữu và quyền truy cập file cho một hoặc nhiều người dùng cPanel, đảm bảo mọi thứ trở lại trạng thái an toàn và hoạt động bình thường.
Trường hợp sử dụng
Bạn có thể cần chạy script này khi:
- Các file trang web hiển thị lỗi
403 Forbidden
(Cấm truy cập) - Việc gửi email thất bại do quyền truy cập thư mục
etc/
- Các file được sao chép hoặc khôi phục mà không có cờ
--preserve
- Các thư mục CageFS có chế độ quyền truy cập không chính xác
- Sau khi nâng cấp hoặc di chuyển máy chủ cPanel
- Khi bạn nghi ngờ có sự cố bảo mật do quyền truy cập file không đúng
Tôi sẽ giải thích rõ hơn về cách lưu file và thiết lập quyền để chạy script:
Cách lưu và chạy script
Bước 1: Tạo file script
- Đăng nhập vào máy chủ cPanel với quyền root thông qua SSH:
ssh root@địa_chỉ_IP_của_bạn
- Tạo file script bằng một trình soạn thảo. Bạn có thể sử dụng
nano
hoặcvi
:nano fixperms
hoặc
vi fixperms
- Sao chép và dán nội dung script phía dưới vào trình soạn thảo:
Nếu dùng nano:
- Dán nội dung
- Nhấn
Ctrl+O
để lưu - Nhấn
Enter
để xác nhận tên file - Nhấn
Ctrl+X
để thoát
Nếu dùng vi:
- Nhấn
i
để vào chế độ chèn - Dán nội dung
- Nhấn
Esc
- Gõ
:wq
và nhấnEnter
để lưu và thoát
#!/bin/bash
# Script to fix permissions and ownerships for one or more cPanel users
if [ "$#" -lt "1" ]; then
echo "Must specify at least one user"
exit 1
fi
USERS=$@
for user in $USERS; do
HOMEDIR=$(getent passwd "$user" | cut -d: -f6)
if [ ! -f /var/cpanel/users/"$user" ]; then
echo "User file missing for $user, skipping"
continue
elif [ -z "$HOMEDIR" ]; then
echo "Could not determine home directory for $user, skipping"
continue
fi
echo "Fixing ownership and permissions for $user"
# Ownership
chown -R "$user:$user" "$HOMEDIR" >/dev/null 2>&1
chmod 711 "$HOMEDIR" >/dev/null 2>&1
chown "$user:nobody" "$HOMEDIR/public_html" "$HOMEDIR/.htpasswds" 2>/dev/null
chown "$user:mail" "$HOMEDIR/etc" "$HOMEDIR/etc/"*/shadow "$HOMEDIR/etc/"*/passwd 2>/dev/null
# File permissions (parallel)
find "$HOMEDIR" -type f -print0 2>/dev/null | xargs -0 -P4 chmod 644 2>/dev/null
find "$HOMEDIR" -type d ! -name cgi-bin -print0 2>/dev/null | xargs -0 -P4 chmod 755 2>/dev/null
find "$HOMEDIR" -type d -name cgi-bin -print0 2>/dev/null | xargs -0 -P4 chmod 755 2>/dev/null
chmod 750 "$HOMEDIR/public_html" 2>/dev/null
# CageFS fixes
if [ -d "$HOMEDIR/.cagefs" ]; then
chmod 775 "$HOMEDIR/.cagefs" 2>/dev/null
chmod 700 "$HOMEDIR/.cagefs/tmp" "$HOMEDIR/.cagefs/var" 2>/dev/null
chmod 777 "$HOMEDIR/.cagefs/cache" "$HOMEDIR/.cagefs/run" 2>/dev/null
fi
done
Bước 2: Thiết lập quyền thực thi
Sau khi đã tạo file, bạn cần phải thiết lập quyền thực thi cho script:
Bài viết liên quan
chmod +x fixperms
Lệnh này sẽ làm cho file fixperms
có thể thực thi được.
Bước 3: Chạy script
- Đảm bảo bạn đang ở thư mục chứa file script. Nếu bạn đã di chuyển đến thư mục khác, bạn cần trỏ đến đường dẫn đầy đủ:
./fixperms tên_người_dùng
Hoặc nếu muốn chạy cho tất cả người dùng:
for i in `ls -A /var/cpanel/users` ; do ./fixperms $i ; done
- Nếu script không ở trong thư mục hiện tại, bạn cần sử dụng đường dẫn đầy đủ:
/đường/dẫn/đến/fixperms tên_người_dùng
Các tình huống thường gặp:
- Script không thực thi được: Đảm bảo bạn đã thiết lập quyền thực thi bằng
chmod +x fixperms
- Permission denied: Đảm bảo bạn đang chạy với quyền root hoặc sudo:
sudo ./fixperms tên_người_dùng
- Command not found: Nếu bạn nhận được lỗi này, hãy sử dụng đường dẫn đầy đủ hoặc đảm bảo bạn đang ở thư mục chứa script:
./fixperms
Chú ý dấu
./
ở đầu – nó chỉ định rằng file nằm trong thư mục hiện tại. - Muốn lưu kết quả: Bạn có thể lưu kết quả vào file log bằng cách:
./fixperms tên_người_dùng > fixperms_log.txt 2>&1
Vị trí phổ biến để lưu script
Script như thế này thường được lưu ở một trong các vị trí sau trên máy chủ cPanel:
/root/scripts/
/usr/local/bin/
(để có thể chạy từ bất kỳ thư mục nào)/home/admin/
(nếu bạn có tài khoản admin)
Nếu bạn lưu ở /usr/local/bin/
, bạn có thể chạy script mà không cần chỉ định đường dẫn:
cp fixperms /usr/local/bin/
chmod +x /usr/local/bin/fixperms
Giải thích chi tiết về script
1. Phần kiểm tra đầu vào
if [ "$#" -lt "1" ]; then
echo "Must specify at least one user"
exit 1
fi
USERS=$@
Đoạn code này kiểm tra xem script có được cung cấp ít nhất một tham số không (tên người dùng). Nếu không có tham số nào được truyền vào, script sẽ hiển thị thông báo lỗi và thoát với mã trạng thái 1. Biến $@
chứa tất cả các tham số được truyền vào script, cho phép chúng ta sửa quyền truy cập cho nhiều người dùng cùng một lúc.
2. Vòng lặp qua từng người dùng
for user in $USERS; do
HOMEDIR=$(getent passwd "$user" | cut -d: -f6)
if [ ! -f /var/cpanel/users/"$user" ]; then
echo "User file missing for $user, skipping"
continue
elif [ -z "$HOMEDIR" ]; then
echo "Could not determine home directory for $user, skipping"
continue
fi
Đoạn code này lặp qua từng người dùng được cung cấp. Với mỗi người dùng:
- Tìm thư mục home của người dùng bằng cách sử dụng lệnh
getent passwd
và trích xuất trường thứ 6 (thư mục home). - Kiểm tra xem file người dùng có tồn tại trong
/var/cpanel/users/
không. Đây là file cấu hình cPanel cho người dùng đó. - Kiểm tra xem thư mục home có được xác định không.
- Nếu một trong hai điều kiện không được đáp ứng, người dùng sẽ bị bỏ qua và vòng lặp tiếp tục với người dùng tiếp theo.
3. Sửa quyền sở hữu (Ownership)
echo "Fixing ownership and permissions for $user"
# Ownership
chown -R "$user:$user" "$HOMEDIR" >/dev/null 2>&1
chmod 711 "$HOMEDIR" >/dev/null 2>&1
chown "$user:nobody" "$HOMEDIR/public_html" "$HOMEDIR/.htpasswds" 2>/dev/null
chown "$user:mail" "$HOMEDIR/etc" "$HOMEDIR/etc/"*/shadow "$HOMEDIR/etc/"*/passwd 2>/dev/null
Đoạn code này:
- Thông báo rằng đang sửa quyền sở hữu và quyền truy cập cho người dùng hiện tại.
- Đặt lại toàn bộ quyền sở hữu của thư mục home cho người dùng và nhóm của họ (
chown -R "$user:$user" "$HOMEDIR"
). - Đặt quyền truy cập cho thư mục home là 711 (chủ sở hữu có thể đọc, viết và thực thi; người khác chỉ có thể thực thi).
- Đặt quyền sở hữu của thư mục
public_html
và.htpasswds
cho người dùng và nhóm “nobody” (đây là cấu hình chuẩn cho Apache). - Đặt quyền sở hữu của thư mục
etc
và các file shadow/passwd trong đó cho người dùng và nhóm “mail” (cần thiết cho hệ thống email).
4. Sửa quyền truy cập file (File permissions)
# File permissions (parallel)
find "$HOMEDIR" -type f -print0 2>/dev/null | xargs -0 -P4 chmod 644 2>/dev/null
find "$HOMEDIR" -type d ! -name cgi-bin -print0 2>/dev/null | xargs -0 -P4 chmod 755 2>/dev/null
find "$HOMEDIR" -type d -name cgi-bin -print0 2>/dev/null | xargs -0 -P4 chmod 755 2>/dev/null
chmod 750 "$HOMEDIR/public_html" 2>/dev/null
Đoạn code này:
- Sử dụng
find
để tìm tất cả các file trong thư mục home và đặt quyền truy cập cho chúng là 644 (chủ sở hữu có thể đọc và viết; người khác chỉ có thể đọc). - Tìm tất cả các thư mục (trừ thư mục cgi-bin) và đặt quyền truy cập cho chúng là 755 (chủ sở hữu có thể đọc, viết và thực thi; người khác có thể đọc và thực thi).
- Tìm tất cả các thư mục cgi-bin và đặt quyền truy cập cho chúng là 755.
- Đặt quyền truy cập cho thư mục
public_html
là 750 (chủ sở hữu có thể đọc, viết và thực thi; nhóm có thể đọc và thực thi; người khác không có quyền truy cập).
Lưu ý rằng script sử dụng tham số -P4
với xargs
, cho phép thực hiện 4 tiến trình song song để tăng tốc độ xử lý.
5. Sửa quyền truy cập CageFS
# CageFS fixes
if [ -d "$HOMEDIR/.cagefs" ]; then
chmod 775 "$HOMEDIR/.cagefs" 2>/dev/null
chmod 700 "$HOMEDIR/.cagefs/tmp" "$HOMEDIR/.cagefs/var" 2>/dev/null
chmod 777 "$HOMEDIR/.cagefs/cache" "$HOMEDIR/.cagefs/run" 2>/dev/null
fi
Đoạn code này:
- Kiểm tra xem CageFS có được sử dụng không (bằng cách kiểm tra sự tồn tại của thư mục
.cagefs
). - Nếu có, đặt quyền truy cập thích hợp cho thư mục
.cagefs
và các thư mục con của nó. - CageFS là một tính năng bảo mật trong CloudLinux giúp cô lập người dùng cPanel khỏi nhau.
Lưu ý bảo mật
- Script này nên được chạy với quyền root để đảm bảo có thể thiết lập tất cả các quyền cần thiết.
- Luôn sao lưu trước khi thực hiện các thay đổi hàng loạt đối với quyền truy cập file.
- Nếu bạn gặp vấn đề cụ thể với một trang web, hãy xem xét sửa quyền truy cập riêng cho trang web đó thay vì chạy script cho tất cả người dùng.
- Cẩn thận khi chạy script này trên máy chủ sản xuất trong giờ cao điểm vì nó có thể tạo ra tải I/O đáng kể.
- Đối với các trang WordPress, có thể cần thêm quyền viết cho thư mục uploads và một số thư mục plugin.
Script này là một công cụ hữu ích để khôi phục quyền truy cập file cPanel về trạng thái mặc định an toàn, đặc biệt sau khi di chuyển hoặc khôi phục dữ liệu.