rwx/rwt 등과 8진수 버전 사이에 쉘 스크립트 변환기가 있습니까?

rwx/rwt 등과 8진수 버전 사이에 쉘 스크립트 변환기가 있습니까?

나는 대본을 훑어보았다.

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");'

정말 훌륭하지만 끈적한 비트, suid, sgid와 같은 추가 권한이 부족합니다. 스크립트에 포함시켜주시면 더욱 감사하겠습니다.

답변1

이것은 배쉬입니다:

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

끈끈한 비트 등을 처리하지 않습니다. 이렇게 하려면 다음을 사용하세요.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

Perl에는 다음과 같은 기능이 내장되어 있습니다.stat기능:

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

답변2

statSticky, setuid 또는 setgid를 처리할 때 (다루기가 더 어렵더라도)를 사용할 필요가 없으며 BASHism도 필요하지 않습니다. BASH가 없는 매우 오래된 UNIX에 대한 /tmp의 예:

ls -ld /tmp | \
tee /dev/stderr | \
awk '{ k=0; for(i=0; i<=8; i++) k+=((substr($1, i+2, 1) ~ /[rwxs]/)*2^(8-i));
       if ($1 ~ /^.{3}[Ss]/) k+=2048; if($1 ~ /^.{6}[Ss]/) k+=1024;
       if ($1 ~ /[Tt]/) k+=512; if(k) printf("%04o\n",k) }'
drwxrwxrwt   3 sys      sys         2560 Jul 16 12:39 /tmp
1776

즉 말하자면,글렌 잭맨이 솔루션 perl stat은 단순성을 위해 선호되며 약간만 수정하면 셸 변수에서 대상을 허용할 수 있습니다(동일한 이전 UNIX에서도 작동함).

$ what="/tmp"
$ perl -s -e '@fields = stat "$f"; printf "%04o\n", $fields[2] & 07777' -- -f="$what"
1777

awk 스크립트는 발견된 스크립트를 기반으로 합니다.여기

관련 정보