Scrivi su un file senza reindirizzamento?


12

Sto scrivendo una normale applicazione compilata che deve creare un file speciale e scrivere un cookie magico in esso. Non riesco a scrivere il file direttamente dall'applicazione, il modello di sicurezza del sistema mi richiede di avviare uno strumento di supporto con privilegi elevati per fare il trucco. Posso fornire qualsiasi numero di argomenti allo strumento di aiuto. Ora vorrei scegliere alcuni comandi di sistema molto semplici che potrebbero servire come strumento di supporto e creare il file per me. Qualcosa come questo:

/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"

Semplice touchnon lo taglia come ho bisogno di scrivere il cookie nel file, un semplice echosenza il wrapper della shell non funziona in quanto ha bisogno di reindirizzamento per scrivere il file. Non mi sento a mio agio nel chiamare la shell con i privilegi di root per svolgere un compito così banale. Esiste un comando di sistema veramente semplice e vincolato che potrei chiamare per scrivere il file per me?


C'è un motivo per cui /bin/sh -c 'echo magic > /path/to/magic/file'non funziona? Sarebbe un file eseguibile e due argomenti. Dovresti creare l'ultimo argomento come stringa (con sprintf o equivalente). C'è una ragione per cui questo non funzionerebbe per te? Dalla tua domanda sembra che doCommandAsRoot () non accetta input per lo streaming del comando, giusto? Altrimenti potresti sostituire l'ultimo argomento con 'cat > /path/to/magic/file'e passare i dati invece di costruire una stringa.
Arcege,

L'esempio della shell funziona, ma odio chiamare la shell con i privilegi di root solo per creare un semplice file. La libreria accetta un argomento pipe di comunicazione (è AuthorizationExecuteWithPrivileges ), che può essere utilizzato per scrivere il cookie utilizzando tee. Grazie!
zoul

Risposte:


11

Cosa ne pensi di questo:

echo -n 'magic' | sudo tee /some/where/file > /dev/null

Sicuramente ci sono reindirizzamenti in questo, ma solo tee viene eseguito come root e non come shell. Funziona dd of=...anche con .


2
Mi dispiace, ovviamente ho problemi a spiegarmi ultimamente. Il problema è che quando voglio eseguire qualcosa con privilegi elevati, devo passare attraverso una chiamata in biblioteca speciale (qualcosa del genere doCommandAsRoot). E questa funzione accetta solo un percorso per il comando e i suoi argomenti, quindi non ho modo di usare subito il reindirizzamento dell'output. Potrei passare attraverso la shell (come mostrato nella domanda), ma non mi piace la sicurezza.
zoul

@zoul: pensavo stessi scrivendo uno script di shell. È corretto scrivere il cookie magico in un file accessibile per processi non privilegiati? Se lo è, allora scriverlo in un tale file e chiamare doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file").
stribika,

No, è una normale applicazione compilata (domanda aggiornata). Sto solo cercando comandi "shell" che fungano da aiuto in modo da non doverlo scrivere da solo. Sì, il cookie non è sensibile. L' ddesempio è abbastanza vicino a quello che voglio, grazie. Potresti pensare a qualcosa di ancora più semplice?
zoul

Sicuro: potresti usare cpo mvinvece di dd.
Mattdm,

Intendo più semplice come senza la necessità di copiare :)
zoul

9

Senza reindirizzamento dell'output, senza pipe, ma con "qui stringa":

dd of=/some/where/file <<<'magic'

Un aspetto negativo di questo approccio è che dd scrive alcune statistiche su stdout. Puoi usare> / dev / null per nasconderli, ma a quel punto potresti anche usare tee.
Studgeek

1
Questo ha funzionato per me in una situazione insolita in cui non potevo usare il reindirizzamento dell'output o i pipe. status=nonesopprimerà tutti gli altri output delle versioni moderne dei coreutils GNU dd.
Michael Hampton,

5

C'è un'altra considerazione, che è che non vuoi mettere il valore del cookie magico su una riga di comando, dal momento che può essere osservato da altri utenti. Anche se il programma è di breve durata (incluso se il programma azzera la stringa della riga di comando), c'è la possibilità di un attacco. Quindi, un teorico:

writestringtofile 'magic' /some/where/file

è un approccio pericoloso. Pertanto, sottoscrivo il suggerimento di @ stribika: scrivere il valore in un file temporaneo e copiarlo in posizione. Assicurati di utilizzare una funzione sicura per creare il file temporaneo ( mkstemp()) in modo che non ci siano anche condizioni di competizione.


Grazie, questa è una discussione utile. Fortunatamente il "biscotto magico" non è un dispositivo di sicurezza, può essere visto chiaramente da chiunque.
zoul

0

spugna da moreutils - assorbi l'input standard e scrivi in ​​un file:

echo -n 'magic' | sponge /some/where/file

A differenza di un reindirizzamento della shell, la spugna assorbe tutto il suo input prima di scrivere il file di output. Quando possibile, sponge crea o aggiorna atomicamente il file di output rinominando un file temporaneo in posizione.

Vedi di più

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.