Existe um conversor de shell script entre rwx / rwt etc e a versão octal?

0

Eu passei pelo script

echo 'rwxrwxrw-' | perl -ne 'BEGIN{sub conv{ chomp(my $ins=shift); my $k=0; for(my $i=0;$i<=8;$i++) { my $tmps = ( substr($ins, $i, 1) =~ /[rwx]/ ); $k+= ( $tmps*(2**(8-$i)) ); }; if ($k) { sprintf(" %0o ", $k); } else { "??" ; }; }; } print(conv($_)."\n");'

É realmente maravilhoso, mas a falta de permissões extras é pegajosa, suid, sgid. Eu serei mais grato se você pudesse incluí-los no roteiro.

    
por Shamsu Mohd 29.11.2015 / 14:19

1 resposta

0

isto é bash:

perms="rwxr-xr-x"
p=0
for ((i=0; i<${#perms}; i++)); do
    ((p <<= 1))
    [[ ${perms:i:1} == "-" ]] || ((p += 1))
done
printf "%o\n" $p   # ==> 755

Não manipula bits pegajosos, etc. Para isso, use stat

$ touch afile
$ chmod 2700 afile
$ ls -l afile
-rwx--S--- 1 jackman jackman 0 Nov 29 09:36 afile*
$ stat -c '%a' afile
2700

O Perl tem uma função stat incorporada:

$ perl -e '@fields = stat "afile"; printf "%04o\n", $fields[2] & 07777'
2700
    
por 29.11.2015 / 15:38