cp sovrascrive vs rm quindi cp


18

Quando provo a sovrascrivere un file binario che è attualmente avviato, cpnon riesco a sovrascrivere, ma è possibile rmallora cp. Per esempio:

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

Qualche idea sul perché?


2
Piccolo thread interessante, ma dovrebbe essere su Unix / Linux.SE IMO.
underscore_d

Risposte:


41

Nel primo caso, stai cercando di sovrascrivere il contenuto di un file attualmente in esecuzione come programma. Linux non lo consente - se lo facesse, sovrascriveresti il ​​codice proprio mentre il sistema operativo lo stava eseguendo; la prima differenza potrebbe causare l'arresto anomalo del programma o il suo malfunzionamento.

Ma nel secondo caso, in realtà non stai modificando il contenuto del vecchio file: stai creando un nuovo file al suo posto, mentre quello vecchio perde solo il nome del file ma mantiene intatto il suo contenuto.

(Ricorda che tecnicamenterm non elimina i file, rimuove semplicemente i collegamenti alla directory - in modo simile a come aggiunge più collegamenti allo stesso file. Solo quando un file non ha collegamenti e senza riferimenti a file aperti, viene automaticamente eliminato.)ln

Il sistema fa riferimento ai file in uso tramite il loro inode, quindi non importa che abbiano lo stesso nome file: è comunque il vecchio file che rimane aperto dal sistema e anche se non ha più collegamenti, verrà solo eliminato una volta che tutti i programmi lo chiudono.


7
Un altro trucco che viene spesso utilizzato utilizzando la stessa logica: Apri un file (temporaneo) nel tuo software ed eliminalo immediatamente, senza prima chiudere il file. Il tuo programma può ancora usarlo come vuole e quando il tuo programma lo chiude (controllato) o si dimentica di chiuderlo (ad es. Il tuo programma si è bloccato senza pulizia) verrà automaticamente rimosso dal sistema operativo. (Fine del programma, non importa come sia successo, rilascia tutti i riferimenti al programma sul file.)
Tonny,

2
Questo è anche il motivo per cui quando si elimina un file di registro di un processo in esecuzione il comando df non restituisce la dimensione corretta fino a quando non si interrompe il processo
M4rty,

Esiste un modo per un programma esterno (con i privilegi di root) di trovare e creare un nuovo handle per questo inode pendente? Immagino che ci siano programmi che la utilizzano come "funzionalità di sicurezza", quindi è interessante capire l'intera storia.
BenPen,

3
@BenPen: su Linux, sì: utilizzare /proc/*/fdper accedervi e, facoltativamente, linkat () per aggiungere un nuovo collegamento al filesystem.
user1686

3
@BenPen e grawity: in realtà, non è possibile ricollegare un inode alla struttura della directory se ha zero collegamenti, anche con linkat(), per motivi di sicurezza . (Eccezione a questa regola: a meno che non sia stata creata in open(O_TMPFILE)modo da iniziare con zero collegamenti.) Se ci provi, linkat()restituisce ENOENT, anche come root. Vedi la mia risposta su quella domanda per far funzionare effettivamente uno script perl linkate dimostrare che non funziona, anche come root: /
Peter Cordes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.