tee로 생성된 보호된 파일의 쓰기 작업을 취소하는 방법은 무엇입니까?

tee로 생성된 보호된 파일의 쓰기 작업을 취소하는 방법은 무엇입니까?

쓰기 금지된 파일과 쓰기 금지된 파일에서 작동하는지 확인하려는 작은 프로그램이 있습니다. 그래서 echo $text > $fileor 를 사용하는 대신 에 and 를 echo $text >> $file별도로 사용해야 했습니다 . 을 사용할 때 권한을 변경하더라도 파일에 사용할 때마다 다음과 같은 메시지가 표시됩니다.echo $text | sudo tee $fileecho $text | sudo tee --append $filesudo teerm

$ ls
someFile writeProtectedFile
$ rm someFile
$ ls
writeProtectedFile
$ rm writeProtectedFile
rm remove write-protected regular file 'writeProtectedFile'? yes
$ ls

그런 다음 나는 딜레마에 대한 가능한 해결책을 찾기 위해 온라인을 뒤졌습니다. 잘못된 권한 또는 변경된 권한 집합이라는 두 가지만 찾을 수 있었습니다. 를 실행하여 권한을 쉽게 변경할 수 있으므로 권한 대소문자 구분이 올바르지 않다는 것을 알고 있습니다 sudo chmod xxx filename. 그러면 권한 변경이 성공하게 됩니다. 그런 다음 파일 속성에 문제가 있다고 가정하여 파일을 실행 하고 디렉터리의 다른 모든 파일과 동일하게 lsattr출력했습니다 .-------------e--

고쳐 쓰다

제가 사용하는 이유 tee는 보호된 파일에 쓰기 위해 텍스트를 에코하기 위한 것입니다. 그러나 부작용으로 보호된 일반 파일에도 쓰기도 합니다... 제 목표는 실제로 비슷한 것을 하는 것인데 sudo echo "whatever" >> /etc/someFile이것은 작동하지 않습니다. 에서 해결책을 찾았습니다 echo "whatever" | sudo tee /etc/someFile.

답변1

존재하지 않는 파일을 인수로 명령 tee에 전달하면 출력이 기록되기 전에 파일이 생성됩니다. 명령 앞에 을 붙이면 sudo셸에 tee명령을 로 실행 하도록 요청하는 것입니다 root. 결과적으로 생성된 파일은 tee명령을 시작한 사용자가 소유하므로 root다른 사용자는 읽기 전용이 됩니다. 실행하여 합계 열 을 ls -l보면 이를 직접 확인할 수 있습니다 .usergroup

$ rm -f writeProtectedFile # Removing the file in case it already exists
$ echo $text | sudo tee writeProtectedFile
yourtext
$ ls -l
total 4
-rw-r--r-- 1 root root 9 22.07.2015 14:26 writeProtectedFile

이 문제를 극복할 수 있는 몇 가지 옵션이 있습니다.

  • tee파일을 작성하라는 요청을 받기 전에 표준 사용자로 파일을 생성하십시오. tee그러면 --append소유권을 변경하지 않고 잘라내거나 간단히 잘라냅니다.

    $ touch writeProtectedFile # creates the file as standard user
    $ echo $text | sudo tee writeProtectedFile
    $ rm writeProtectedFile
    
  • 파일을 삭제하기 전에 파일 소유권을 변경하세요.

    $ echo $text | sudo tee writeProtectedFile
    $ sudo chown $(whoami) writeProtectedFile # `whoami` returns the current user name
    $ rm writeProtectedFile
    
  • rm파일이 쓰기 금지되어 있다는 사실을 무시하도록 지시하려면 다음을 사용하십시오 -f, --force.

    $ echo $text | sudo tee writeProtectedFile
    $ rm --force writeProtectedFile
    

답변2

생성 중인 파일이 에 있는 경우 /etc해당 파일을 삭제할 수 없습니다. 즉, 일반 사용자라면 다음과 같이 합니다.

$ sudo touch /etc/foobar
$ rm /etc/foobar

작동 touch하지만 디렉토리에 대한 쓰기 권한이 rm없기 때문에 실패합니다 ./etc

운영 체제 커널 수준에서 파일의 쓰기 권한은 삭제(또는 이름 바꾸기/이동)와 아무 관련이 없습니다. 쓰기 금지된 파일을 삭제하라는 메시지는 rm프로그램에 내장된 응용 프로그램 수준 기능일 뿐입니다. y프롬프트에 말할 때 먼저 권한을 변경하지 않고 파일을 지우려면 rm운영 체제(아마도 이 기능)를 호출하세요 . unlink(파일을 소유하고 있지 않기 때문에 권한을 변경할 수도 없습니다!)

그러나 디렉터리의 내용을 변경하는 작업(예: 파일 추가 또는 삭제)에는 디렉터리에 대한 쓰기 권한이 필요합니다.

요약하자면 여기서 해야 할 일은 다음과 같습니다.

$ sudo rm -f /etc/foobar

sudo필요한 쓰기 권한을 갖고 프롬프트를 표시하지 않으려면 /etc루트 -f여야 합니다 rm.

답변3

당신은 당신의 목표가 다음과 같다고 말했습니다.

sudo echo "whatever" >> /etc/someFile

그러나 리디렉션과 함께 >>루트 권한도 제공됩니다. 이 대안을 고려해 보셨나요?

sudo sh -c "echo 'whatever' >> /etc/someFile"

sudo sh지연을 시도하는 대신 쉘 변수(있는 경우)가 호출 전에 보간되도록 표현식 주위에 큰따옴표를 사용하고 있습니다 sh. 이는 대부분 sudo환경을 축소하여 일부 변수가 존재하지 않을 수 있고 다른 변수는 Reset이 있을 수 있기 때문입니다. 예를 들어 $$호출자의 pid가 sh.

관련 정보