web-dev-qa-db-ja.com

特定のフォルダーにumaskを設定する方法

いくつかの明らかな理由により、特定の1つのフォルダーにumask値を設定する必要があります。どうすればそれができますか?

事前に感謝します!

更新1

特定のフォルダーにumaskを使用する必要がある理由は次のとおりです。 Webアプリケーションがあり、ファイルを作成するときのデフォルトのアクセス許可は700です。しかし、そのファイルには少なくとも755のアクセス許可が必要です。問題をより明確に説明できると思います。

23
Bakhtiyor

setfaclを使用できます

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

ここで、nameはグループ名です

自分または特定のユーザーが属しているグループを見つけるには、 nix/linuxでは、コマンドラインを使用して特定のユーザーがどのグループに属しているかをどのように確認しますか?

29
yogi70

ディレクトリごとにumaskを設定することはできません。これはプロセスレベルの値です。他の人がディレクトリ内のファイルを読み取れないようにする必要がある場合は、対応する許可ビットを取り消してください。

たとえば、プロセスから777などのアクセス権を取得できるファイルとディレクトリのあるディレクトリ/home/user/directoryがある場合、/home/user/directoryのアクセス許可ビットを700などに設定します。 /home/user/directoryで下降する他のユーザー(スーパーユーザーのルートを除く)。

私は妄想的で、/home/userの権限を750に設定しているので、自分だけが自分のホームディレクトリで読み取り、書き込み、および下降できます。これにより、/home/user/Publicのようなフォルダーに他のユーザーがアクセスすることはできませんが、私はそれで生きることができます。


あなたの質問の更新ごとに:それでも、あなたはファイルシステムでそれを制御することはできません(FATのような別のファイルシステムタイプを使用することを強くお勧めします)が、webappでそれを行う必要があります。 WebアプリケーションがPHPでコーディングされている場合、 umask 関数を使用して、その場でumaskを変更できます。

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

これを、データベース接続パスワードを含むファイルのような構成ファイルに入れることができます(Wordpressなどのアプリで考えてください)。

これはプロセス値であり、一部のWebサーバーでは構成ファイルで設定できることを忘れないでください。そうでない場合は、スタートアップスクリプトを変更して目的のumaskを設定できます。 755644などのアクセス許可はwebappにとって非常に危険であり、コードが機密である場合は誰でも読むことができることに注意してください。

11
Lekensteyn

別の解決策は、ディレクトリで作成されたファイルにグループIDを設定するだけです。これにより、ファイルを作成したユーザーのグループIDではなく、ディレクトリグループIDが新しいファイルを所有します。だから私はあなたがちょうどできると思う:

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

chmod 4755 /my/folder

これにより、setgid特殊ファイルのアクセス許可が設定されます。これにより、/my/folderで作成されたすべてのファイルがwww-dataグループに所有されます。

1
Bastiaan

フォルダーのアクセス許可を変更するには、chmodを使用します。 umaskはファイル用です。

Umaskを必要なものに設定します

umask xxx

完了したら元に戻します

umask 022
1
wojox

Shell hooksおよび direnv で実装された別のソリューションを提供します。 setfaclがシステムで使用できない場合、次のソリューションの方が互換性が高い場合があります。 (例:macOS)

direnvは、シェルの環境スイッチャーです。 bash、zsh、tcsh、fish shell、elvishをフックして、currentディレクトリに応じてnload環境変数を読み込む方法を知っています。

.envrcを使用して、特定のディレクトリのexportカスタムumask値を使用すると、そのディレクトリを離れるとexported env varがアンロードされます。

# example .envrc file
export UMASK=0022

作業ディレクトリが変更されたらumask値を変更するフックを定義します。

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"

当分の間、zshのdirenvフックの初期化はchpwdフックをサポートしません。このページが表示されたときにプル要求 GH-514 がマージされていない場合。次のコードを使用して、eval "$(direnv hook zsh)"をコメント化し、direnvchpwdに手動でフックしてください。

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

ソース: dynamic-umask-based-on-cwd.md

0
Simba

関連していますが、この場合は適用できない可能性があります。次のクリップは.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
}

したがって、インタラクティブな使用では、そのようなものが機能します(ただし、セキュリティを提供しないことは明らかです)。

0
Ville