쓰기 금지된 파일과 쓰기 금지된 파일에서 작동하는지 확인하려는 작은 프로그램이 있습니다. 그래서 echo $text > $file
or 를 사용하는 대신 에 and 를 echo $text >> $file
별도로 사용해야 했습니다 . 을 사용할 때 권한을 변경하더라도 파일에 사용할 때마다 다음과 같은 메시지가 표시됩니다.echo $text | sudo tee $file
echo $text | sudo tee --append $file
sudo tee
rm
$ 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
보면 이를 직접 확인할 수 있습니다 .user
group
$ 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
.