Cách đặt ô cho một thư mục cụ thể


23

Đối với một số lý do rõ ràng tôi cần đặt umaskgiá trị cho một thư mục cụ thể. Làm thế nào người ta có thể làm điều đó?

Cảm ơn trước!

CẬP NHẬT 1

Lý do tôi cần sử dụng umask cho một thư mục cụ thể là sau. Tôi có một ứng dụng web và khi nó tạo một số tệp, quyền mặc định là 700. Nhưng tôi cần ít nhất 755 quyền cho tệp đó. Tôi nghĩ rằng tôi có thể giải thích vấn đề rõ ràng hơn bây giờ.


1
Những lý do có thể rõ ràng với bạn, nhưng với chúng tôi thì không. Hãy chia sẻ những gì bạn muốn làm.
htorque

@htorque. Đã thêm lý do tại sao tôi cần sử dụng umask trong vấn đề cụ thể của mình.
Bakhtiyor

Câu trả lời:


30

bạn đã có thể sử dụng setfacl

setfacl -d -m group:name:rwx /path/to/your/dir

Trong trường hợp namelà tên nhóm

Để tìm những nhóm bạn hoặc một người dùng cụ thể, hãy xem Trong unix / linux, làm thế nào để bạn tìm ra nhóm người dùng cụ thể đang ở trong dòng lệnh nào?


1
Có lẽ setfaclđã thay đổi. Tôi nhận được một thông báo lỗi -mkhông phải là một lựa chọn hợp lệ.
Ryan Burnette

Ryan, setfaclkhông thay đổi. Nhiều khả năng bạn chưa cung cấp tên nhóm thích hợp (sau -m).
sergk

1
khá chắc chắn setfacllà cho danh sách kiểm soát truy cập và không umask. Một giải pháp tốt hơn nhưng không thực sự là những gì được hỏi, tôi không nghĩ.
Wyatt8740

thử: sudo setfacl -Rdm ...(Bỏ qua R để đệ quy) sẽ hoạt động. @ Wyatt8740 (đúng). Để được chạy nhất định: man setfaclvà gõ /-modify. Bạn cần sử dụng sudo.
JREAM

11

Bạn không thể đặt umask cho mỗi thư mục, đó là một giá trị cấp độ quy trình. Nếu bạn cần ngăn người khác đọc tệp trong một thư mục, hãy thu hồi các bit quyền tương ứng.

Ví dụ: nếu bạn có một thư mục /home/user/directorychứa một số tệp và thư mục có thể nhận quyền như 777 từ một quy trình, hãy đặt các bit quyền của /home/user/directorymột thứ gì đó như 700. Điều đó sẽ khiến những người dùng khác (không bao gồm root superuser) không thể hạ xuống trong /home/user/directory.

Tôi bị hoang tưởng và đặt quyền lên /home/user750, vì vậy chỉ tôi mới có thể đọc, viết và hạ xuống trong thư mục nhà của mình. Điều này có hậu quả là những thư mục như /home/user/Publickhông thể được người khác truy cập, nhưng tôi có thể sống với điều đó.


Mỗi lần cập nhật câu hỏi của bạn: vẫn vậy, bạn không thể kiểm soát điều đó trong hệ thống tệp (ngoài việc sử dụng một loại hệ thống tệp khác như FAT rất khó chịu), bạn cần phải làm điều đó trong ứng dụng web của mình. Nếu ứng dụng web của bạn được mã hóa bằng PHP, bạn có thể thay đổi ô ngay lập tức bằng cách sử dụng umaskchức năng:

<?php
umask(0022);
// other code
?>

Bạn có thể đặt tệp này trong tệp cấu hình, như tệp chứa mật khẩu kết nối cơ sở dữ liệu (suy nghĩ trong các ứng dụng như Wordpress).

Hãy nhớ rằng đó là một giá trị quy trình, một số máy chủ web cho phép bạn đặt nó trong các tệp cấu hình của chúng, nếu không bạn có thể sửa đổi các tập lệnh khởi động để đặt ô mong muốn. Hãy nhớ rằng các quyền như 755644khá nguy hiểm cho các ứng dụng web, nếu mã nhạy cảm, mọi người đều có thể đọc nó.


Tôi biết điều này là cổ xưa, nhưng tôi nghĩ rằng nó đáng được đề cập: quản trị viên có thể liên kết mount /home/user/Public( mount -o bind /home/user/Public /some/other/place) để giải quyết vấn đề cấp phép thư mục mẹ.
Adrian Günter

1

Để thay đổi quyền cho một thư mục sử dụng chmod. umask là cho các tập tin.

Đặt ô cho những gì bạn cần

umask xxx

và thay đổi trở lại khi bạn hoàn thành

umask 022

11
umask = tập tin và thư mục, fmask = chỉ tập tin, dmask = chỉ thư mục. : P
htorque

1
Tôi đã học được một cái gì đó mới ngày hôm nay :)
wojox

1
Trên thực tế đó là các tùy chọn cho một số hệ thống tệp nhất định như NTFS (không phải lệnh thiết lập mặt nạ tạo tệp umask). Xin lỗi vì đã thêm thông tin khó hiểu.
htorque

umask thay đổi mặt nạ tạo tệp cho quy trình hiện tại (trình bao hiện tại), nếu bạn có một quy trình mở khác hoặc do người dùng sở hữu, tôi không tin rằng nó sẽ bị ảnh hưởng. Lệnh này cũng sẽ ảnh hưởng đến bất kỳ tệp nào khác được tạo bên ngoài thư mục cho đến khi bạn thay đổi lại.
Dave

1

Một giải pháp khác có thể là chỉ đặt id nhóm trên các tệp được tạo trong thư mục, điều này làm cho các tệp mới được sở hữu bởi id nhóm thư mục, thay vì id nhóm của người dùng đã tạo các tệp. Vì vậy, tôi nghĩ rằng bạn có thể làm:

chown www-data:www-data /my/folder

chmod 4755 /my/folder

Điều này đặt quyền cho tập tin đặc biệt setgid, điều này sẽ khiến tất cả các tệp được tạo /my/folderthuộc sở hữu của www-datanhóm, sau đó có quyền rx (5) vì thư mục mẹ.


2
Bạn đã nhầm GUID với giá trị bát phân SUID
adampski

1

Cung cấp giải pháp bao phấn thực hiện với móc vỏdirenv. Giải pháp sau đây có thể tương thích hơn trong trường hợp setfaclkhông có sẵn trên hệ thống của bạn. (ví dụ: macOS)

direnvlà một công cụ chuyển đổi môi trường cho vỏ. Nó biết cách móc vào bash, zsh, tcsh, shell fish và elvish để tải hoặc dỡ bỏ các biến môi trường tùy thuộc vào thư mục hiện tại .

Sử dụng .envrcđể exporttùy chỉnh umaskgiá trị cho thư mục cụ thể và exportvar env var sẽ được tải khi bạn rời khỏi thư mục đó.

# example .envrc file
export UMASK=0022

Xác định một hook để thay đổi umaskgiá trị khi dir làm việc được thay đổi.

function _umask_hook {
  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  elif [[ $OSTYPE == darwin* ]]; then
    umask 0077
  else
    umask 0022
  fi
}

# To make the code more reliable on detecting the default umask
function _umask_hook {
  # Record the default umask value on the 1st run
  [[ -z $DEFAULT_UMASK ]] && export DEFAULT_UMASK="$(builtin umask)"

  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  else
    umask "$DEFAULT_UMASK"
  fi
}

# zsh hooks
# trigger _umask_hook once working dir is changed
add-zsh-hook chpwd _umask_hook

# bash
# Append `;` if PROMPT_COMMAND is not empty
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}_umask_hook"

Hiện tại, khởi tạo hook direnv cho zsh không hỗ trợ chpwdhook. Nếu yêu cầu kéo GH-514 chưa được hợp nhất khi bạn thấy trang này. Vui lòng bình luận eval "$(direnv hook zsh)"và móc direnvvào chpwdbằng tay với mã sau đây,

if (( $+commands[direnv] )) && ! (( $+functions[_direnv_hook] )); then
  _direnv_hook() {
    eval "$(command "direnv" export zsh)";
  }
  typeset -agU precmd_functions;
  if [[ -z ${precmd_functions[(r)_direnv_hook]} ]]; then
    precmd_functions=( _direnv_hook ${precmd_functions[@]} )
  fi

  typeset -agU chpwd_functions;
  if [[ -z ${chpwd_functions[(r)_direnv_hook]} ]]; then
    chpwd_functions=( _direnv_hook ${chpwd_functions[@]} )
  fi
fi

Nguồn: Dynamic-umask-basing-on-cwd.md


0

Liên quan, nhưng có thể không áp dụng trong trường hợp này, clip sau đây là từ .zshrc:

# Change the umask automatically for some directories; use 0022 as the default
chpwd () {
    case $PWD in
        $HOME/[Dd]ocuments*)
            if [[ $(umask) -ne 077 ]]; then
                umask 0077
                echo -e "\033[01;32mumask: private \033[m"
            fi;;
        */[Ww]eb*)
            if [[ $(umask) -ne 072 ]]; then
                umask 0072
                echo -e "\033[01;33mumask: other readable \033[m"
            fi;;
        /vol/nothing)
            if [[ $(umask) -ne 002 ]]; then
                umask 0002
                echo -e "\033[01;35mumask: group writable \033[m"
            fi;;
        *)
            if [[ $(umask) -ne 022 ]]; then
                umask 0022
                echo -e "\033[01;31mumask: world readable \033[m"
            fi;;
    esac
}

Vì vậy, để sử dụng tương tác, một cái gì đó như thế sẽ hoạt động (nhưng, rõ ràng, không cung cấp bảo mật).

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.