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

  1. Đă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
    
  2. Tạo file script bằng một trình soạn thảo. Bạn có thể sử dụng nano hoặc vi:
    nano fixperms
    

    hoặc

    vi fixperms
    
  3. 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
    • :wq và nhấn Enter để 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:

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

  1. Đả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
    
  2. 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:

  1. 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
  2. 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
    
  3. 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.

  4. 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.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

  1. 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.
  2. 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.
  3. 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.
  4. 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ể.
  5. Đố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.

Đánh giá

donate Nếu bạn thấy bài viết có ích bạn có thể donate cho team hoặc chia sẻ bài viết này. Ngoài ra bạn có thể yêu cầu thêm bài viết tại đây
user

Yêu thích Võ thuật và Công nghệ thông tin, thích viết và chia sẽ về 2 lĩnh vực này thế thôi :D

Bài viết liên quan