최소한의 프로세스 생성으로 사용자가 작성할 수있는 파일 찾기


20

나는 뿌리입니다. 루트가 아닌 사용자가 일부 파일에 대해 수천 개의 파일에 대한 쓰기 권한을 가지고 있는지 알고 싶습니다. 프로세스 생성을 피하면서 효율적으로 수행하는 방법은 무엇입니까?


당신이 실제로 무엇을하는지 보여주세요!
F. Hauri


경쟁 조건에 신경 쓰지 않는다고 가정하면 access(2)적절하게 설정된 실제 UID (예 : via setresuid(2)또는 휴대용 등가물)로 전화하지 않는 이유 는 무엇입니까? 내 말은, bash에서 그렇게하기가 어려워졌지만 Perl / Python이 처리 할 수 ​​있다고 확신합니다.
Kevin

1
@Kevin, shells [ -w은 일반적으로 access (2) 또는 이와 동등한 것을 사용합니다. 또한 uid 외에도 gid를 설정해야합니다 (su 또는 sudo처럼). bash는 기본적으로 지원하지 않지만 zsh는 지원합니다.
Stéphane Chazelas

@ StéphaneChazelas- chgrp모든 쉘에서 사용할 수 있습니다 .
mikeserv

답변:


2

아마도 이것처럼 :

#! /bin/bash

writable()
{
    local uid="$1"
    local gids="$2"
    local ids
    local perms

    ids=($( stat -L -c '%u %g %a' -- "$3" ))
    perms="0${ids[2]}"

    if [[ ${ids[0]} -eq $uid ]]; then
        return $(( ( perms & 0200 ) == 0 ))
    elif [[ $gids =~ (^|[[:space:]])"${ids[1]}"($|[[:space:]]) ]]; then
        return $(( ( perms & 020 ) == 0 ))
    else
        return $(( ( perms & 2 ) == 0 ))
    fi
}

user=foo
uid="$( id -u "$user" )"
gids="$( id -G "$user" )"

while IFS= read -r f; do
    writable "$uid" "$gids" "$f" && printf '%s writable\n' "$f"
done

위의 내용은 각 파일마다 단일 외부 프로그램을 실행합니다. stat(1) .

참고 :bash(1)및 Linux의 화신은 이라고 가정합니다 stat(1).

참고 2 : 이 접근법의 과거, 현재, 미래 및 잠재적 위험과 제한 사항에 대해서는 아래의 Stéphane Chazelas의 의견을 읽으십시오.


사용자가 파일이있는 디렉토리에 액세스 할 수없는 경우에도 파일을 쓸 수 있다고 말할 수 있습니다.
Stéphane Chazelas 8:15에

파일 이름에 줄 바꿈 문자가 포함되어 있지 않으며 stdin에 전달 된 파일 경로는로 시작하지 않는다고 가정합니다 -. 대신 다음을 사용하여 NUL 구분 목록을 허용하도록 수정할 수 있습니다.read -d ''
Stéphane Chazelas

Linux stat 와 같은 것은 없습니다 . Linux는 일부 GNU 및 비 GNU 시스템에서 발견되는 커널입니다. util-linuxLinux 용으로 특별히 작성된 명령 (과 같은 )이 있지만 stat참조하는 것은 Linux 가 아닌 대부분의 시스템에 이식 된 GNU 명령입니다. 또한 statGNU stat가 작성 되기 오래 전에 Linux 에서 명령을 stat받았습니다 ( zsh 내장).
Stéphane Chazelas

2
@ Stéphane Chazelas : Linux 통계와 같은 것은 없습니다. -나는 "리눅스 화신"을 썼다고 믿는다 stat(1). 나는 BSD 구문과 반대로 구문 stat(1)을 받아들이 는 것을 언급하고 -c <format>있습니다 -f <format>. 또한 내가 언급하지 않은 것이 분명하다고 생각합니다 stat(2). 나는 일반적인 명령의 역사에 관한 위키 페이지가 꽤 흥미로울 것이라고 확신합니다.
lcd047

1
@ Stéphane Chazelas : 사용자가 파일이있는 디렉토리에 액세스 할 수 없더라도 파일을 쓸 수 있다고 말할 수 있습니다. -사실이며 아마도 합리적인 한계입니다. 파일 이름에 줄 바꿈 문자가 포함되어 있지 않다고 가정합니다 . stdin에 전달 된 파일 경로는 --편집으로 시작하지 않습니다 . 감사합니다.
lcd047

17

TL; DR

find / ! -type l -print0 |
  sudo -u "$user" perl -Mfiletest=access -l -0ne 'print if -w'

사용자에게 쓰기 권한이 있는지 시스템에 문의해야합니다. 신뢰할 수있는 유일한 방법은 효과적인 uid, 효과적인 gid 및 보충 gid를 사용자의 것으로 바꾸고access(W_OK) 시스템 호출을 것입니다 (일부 시스템 / 구성에 일부 제한이 있음).

파일에 대한 쓰기 권한이 없다고해서 해당 경로에서 파일의 내용을 수정할 수 없다는 것을 반드시 명심해야합니다.

더 긴 이야기

의 그것에 대한 쓰기 접근이 달러 (A $)의 사용자에 대해 예를 들면 무엇이 필요한지 생각해 보자 /foo/file.txt의 (가정 없음을/foo 하고 /foo/file.txt심볼릭 링크입니다)을?

그는 필요하다 :

  1. 에 대한 검색 액세스/ (필요 없음 read)
  2. 에 대한 검색 액세스/foo (필요 없음 read)
  3. 쓰다 권한/foo/file.txt

이미 @ lcd047 's 또는 @ apaul ' s 와 같이 접근 권한 만 확인 하는 접근 방식 은 사용자에게 검색 권한이없는 경우에도 쓰기 가능 file.txt하다고 말할 수 있기 때문에 작동 file.txt하지 않습니다./ 또는 /foo.

그리고 다음과 같은 접근법 :

sudo -u "$user" find / -writeble

그것으로 (사용자가 읽기 액세스 권한이없는 디렉토리에있는 파일을보고하지 않기 때문에 중 하나가 작동하지 않음 find으로 실행$user 내용을 나열 할 수없는 상태 .

ACL, 읽기 전용 파일 시스템, FS 플래그 (불변과 같은), 기타 보안 조치 (서로 다른 유형의 쓰기를 구분할 수있는 의류, SELinux)를 잊고 기존 권한과 소유권 속성에만 초점을 맞추면 (검색 또는 쓰기) 권한이 주어지면 이미 상당히 복잡하고 표현하기가 어렵습니다 find.

당신이 필요합니다 :

  • 파일이 본인 소유인 경우 소유자에 대한 해당 권한이 필요합니다 (또는 uid 0).
  • 파일을 소유하지 않았지만 그룹이 귀하의 파일 인 경우 그룹에 대한 해당 권한이 필요합니다 (또는 uid 0).
  • 귀하의 소유가 아니며 귀하의 그룹이 아닌 경우 다른 권한이 적용됩니다 (uid가 0이 아닌 경우).

에서는 find구문 여기서 UID 1 및 GID 1 및 2의 사용자와의 일례로서, 그 것이다 :

find / -type d \
  \( \
    -user 1 \( -perm -u=x -o -prune \) -o \
    \( -group 1 -o -group 2 \) \( -perm -g=x -o -prune \) -o \
    -perm -o=x -o -prune \
  \) -o -type l -o \
    -user 1 \( ! -perm -u=w -o -print \) -o \
    \( -group 1 -o -group 2 \) \( ! -perm -g=w -o -print \) -o \
    ! -perm -o=w -o -print

자두 사용자가 다른 형식의 파일 (그들은 관련이없는 것 같이 제외 심볼릭 링크), 쓰기 액세스에 대한 검사에 적합한 검색하지 않는 디렉토리.

디렉토리에 대한 쓰기 액세스도 고려하려면 다음을 수행하십시오.

find / -type d \
  \( \
    -user 1 \( -perm -u=x -o -prune \) -o \
    \( -group 1 -o -group 2 \) \( -perm -g=x -o -prune \) -o \
    -perm -o=x -o -prune \
  \) ! -type d -o -type l -o \
    -user 1 \( ! -perm -u=w -o -print \) -o \
    \( -group 1 -o -group 2 \) \( ! -perm -g=w -o -print \) -o \
    ! -perm -o=w -o -print

또는 $user사용자 데이터베이스에서 임의 및 그룹 구성원을 검색 한 경우 :

groups=$(id -G "$user" | sed 's/ / -o -group /g'); IFS=" "
find / -type d \
  \( \
    -user "$user" \( -perm -u=x -o -prune \) -o \
    \( -group $groups \) \( -perm -g=x -o -prune \) -o \
    -perm -o=x -o -prune \
  \) ! -type d -o -type l -o \
    -user "$user" \( ! -perm -u=w -o -print \) -o \
    \( -group $groups \) \( ! -perm -g=w -o -print \) -o \
    ! -perm -o=w -o -print

(즉, 총 3 개 과정이다 : id, sedfind )

여기서 가장 좋은 방법은 트리를 루트로 내림차순으로 각 파일의 사용자 권한을 확인하는 것입니다.

 find / ! -type l -exec sudo -u "$user" sh -c '
   for file do
     [ -w "$file" ] && printf "%s\n" "$file"
   done' sh {} +

(즉, 하나 개의 find프로세스를 더한 sudosh모든 수천 파일을 처리, [printf 일반적으로 쉘에 내장되어 있습니다).

또는과 perl:

find / ! -type l -print0 |
  sudo -u "$user" perl -Mfiletest=access -l -0ne 'print if -w'

(총 3 개 공정 : find, sudoperl ).

또는과 zsh:

files=(/**/*(D^@))
USERNAME=$user
for f ($files) {
  [ -w $f ] && print -r -- $f
}

(총 0 개의 프로세스이지만 전체 파일 목록을 메모리에 저장)

이러한 솔루션은 access(2)시스템 호출 에 의존합니다 . 그것은 시스템이 액세스 권한을 확인하는 데 사용하는 알고리즘을 재생산하는 대신 시스템에 동일한 알고리즘 (권한, ACL, 불변 플래그, 읽기 전용 파일 시스템을 고려한)을 사용하여 확인하도록 요청하는 것입니다. ) 파일을 쓰기 위해 열려고 할 때 신뢰할 수있는 솔루션에 가장 가깝습니다.

다양한 사용자, 그룹 및 권한 조합으로 여기에 제공된 솔루션을 테스트하려면 다음을 수행하십시오.

perl -e '
  for $u (1,2) {
    for $g (1,2,3) {
      $d1="u${u}g$g"; mkdir$d1;
      for $m (0..511) {
        $d2=$d1.sprintf"/%03o",$m; mkdir $d2; chown $u, $g, $d2; chmod $m,$d2;
        for $uu (1,2) {
          for $gg (1,2,3) {
            $d3="$d2/u${uu}g$gg"; mkdir $d3;
            for $mm (0..511) {
              $f=$d3.sprintf"/%03o",$mm;
              open F, ">","$f"; close F;
              chown $uu, $gg, $f; chmod $mm, $f
            }
          }
        }
      }
    }
  }'

1과 2 사이의 사용자와 1, 2, 3 사이의 그룹을 변경하고 이미 작성된 9458694 파일이므로 권한의 하위 9 비트로 제한합니다. 디렉토리와 파일에 대한 것입니다.

가능한 모든 조합을 만듭니다 u<x>g<y>/<mode1>/u<z>g<w>/<mode2>. uid 1 및 gid 1 및 2를 가진 사용자 는 예를 들어 쓰기 액세스 권한을 u2g1/010/u2g3/777갖지만 액세스 권한은 없습니다 u1g2/677/u1g1/777.

이제 모든 솔루션은 사용자가 쓰기 위해 열 수있는 파일의 경로를 식별하려고 시도합니다. 이는 사용자가 컨텐츠를 수정할 수있는 경로와 다릅니다. 보다 일반적인 질문에 대답하기 위해 고려해야 할 몇 가지 사항이 있습니다.

  1. $ user는 쓰기 권한이 /a/b/file없지만 소유하고있는 경우 file(에 대한 검색 액세스 권한이 /a/b있고 파일 시스템이 읽기 전용이 아니며 파일에 변경할 수없는 플래그가없고 시스템에 대한 쉘 액세스 권한이있는 경우) 그런 다음 그는 권한을 변경 file하고 액세스 권한을 부여 할 수 있습니다.
  2. 그가 소유 한 경우에도 마찬가지 /a/b 하지만 검색 액세스 권한이없는 입니다.
  3. $ user는 또는에 /a/b/file대한 검색 액세스 권한이 없기 때문에 액세스 할 수 없지만 해당 파일은 예를 들어 하드 링크를 가질 수 있습니다. 이 경우 경로 를 통해 파일을 열어서 내용을 수정할 수 있습니다 ./a/a/b/b/c/file/a/b/file/b/c/file
  4. bind-mounts 와 동일합니다 . 그는에 검색 액세스하지 못할 수도 /a있지만 /a/b할 수있다 바인드 마운트 에서 /c그는 열 수 있도록, file자사를 통해 작성하기위한 /c/file다른 경로.
  5. 그는 쓰기 권한이 없을 수 있습니다 /a/b/file,하지만 그는 쓰기 권한이있는 경우에 /a/b그는 제거하거나 이름을 바꿀 수 있습니다 file거기에 그 자신의 버전으로 교체합니다. 그는 파일의 내용을/a/b/file 다른 파일이더라도 것입니다.
  6. 에 대한 쓰기 권한이있는 경우에도 마찬가지입니다 /a(이름 /a/b을 바꾸고 /a/c/a/b디렉토리를 작성하고 새 디렉토리를 작성할 file수 있음).

$user수정할 수 있는 경로를 찾습니다 . 1 또는 2를 해결하기 위해 access(2)더 이상 시스템 호출 에 의존 할 수 없습니다 . find -perm디렉토리에 대한 검색 액세스를 가정하거나 소유자가되는 즉시 파일에 대한 액세스를 가정하도록 접근 방식을 조정할 수 있습니다.

groups=$(id -G "$user" | sed 's/ / -o -group /g'); IFS=" "
find / -type d \
  \( \
    -user "$user" -o \
    \( -group $groups \) \( -perm -g=x -o -prune \) -o \
    -perm -o=x -o -prune \
  \) ! -type d -o -type l -o \
    -user "$user" -print -o \
    \( -group $groups \) \( ! -perm -g=w -o -print \) -o \
    ! -perm -o=w -o -print

디바이스와 inode 번호 또는 $ user가 쓰기 권한을 가진 모든 파일과 dev + inode 번호가있는 모든 파일 경로를보고함으로써 모든 주소를 3과 4로 지정할 수 있습니다. 이번에는 더 안정적인 것을 사용할 수 있습니다 access(2) 기반 접근 방식을 .

다음과 같은 것 :

find / ! -type l -print0 |
  sudo -u "$user" perl -Mfiletest=access -0lne 'print 0+-w,$_' |
  perl -l -0ne '
    ($w,$p) = /(.)(.*)/;
    ($dev,$ino) = stat$p or next;
    $writable{"$dev,$ino"} = 1 if $w;
    push @{$p{"$dev,$ino"}}, $p;
    END {
      for $i (keys %writable) {
        for $p (@{$p{$i}}) {
          print $p;
        }
      }
    }'

5와 6은 언뜻보기에는 t약간의 권한으로 인해 복잡해 보인다. 디렉토리에 적용되는 경우, 이는 디렉토리 의 소유자가 아닌 사용자가 디렉토리에 대한 쓰기 액세스 권한이 있더라도 소유하지 않은 파일을 제거하거나 이름을 바꾸지 못하게 하는 제한된 삭제 비트입니다.

예를 들어, 이전 예제로 돌아가서에 대한 쓰기 권한이 있으면 /a로 이름 /a/b을 바꾼 /a/c다음 /a/b디렉토리와 디렉토리를 새로 만들 수 file있습니다. 그러나 t비트가 설정되어 /a있고 소유 /a하고 있지 않으면 소유 한 경우에만 할 수 있습니다 /a/b. 그 결과는 다음과 같습니다.

  • 1에 따라 디렉토리를 소유하고 있다면 쓰기 권한을 부여 할 수 있고 t 비트가 적용되지 않으며 (어쨌든 제거 할 수 있음) 파일 또는 디렉토리를 삭제 / 이름 바꾸기 / 재 생성 할 수 있습니다. 모든 파일 경로는 내용으로 다시 쓸 수 있습니다.
  • 소유하고 있지 않지만 쓰기 권한이있는 경우 :
    • 어느 t비트가 설정하고 상기와 같은 경우에있어하지 않습니다 (모든 파일 경로는 당신입니다).
    • 또는 설정되어 있고 소유하지 않거나 쓰기 액세스 권한이없는 파일을 수정할 수 없으므로 수정할 수있는 파일 경로를 찾기 위해 쓰기 권한이 전혀없는 것과 같습니다.

따라서 다음과 같이 1, 2, 5 및 6을 모두 처리 할 수 ​​있습니다.

find / -type d \
  \( \
    -user "$user" -prune -exec find {} + -o \
    \( -group $groups \) \( -perm -g=x -o -prune \) -o \
    -perm -o=x -o -prune \
  \) ! -type d -o -type l -o \
    -user "$user" \( -type d -o -print \) -o \
    \( -group $groups \) \( ! -perm -g=w -o \
       -type d ! -perm -1000 -exec find {} + -o -print \) -o \
    ! -perm -o=w -o \
    -type d ! -perm -1000 -exec find {} + -o \
    -print

그와 3과 4에 대한 솔루션은 독립적이므로 출력을 병합하여 전체 목록을 얻을 수 있습니다.

{
  find / ! -type l -print0 |
    sudo -u "$user" perl -Mfiletest=access -0lne 'print 0+-w,$_' |
    perl -0lne '
      ($w,$p) = /(.)(.*)/;
      ($dev,$ino) = stat$p or next;
      $writable{"$dev,$ino"} = 1 if $w;
      push @{$p{"$dev,$ino"}}, $p;
      END {
        for $i (keys %writable) {
          for $p (@{$p{$i}}) {
            print $p;
          }
        }
      }'
  find / -type d \
    \( \
      -user "$user" -prune -exec sh -c 'exec find "$@" -print0' sh {} + -o \
      \( -group $groups \) \( -perm -g=x -o -prune \) -o \
      -perm -o=x -o -prune \
    \) ! -type d -o -type l -o \
      -user "$user" \( -type d -o -print0 \) -o \
      \( -group $groups \) \( ! -perm -g=w -o \
         -type d ! -perm -1000 -exec sh -c 'exec find "$@" -print0' sh {} + -o -print0 \) -o \
      ! -perm -o=w -o \
      -type d ! -perm -1000 -exec sh -c 'exec find "$@" -print0' sh {} + -o \
      -print0
} | perl -l -0ne 'print unless $seen{$_}++'

지금까지 모든 것을 읽었을 경우, 쓰기 권한을 부여하거나 제한 할 수있는 다른 기능 (읽기 전용 FS, ACL, 불변 플래그, 기타 보안 기능)이 아니라 권한 및 소유권 만 다루는 부분이 있습니다. ...). 그리고 여러 단계로 처리 할 때 파일 / 디렉토리가 생성 / 삭제 / 이름이 바뀌거나 스크립트가 실행되는 동안 수백만 개의 파일이있는 바쁜 파일 서버에서 권한 / 소유권이 수정되면 일부 정보가 잘못 될 수 있습니다 .

이식성 메모

다음을 제외한 모든 코드는 표준 (POSIX, Unix t비트)입니다.

  • -print0GNU 확장은 이제 몇 가지 다른 구현에서도 지원됩니다. 로 find그에 대한 지원이 부족 구현, 당신이 사용할 수있는 -exec printf '%s\0' {} +대신에, 그리고 교체 -exec sh -c 'exec find "$@" -print0' sh {} +와 함께 -exec sh -c 'exec find "$@" -exec printf "%s\0" {\} +' sh {} +.
  • perlPOSIX 지정 명령은 아니지만 널리 사용 가능합니다. 이상이 필요 perl-5.6.0합니다 -Mfiletest=access.
  • zshPOSIX 지정 명령이 아닙니다. 즉, zsh위의 코드는 zsh을-3 (1995) 이상으로 작동합니다.
  • sudoPOSIX 지정 명령이 아닙니다. 시스템 구성 perl에서 지정된 사용자로 실행할 수있는 한 코드는 모든 버전에서 작동해야합니다 .

검색 액세스 란 무엇입니까 ? 나는 읽기, 쓰기, 실행과 같은 전통적인 권한에서 그것을 들어 본 적이 없습니다.
bela83

2
@ bela83, 디렉토리에 대한 실행 권한 (디렉토리를 실행하지 않음)은 search로 변환됩니다 . 그것은 그 안의 파일에 접근 할 수있는 능력입니다. 읽기 권한이있는 경우 디렉토리의 내용을 나열 할 수 있지만 x디렉토리에 대한 검색 ( 비트) 권한 이 없으면 파일에 포함 된 파일로 작업을 수행 할 수 없습니다 . 검색 권한은 있지만 읽을 수는 없습니다 . 즉, 파일이 숨겨져 있지만 해당 이름을 알고 있으면 액세스 할 수 있습니다. 일반적인 예는 php 세션 파일 디렉토리 (/ var / lib / php와 같은 것)입니다.
Stéphane Chazelas

2

옵션을 find명령 과 결합 하면 지정된 모드 및 소유자가있는 파일을 찾을 수 있습니다. 예를 들어 :

$ find / \( -group staff -o -group users \) -and -perm -g+w

위의 명령은 "staff"또는 "users"그룹에 속하고 해당 그룹에 대한 쓰기 권한이있는 모든 항목을 나열합니다.

또한 사용자가 소유 한 항목을 확인해야하며 파일은 세계적으로 쓸 수 있습니다.

$ find / \( -user yourusername -or \
             \(  \( -group staff -o -group users \) -and -perm -g+w \
             \) -or \
            -perm -o+w \
         \)

그러나이 명령은 확장 ACL이있는 항목과 일치하지 않습니다. 따라서 su쓰기 가능한 모든 항목을 찾을 수 있습니다 .

# su - yourusername
$ find / -writable

파일이 r-xrwxrwx yourusername:anygroup있거나 r-xr-xrwx anyone:staff쓸 수있는 파일이라고 말할 수 있습니다.
Stéphane Chazelas 16:15에

또한 디렉토리에있는 쓰기 가능한 파일로 yourusername액세스 할 수없는 것으로보고합니다.
Stéphane Chazelas 16:15에

1

접근 방법은 실제로 테스트하는 대상에 따라 다릅니다.

  1. 당신은시겠습니까 보장 쓰기 접근이 가능하다?
  2. 당신은시겠습니까 보장 쓰기 액세스의 부족?

이것은 2에 도달하는 방법이 너무 많기 때문에 Stéphane의 답변은 이러한 것들을 잘 다루고 (불변의 것은 기억해야 할 것입니다) 드라이브 마운트를 해제하거나 읽기 전용으로 만드는 것과 같은 물리적 수단이 있음을 상기하십시오. 하드웨어 수준 (플로피 탭). 수천 개의 파일이 다른 디렉토리에 있다고 생각하고 보고서를 원하거나 마스터 목록을 확인하고 있습니다. (Puppet의 또 다른 남용은 방금 일어나기를 기다리고 있습니다).

Stéphane의 perl tree-traversal을 원하고 필요한 경우 목록과 함께 출력에 "결합"할 수 있습니다 (su는 부모 디렉토리에서 누락 된 실행을 잡을까요?). 대리모가 성능 문제인 경우 "대수"사용자에 대해이 작업을 수행하고 있습니까? 아니면 온라인 쿼리입니까? 이것이 영구적으로 지속되는 요구 사항이라면 타사 제품을 고려해야 할 때입니다.


0

넌 할 수있어...

find / ! -type d -exec tee -a {} + </dev/null

... 사용자 가 stderr에 쓰여진대로 쓸 수없는 모든 파일 목록

"tee: cannot access %s\n", <pathname>" 

... 또는 비슷합니다.

이 접근 방식에 발생할 수있는 문제에 대한 메모는 아래 설명을 참조하십시오. 더 이상하게도 아마도 다음과 같은 일반 파일 사용해야합니다 find.

find / -type f -exec tee -a {} + </dev/null

즉 , 두 플래그 중 하나 tee를 사용 open()하여 파일을 시도하면 오류가 인쇄됩니다 ...

O_WRONLY

쓰기 전용입니다.

O_RDWR

읽고 쓰기 위해 엽니 다. 이 플래그가 FIFO에 적용되면 결과는 정의되지 않습니다.

... 그리고 만남 ...

[효과]

경로 접 두부의 구성 요소에서 검색 권한이 거부되었거나 파일이 존재하고 oflag에 의해 지정된 권한이 거부되었거나 파일이 존재하지 않고 파일의 상위 디렉토리가 작성 될 쓰기 권한이 거부되었거나 O_TRUNC가 지정 및 쓰기 권한이 거부되었습니다.

... 여기에 지정된대로 :

tee유틸리티는 표준 입력을 표준 출력으로 복사하여 0 개 이상의 파일로 복사합니다. 티 유틸리티는 출력을 버퍼링하지 않아야합니다.

-a옵션을 지정하지 않으면 출력 파일을 작성해야합니다 ( 파일 읽기, 쓰기 및 작성 참조 ) ...

POSIX.1-2008에는 O_APPEND 를 사용하는 것과 동일한 기능이 필요합니다 ...

그것은 같은 방식으로 확인해야하기 때문에 test -w...

-w 경로명

파일 읽기, 쓰기 및 작성에 정의 된대로 경로 이름 이 파일에 대한 쓰기 권한이 부여 될 파일의 ​​기존 디렉토리 항목으로 해석되는 경우 true 입니다. 경로 이름을 확인할 수 없거나 파일에 대한 쓰기 권한이 부여되지 않은 파일의 경로 이름 이 기존 디렉토리 항목으로 해석되는 경우 False 입니다.

그들은 둘 다 EACCESS를 확인합니다 .


파일 수가 적지 않은 경우 해당 접근 방식으로 동시에 열려있는 파일의 수가 제한 될 수 있습니다. 장치 및 명명 된 파이프의 부작용에주의하십시오. 소켓에 대해 다른 오류 메시지가 나타납니다.
Stéphane Chazelas 21

@ StéphaneChazelas-All tue- tee실행 당 한 번 명시 적으로 중단하지 않으면 중단 될 수도 있습니다. 내가 생각할 수있는 가장 가까운 것은 [ -w...하지만 효과는 사용자가 파일을 OAPPEND 할 수 있다는 점에서 가깝습니다. 옵션 중 하나는 것보다 훨씬 더 쉽게 pax-o형식 및 / 또는 옵션 -t에 대해 확인하는 EACCESS-하지만 내가 제안 할 때마다 pax사람들은 그것을 어깨를 으쓱 보인다. 어쨌든, pax내가 찾은 유일한 것은 AST가있는 표준을 충족시키는 것입니다.이 경우 AST를 사용할 수도 있습니다 ls.
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.