Um comando para verificar a permissão de acesso a arquivos para outro usuário

2

Eu preciso saber como verificar as permissões efetivas de acesso a arquivos para um determinado usuário, mas demora muito para fazer isso manualmente, começando de / até o arquivo ou diretório de destino, verificando o grupo, ... etc.

    
por mmonem 25.09.2011 / 21:40

2 respostas

1

Pelo que vejo, as únicas maneiras seriam fazer o que você descreve, verificar cada um dos conjuntos de permissões em relação ao usuário / grupo efetivo. Ou você pode tentar configurar o sudo para poder usar test(1) .

sudo -u luser test -x ~juser/bin/myprogram

Como você disse, verifique as permissões efetivas de usuário / grupos:

:

# 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";
}
'

No meu sistema Ubuntu 11.04, a execução deste script demora, em média, cerca de 16ms. Além disso, stat não precisa de leitura / execução por

    
por 26.09.2011 / 03:56
0

O comando stat faria o tick?

    
por 25.09.2011 / 23:21