FreeBSD sed 오류 - 권한이 있지만 "권한이 거부되었습니다"

FreeBSD sed 오류 - 권한이 있지만 "권한이 거부되었습니다"

권한:

ls -al file
-rwxrwxr-x  1 root  wheel 

사용자 그룹:

groups
wheel 

내가 이렇게 하면:

sed -i'' -e '/Marker/i\'$'\n''text string'$'\n' file 

오류가 발생합니다.

sed: ../file: Permission denied

하지만 동시에 이 파일을 읽고 쓰고 실행할 수 있습니다. 권한에 표시된대로.

왜 sed가 작동하지 않습니까?동일한 사용자와 동일한 파일을 사용하고 있습니다. 음, 원본 포스터는 루트입니다.하지만 읽기 및 쓰기 권한이 있습니다.

 uname -a
FreeBSD srv 11.0-RELEASE-p1 FreeBSD 11.0-RELEASE-p1 #0 r306420: Thu Sep 29 01:43:23 UTC 2016     [email protected]:/usr/obj/usr/src/sys/GENERIC  amd64

답변1

sed -i'' -e ... file 

BSD의 sed필요인수 -i, 선택적 인수를 허용하는 GNU sed와는 대조적입니다.

FreeBSD sed 매뉴얼 페이지:

-i    extension     

-I와 유사하게 파일을 그 자리에서 편집합니다.

그리고GNU sed 매뉴얼 페이지:

  -i[SUFFIX], --in-place[=SUFFIX]

파일을 제자리에서 편집(또는 접미사가 제공된 경우 백업)

괄호가 없거나 부족하다는 점에 유의하세요.

그렇지 않은 경우, 쉘에서는 빈 문자열 주위의 따옴표가 제거된다는 점을 제외하면 -i''just 와 동일합니다 .-i

그래서 sed당신이 요구하는 것은 확장자가 .인 백업 파일을 생성하는 것인데 -e, 디렉토리에 대한 쓰기 액세스 권한도 없으면 이 작업을 수행할 수 없습니다.


-i인수가 없거나 비어 있는 경우 에도 sed결과를 원래 이름으로 이동하기 전에 결과가 기록되는 임시 파일이 생성될 수 있습니다. 최소한 GNU sed는 원본 디렉토리와 동일한 디렉토리에 임시 파일을 생성하므로 해당 디렉토리에 대한 쓰기 권한이 다시 필요합니다.

$ strace -etrace=open,이름 바꾸기 sed -i -e '1d' foo
[...]
open("foo", O_RDONLY) = 3
open("./sedD9J9tV", O_RDWR | O_CREAT | O_EXCL, 0600) = 4
이름 바꾸기("./sedD9J9tV", "foo") = 0

이 문제를 해결하려면 다른 곳에 임시 파일을 만들고 해당 내용을 다음 위치로 이동할 수 있습니다.

$ sed -e '...' file > /tmp/file.tmp
$ cat /tmp/file.tmp > file && rm /tmp/file.tmp

답변2

따라서 문제는 스크립트가 있는 상위 경로에 있습니다. 제 생각에는 (Sed가 어떻게 작동하는지 잘 모르겠습니다) sed가 텍스트 문자열을 추가하기 위해 복제 파일을 만들려고 시도하지만 755 때문에 할 수 없습니다.권한. 775화 문제가 해결되었습니다.

관련 정보