cp 덮어 쓰기 vs rm 다음 cp


18

현재 시작된 이진 파일을 덮어 쓰려고 할 때 cp덮어 쓰지 못하지만 rm그때 가능합니다 cp. 예를 들면 다음과 같습니다.

user@poste:~$ cp binaryFile /tmp
user@poste:~$ sudo cp /tmp/binaryFile binaryFile 
[sudo] password for user:
cp: cannot create regular file `binaryFile`: Text file busy
user@poste:~$ sudo rm binaryFile 
user@poste:~$ sudo cp /tmp/binaryFile  binaryFile 
user@poste:~$ file binaryFile 
binaryFile : ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x7ce005d9eb50e2574246b6a881e625802f7e49f2, not stripped

왜 그런지 알아?


2
재미있는 작은 스레드이지만 Unix / Linux.SE IMO에 있어야합니다.
underscore_d

답변:


41

첫 번째 경우 현재 프로그램으로 실행중인 파일의 내용을 덮어 쓰려고합니다 . 리눅스는이를 허용하지 않습니다 – 만약 그렇다면, OS가 코드를 실행 한 그대로 코드를 덮어 씁니다. 첫 번째 차이점은 프로그램을 중단 시키거나 오작동하게 만드는 것입니다.

그러나 두 번째 경우에는 실제로는 이전 파일의 내용을 변경하지 않습니다. 대신 파일을 작성하는 반면, 이전 파일은 파일 이름을 잃지 만 내용은 그대로 유지합니다.

(즉, 기억 rm하지 않는 기술적으로 삭제 된 파일을, 그냥 디렉토리 링크를 제거 - 방법과 유사 ln동일한 파일에 대한 더 많은 링크를 추가 파일이 어떤 링크가없는 경우에만. 그리고 아무 열린 파일 참조를 자동 삭제됩니다.)

시스템은 inode에 의해 사용중인 파일을 참조하므로 파일 이름이 같더라도 상관 없습니다. 여전히 파일이 시스템에 의해 열려 있는 오래된 파일이며 더 이상 링크가 없어도 삭제 만됩니다. 모든 프로그램이 닫히면


7
동일한 논리를 사용하여 자주 사용되는 또 다른 트릭 : 소프트웨어에서 (임시) 파일을 열고 파일을 먼저 닫지 않고 즉시 삭제하십시오. 프로그램은 여전히 ​​원하는 방식으로 사용할 수 있으며 프로그램이 닫히거나 (제어되는) 프로그램을 닫는 것을 잊었을 때 (예 : 정리하지 않고 프로그램이 충돌 한 경우) OS에 의해 자동으로 제거됩니다. (프로그램 종료는 어떻게 되었든 프로그램에 대한 모든 참조를 파일에서 해제합니다.)
Tonny

2
따라서 실행중인 프로세스의 일부 로그 파일을 삭제하면 프로세스를 중지 할 때까지 df 명령이 수정 된 크기를 반환하지 않습니다.
M4rty

외부 프로그램 (루트 권한이있는)이이 매달려있는 inode에 대한 새 핸들을 찾고 작성하는 방법이 있습니까? 이것을 "보안 기능"으로 사용하는 프로그램이 있다고 생각하므로 전체 내용을 이해하는 것이 흥미 롭습니다.
BenPen

3
@BenPen : Linux의 경우 예 –이 파일 /proc/*/fd에 액세스하고 선택적으로 linkat () 를 사용하여 파일 시스템에 새 링크를 추가하십시오.
grawity

3
@BenPen 및 grawity : 실제로 보안상의 이유로 링크가없는 경우 에도linkat() inode를 디렉토리 구조에 다시 연결할 수 없습니다 . (이 규칙의 예외 : 링크를 작성하지 않고 링크 open(O_TMPFILE)없이 시작한 경우를 제외하고) 시도하지 않으면 linkat()루트로도 ENOENT를 리턴합니다. 펄 스크립트가 실제로 실행 linkat되고 루트로도 작동하지 않음을 증명 하는 펄 스크립트에 대한 내 대답을 참조하십시오 : /
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.