Có cách nào để sao lưu và khôi phục quyền sở hữu và quyền của tệp (những thứ có thể thay đổi bằng chown
và chmod
) không?
Bạn có thể làm điều này trong Windows bằng icacls .
Điều gì về danh sách kiểm soát truy cập?
Có cách nào để sao lưu và khôi phục quyền sở hữu và quyền của tệp (những thứ có thể thay đổi bằng chown
và chmod
) không?
Bạn có thể làm điều này trong Windows bằng icacls .
Điều gì về danh sách kiểm soát truy cập?
Câu trả lời:
Bạn có thể làm điều này với các lệnh từ gói acl (sẽ có sẵn trên tất cả các bản phân phối chính, nhưng có thể không phải là một phần của cài đặt cơ sở). Họ sao lưu và khôi phục ACL khi có ACL, nhưng chúng cũng hoạt động cho các quyền cơ bản ngay cả trên các hệ thống không hỗ trợ ACL.
Để sao lưu quyền trong thư mục hiện tại và các thư mục con của nó theo cách đệ quy:
getfacl -R . >permissions.facl
Để khôi phục quyền:
setfacl --restore=permissions.facl
setfacl
Tập tin sau đó không thể chmod
một lần nữa, có thể sẽ gây ra xung đột?
Tôi không biết bất cứ điều gì "ngoài giá" sẽ làm điều này. Tuy nhiên, đây là một kịch bản khởi động cho bạn, sẽ xử lý các quyền cơ bản. Nó không xử lý ACL của bất kỳ mô tả nào - nhưng Câu hỏi của bạn loại trừ rõ ràng những câu hỏi đó. (Nó cũng sẽ thất bại với tên tệp bệnh lý - những tên bắt đầu bằng khoảng trắng hoặc chứa các ký tự không in được.)
Lưu quyền
find * -depth -exec stat --format '%a %u %g %n' {} + >/tmp/save-the-list
Khôi phục quyền
while read PERMS OWNER GROUP FILE
do
chmod "$PERMS" "$FILE"
chown "${OWNER}:${GROUP}" "$FILE"
done </tmp/save-the-list
.htaccess
, gitignore
...
#!/bin/bash
# prepare files
home="/home/exchange"
cd $home
>acl
echo "#!/bin/bash">recovery_acl.sh
echo "cd $home">>recovery_acl.sh
f='./'
# create acl file sorted by dir_level
for i in `seq 0 15`;do
find . -mindepth $i -maxdepth $i -type d -exec getfacl {} +|grep -E '*UTS|file:'>>acl
done
sed -i 's/default\:user/\-dm\ u/g' acl
sed -i 's/default\:group/\-dm\ g/g' acl
sed -i 's/user/\-m\ u/g' acl
sed -i 's/group/\-m\ g/g' acl
sed -i 's/\#\ file\:\ /\.\//g' acl
sed -i 's,\\,\\\\,g' acl
while IFS='' read -r line ; do
# grep dir name
if echo "$line" | grep -q "$f" ; then
dir="$line"
continue
fi
echo setfacl $line '"'$dir'"'>>recovery_acl.sh
# grep non def acl (for files)
if echo "$line" | grep -q '\-m' ; then
echo setfacl $line '"'$dir'"'/*>>recovery_acl.sh
fi
done < "acl"
sed -i "s/\\\134/\\\\\\\134/g" recovery_acl.sh
sed -i "s/\\\040/\\\\ /g" recovery_acl.sh
Tập lệnh bash này chỉ nhận các thư mục acl (trong trường hợp của tôi là tập tin acls = dir (cha mẹ) acl) Sau khi thực thi tập lệnh, sẽ tạo một "recovery_acl.sh" khác.
Trong khi khôi phục các lỗi như "Không có tệp hoặc thư mục như vậy" có nghĩa là dir trống hoặc dirname có hai / nhiều khoảng trắng cùng nhau.