Come impostare autorizzazioni specifiche per i file quando si reindirizza l'output?


12

Questo è probabilmente un duplicato, ma tutte le mie ricerche stanno sollevando domande sugli errori di autorizzazione negata.

Sto eseguendo un comando in una shell bash. Voglio reindirizzare l'output da aggiungere a un file che probabilmente non esiste al primo avvio. Voglio impostare una modalità di autorizzazione file specifica se il reindirizzamento dell'output deve creare questo file. C'è un modo per farlo con un solo comando?

Ad esempio, potrei provare

foo >> /tmp/foo.log 0644

dove 0644sono le autorizzazioni che voglio foo.logfinire. La maggior parte dei comandi che ho sperimentato in bash finiscono per interpretare 0644come argomento aggiuntivo foo.

Ho la sensazione che questo porterà un secondo comando alle chmodautorizzazioni prima o dopo averlo scritto.

Sto usando GNU bash 4.2.25 e Ubuntu 12.04, se questo fa la differenza - sono preferite le risposte generali.

Risposte:


5

Per quanto ne so, non c'è modo di farlo mentre eseguo il piping, un semplice script potrebbe essere la soluzione migliore.

if [ -e /tmp/foo.log ]; then
    foo >> /tmp/foo.log
else
    foo >> /tmp/foo.log
    chmod 0644 /tmp/foo.log
fi

Grazie Slowki, anche quello era il mio sospetto. Lo lascerò aperto per alcuni giorni, nella speranza di attirare un guru per illuminarci.
Patrick M,

3
Il problema con questo approccio è che crea una finestra di tempo breve quando le autorizzazioni sul file sono errate. Non lo userei se l'obiettivo è proteggere i dati sensibili.
proski,

1
Questa risposta funziona, per quanto possibile, ma @proski ha ragione: le umaskrisposte sono migliori e una di queste dovrebbe essere accettata.
Scott,

15

So che è una vecchia domanda, ma volevo aggiungere i miei due centesimi.

Ho avuto la stessa idea e ho trovato una soluzione simile a BowlesCR . Il problema con la sua soluzione era che il mio comando ( foo) non avrebbe funzionato se avessi cambiato umask prima di eseguirlo, quindi questa è la mia opinione sul problema:

foo | ( umask 0033; cat >> /tmp/foo.log; )

Qui, umaskinfluisce solo sul reindirizzamento foo.lognella subshell. Tutto il resto rimane inalterato.

Un po 'contorto, ma funziona.


Molto bello ed efficace :) Semplicemente non può essere usato con il reindirizzamento stderr in cima al redir stdout.
Orsiris de Jong,

5

Senza veri script, puoi concatenare un po ':

touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log

Efficacemente simile alla risposta di Slowki , ma condensata in una riga .

L'unica altra cosa a cui riesco a pensare è armeggiare con l'umask. Meglio farlo in una subshell in modo da non inquinare l'ambiente corrente:

(umask 0033 && foo >> /tmp/foo.log)

Due problemi con questo, però.

  1. Umask non può aumentare le autorizzazioni al di sopra del livello specificato nella creat()syscall (0666 sembra essere quello che usa Bash).
  2. Questo non cambierà le autorizzazioni su un file esistente (perché si umaskapplica solo alla creazione di file ).

Sono ancora abbastanza nuovo da * pensare che l'umask sia ancora un po 'magico per me. Grazie per il suggerimento, sarò sicuro di leggerlo.
Patrick M,

Hmm ... Permette comunque a un processo senza privilegi di aprire il file e successivamente di leggerne il contenuto.
Feuermurmel,

(1) Congratulazioni per aver trovato un uso interessante e utile di cat. (Anche se questo non segue il modello standard di usi inutili di  cat.) (2) Presumo che tu intendessi dire che bash passa automaticamente alla modalità  0666 durante la creazione di file, e quindi ho modificato la tua risposta per dirlo. (Vedi questo ,  questo   ... (proseguendo)
Scott,

(Continua) ... e  questo .) E la domanda menziona specificamente la modalità 0644. Quindi un umaskvalore di 22, 23 o 32 funzionerebbe anche in questo contesto (non è necessario utilizzare zero iniziale; quando le modalità e i  umaskvalori sono specificati numericamente, sono sempre interpretati come ottali).  22 è più comunemente usato convenzionalmente.
Scott,

@ Feuermurmel: E allora? La domanda richiede esplicitamente la modalità 644. Dobbiamo presumere che il PO sappia che 644 significa leggibile dal mondo e destinato a rendere pubbliche le sue informazioni.
Scott,

1

Quando il reindirizzamento imposta autorizzazioni errate, ad esempio:

$ rm capture.*
$ perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ ls -l capture.*
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDERR
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDOUT
$ cat capture.*
215 STDERR
216 STDERR
215 STDOUT
216 STDOUT

Credo che tu possa usare qualcosa come Xynomorf ha dato, e affrontare la preoccupazione stderr di Orsiris de Jong con una leggera modifica per usare la sostituzione del processo bash .

$ rm capture.*
$ perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ ls -l capture.*
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDERR
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDOUT
$ cat capture.*
233 STDERR text
238 STDERR text
233 STDOUT text
238 STDOUT text

Naturalmente, usa umask 0077per ottenere la modalità 600 e proibire a qualsiasi altro utente di vedere i contenuti.


0

Se vuoi reindirizzare a uno script, a differenza di umask, con la sostituzione del processo e installpuoi anche impostare il bit di esecuzione:

install -m 755 <(echo commands go here) newscript

<()inserisce l'output in un file temporaneo, vedere Process-Substitution

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.