いくつかの明らかな理由により、特定の1つのフォルダーにumask
値を設定する必要があります。どうすればそれができますか?
事前に感謝します!
更新1
特定のフォルダーにumaskを使用する必要がある理由は次のとおりです。 Webアプリケーションがあり、ファイルを作成するときのデフォルトのアクセス許可は700です。しかし、そのファイルには少なくとも755のアクセス許可が必要です。問題をより明確に説明できると思います。
setfacl
を使用できます
setfacl -d -m group:name:rwx /path/to/your/dir
ここで、name
はグループ名です
自分または特定のユーザーが属しているグループを見つけるには、 nix/linuxでは、コマンドラインを使用して特定のユーザーがどのグループに属しているかをどのように確認しますか?
ディレクトリごとに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を設定できます。 755
や644
などのアクセス許可はwebappにとって非常に危険であり、コードが機密である場合は誰でも読むことができることに注意してください。
別の解決策は、ディレクトリで作成されたファイルにグループIDを設定するだけです。これにより、ファイルを作成したユーザーのグループIDではなく、ディレクトリグループIDが新しいファイルを所有します。だから私はあなたがちょうどできると思う:
chown www-data:www-data /my/folder
chmod 4755 /my/folder
これにより、setgid特殊ファイルのアクセス許可が設定されます。これにより、/my/folder
で作成されたすべてのファイルがwww-data
グループに所有されます。
フォルダーのアクセス許可を変更するには、chmodを使用します。 umaskはファイル用です。
Umaskを必要なものに設定します
umask xxx
完了したら元に戻します
umask 022
Shell hooksおよび direnv
で実装された別のソリューションを提供します。 setfacl
がシステムで使用できない場合、次のソリューションの方が互換性が高い場合があります。 (例:macOS)
direnv
は、シェルの環境スイッチャーです。 bash、zsh、tcsh、fish shell、elvishをフックして、currentディレクトリに応じてnload環境変数を読み込む方法を知っています。
.envrc
を使用して、特定のディレクトリのexport
カスタムumask
値を使用すると、そのディレクトリを離れるとexport
ed 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)"
をコメント化し、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
関連していますが、この場合は適用できない可能性があります。次のクリップは.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
}
したがって、インタラクティブな使用では、そのようなものが機能します(ただし、セキュリティを提供しないことは明らかです)。