
/
特定のユーザーに対する有効なファイルアクセス権を確認する方法を知る必要がありますが、ターゲットファイルまたはディレクトリから手動で起動したり、グループを確認したりするなどの作業を実行するのに時間がかかります。
答え1
私が知っている限り、唯一の方法は、説明されているように実行し、有効なユーザー/グループに対して設定された各権限を確認することです。または、sudoを実行できるように設定することもできますtest(1)
。
sudo -u luser test -x ~juser/bin/myprogram
あなたが言ったように、有効なユーザー/グループ権限を確認してください。
:
# called as $0 usertocheck pathname {r|w|x}
# for example, permcheck luser ~juser/bin/myprogrm x
# displays either "root", "user", "groups", "other" or "none"
user=$1
file=$2
smode=$3
# if user has no access from state, an empty string is returned, fuid,
# fgid and fmode would become empty strings as well; the end result is
# always showing 'none' even if $user has access (except $user == 'root')
set -- $(stat -L -c '%u %g %a' $file 2>&-)
awk -f $tmpawk \
-veuid="$(id -u $user)" \
-vgrp="$(id -G $user)" \
-vfuid="$1" \
-vfgid="$2" \
-vfmode="$(echo ibase=8\;$3 | bc)" \
-vsmode="$smode" \
'BEGIN {
if (euid == 0) { print "root"; exit; }
split(grp,Groups);
omode = fmode % 8; gmode = int(fmode / 8 % 8);
umode = int(fmode / 64 % 8);
# set up tests
# these could be function, but not all version of awk has a function
# statement
if (smode == "r") {
utest = int(umode / 4);
gtest = int(gmode / 4);
otest = int(omode / 4);
}
if (smode == "w") {
utest = int(umode / 2 % 2);
gtest = int(gmode / 2 % 2);
otest = int(omode / 2 % 2);
}
if (smode == "x") {
utest = (int(umode >= 4) && umode % 2);
gtest = (int(gmode >= 4) && gmode % 2);
otest = (int(omode >= 4) && omode % 2);
}
if (utest && fuid == euid) { print "user"; exit; }
for (idx in Groups) {
if (gtest && Groups[idx] == fgid) { print "group"; exit; }
}
if (otest) { print "other"; exit; }
print "none";
}
'
私のUbuntu 11.04システムでこのスクリプトを実行するのに平均約16ミリ秒かかります。また、statを読み取ったり実行したりする必要はありません。
答え2
コマンドstat
はティックですか?