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


23

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

事前に感謝します!

更新1

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


1
その理由は明らかですが、私たちにはわかりません。やりたいことを共有してください。
htorque

@htorque。特定の問題でumaskを使用する必要がある理由を追加しました。
バクティオル

回答:


30

あなたが使うことができます setfacl

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

nameグループ名はどこですか

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


1
おそらくsetfacl変わった。-m有効なオプションではないというエラーが表示されます。
ライアンバーネット

ライアン、setfacl変更されていません。ほとんどの場合、適切なグループ名を指定していません(後-m)。
セルク

1
かなり確実setfaclアクセス制御リスト用であり、そうでありませんumask。より良い解決策ですが、実際に尋ねられたものではない、とは思わない。
Wyatt8740

try:(sudo setfacl -Rdm ...再帰のRを省略)動作するはずです。@ Wyatt8740(正しい)。確実に実行するには:man setfaclを入力し /-modifyます。を使用する必要がありますsudo
JREAM

11

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

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

私は妄想的で、パーミッション/home/userを750に設定しているので、自分だけがホームディレクトリで読み取り、書き込み、および下降できます。これは、/home/user/Public他の人がアクセスできないようなフォルダを結果として持っていますが、私はそれで生きることができます。


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

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

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

これはプロセス値であり、一部のWebサーバーでは設定ファイルで設定できることを忘れないでください。そうでない場合は、起動スクリプトを変更して目的のumaskを設定できます。権限が好きなことを忘れないでください755644コードが敏感であれば、誰もがそれを読むことができ、ウェブアプリケーションのための非常に危険です。


私はこれが古いことを知っていますが、言及する価値があると思います:管理者はマウント/home/user/Publicmount -o bind /home/user/Public /some/other/place)をバインドして、親ディレクトリのアクセス許可の問題を回避できます。
エイドリアンギュンター

1

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

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

umask xxx

完了したら元に戻します

umask 022

11
umask =ファイルとディレクトリ、fmask =ファイルのみ、dmask =ディレクトリのみ。:P
htorque

1
今日何か新しいことを学びました:)
wojox

1
実際には、NTFSなどの特定のファイルシステムのオプションです(そのファイル作成マスク設定コマンドではありませんumask)。わかりにくい情報を追加してすみません。
htorque

umaskは、現在のプロセス(現在のシェル)のファイル作成マスクを変更します。別のシェルを開いたり、ユーザー所有のプロセスを使用している場合、影響を受けるとは思いません。このコマンドは、元に戻すまで、ディレクトリ外で作成された他のファイルにも影響します。
デイブ

1

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

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

chmod 4755 /my/folder

これにより、setgid特殊ファイルのアクセス許可が設定されます。これ/my/folderにより、作成されたすべてのファイルがwww-dataグループによって所有され、グループは親ディレクトリのためにrx(5)アクセス許可を持ちます。


2
GUIDをSUID 8進数値と間違えました
-adampski

1

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

direnvシェル用の環境スイッチャーです。現在のディレクトリに応じて環境変数をロードまたはアンロードするために、bash、zsh、tcsh、fish shell、elvishにフックする方法を知っています。

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

# 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)"、次のコードで手動でフックdirenvしてくださいchpwd

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

この場合には関連し、多分適用されません、次のクリップからです.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
}

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.