đặt lại quyền trở về mặc định


10

Làm cách nào tôi có thể đặt lại quyền về mặc định theo mặt nạ, vì vậy họ sẽ có quyền được đặt khi tệp vừa được tạo

Ví dụ về những gì tôi muốn đạt được: umaskđược đặt thành 0022 vì vậy

touch file
mkdir directory

quyền của tập tin bây giờ là rw-r--r--

thư mục của permissons bây giờ là rwxr-xr-x

chmod 777 file
chmod 777 directory

quyền của tập tin bây giờ là rwxrwxrwx

quyền của thư mục bây giờ là rwxrwxrwx

Có cách nào để thiết lập lại perms trở lại mặc định để tập tin sẽ được rw-r--r--và thư mục rwxr-xr-xsử dụng chmod?

Câu trả lời:


6

Trong zsh, bạn chỉ có thể trừ umasktừ 0666cho các tệp và 0777cho các thư mục để có quyền mặc định:

$ printf "%04d\n" "$((0777 - $(umask)))"
0755
$ printf "%04d\n" "$((0666 - $(umask)))"
0644

Theo đó, bạn có thể áp dụng chmod:

chmod $((0666 - $(umask))) file
chmod $((0777 - $(umask))) directory

Trong bash, bạn phải sử dụng printfđể buộc đầu ra theo bát phân:

$ printf "%04d\n" "$((0777 - $(umask)))"
0493
$ printf "%04o\n" "$((0777 - $(umask)))"
0755

Một cách khác là tạo một tệp và thư mục mới và sử dụng chúng làm tài liệu tham khảo:

touch file2
mkdir directory2 
chmod --reference=directory2 directory
chmod --reference=file2 file

2
Ngoài ra, tôi đã tìm thấy một cái gì đó như chmod =rwx file, không chắc chắn chính xác những gì nó làm nhưng có vẻ như nó cũng đặt lại quyền cho mặc định nhưng chỉ cho các thư mục
lllook

6

Các mặt nạ được áp dụng thông qua bitwise ANDvới bitwise negatedmặt nạ, vì vậy nếu bạn muốn tạo chế độ cấp phép cuối cùng của riêng mình, bạn có thể làm:

$((mode & ~umask))

Bạn sẽ cần in lại bằng số bát phân để bạn có thể chuyển nó tới chmod:

$ chmod `printf '%o' $((0777 & ~$(umask)))` directory
$ chmod `printf '%o' $((0777 & ~0111 & ~$(umask)))` file
#^additional implicit mask of 0111 for files

trong đó 0777 là chế độ cấp phép bạn muốn áp dụng mặt nạ cho (bạn có thể lấy nó bằng stat -c %a filehoặc stat -c %a directory).

Bạn có thể vang ở trên để xem những gì quá trình thay thế sẽ đánh giá để (đối với một umasksố 0022, bạn sẽ nhận được 755644).

Bạn có thể tạo một hàm chung từ nó:

#takes a umask as first param and applies it to each folowing param (files)
maskMode(){
  local mask="$1" dmask mode a
  dmask="$((mask & ~0111))"; shift
  for a; do
    mode=0`stat -c "%a" "$a"`
    chmod `printf "%0.4o\n" $(($mode & ~mask))` "$a"
  done
}

Đối với mục đích sử dụng cụ thể của bạn, các tệp tham chiếu chmod là một tùy chọn khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.