Clonare la proprietà e le autorizzazioni da un altro file?


125

Esiste un comando o un flag per clonare la proprietà dell'utente / gruppo e le autorizzazioni su un file da un altro file? Per rendere i permessi e la proprietà esattamente quelli di un altro file?

Risposte:


175

Su GNU / Linux chowne chmodhanno --referenceun'opzione

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile

1
Potresti fare riferimento a questa risposta (e probabilmente citarla) come risposta alla mia domanda: unix.stackexchange.com/questions/44253/… ? , Penso che sarò un'ottima aggiunta e mi piacerebbe trovare voti positivi per questo.
Grzegorz Wierzowiecki,

@GrzegorzWierzowiecki: probabilmente quella domanda dovrebbe essere chiusa, ma è un po 'diversa da questa e ha già delle risposte, quindi è meglio che non faccia nulla.
enzotib,

Come desideri e suggerisci. Grazie per l'aiuto, non ho mai prestato attenzione ai --referenceparametri di chmode chownprima :).
Grzegorz Wierzowiecki,

12

Su qualsiasi Unix con utility GNU, come Linux (non incorporato) o Cygwin, puoi usare chmod --referenceechown --reference .

Se il tuo sistema ha ACL , prova i comandi ACL getfacle setfacl. Questi comandi differiscono leggermente da sistema a sistema, ma su molti è possibile utilizzare getfacl other_file | setfacl -bnM - file_to_changeper copiare le autorizzazioni. Questo non copia la proprietà; puoi farlo analizzando attentamente ls -l other_file, supponendo che non hai nomi utente o di gruppo contenenti spazi bianchi.

LC_ALL=C ls -l other_file | {
  read -r permissions links user group stuff;
  chown -- "$user:$group" file_to_change
}
getfacl other_file | setfacl -bnM - file_to_change

1
Dovresti avere ACL installato e il filesystem montato con ACL abilitato.
enzotib,

2
@enzotib Almeno su Linux, gli strumenti ACL funzioneranno per copiare le autorizzazioni (ma non la proprietà) anche se il filesystem di origine e di destinazione non supporta gli ACL.
Gilles,

7

Ha fatto un comando bash basato sulla risposta di Matteo :)

Codice:

chmod $( stat -f '%p' "$1" ) "${@:2}"

Uso:

cp-permissions <from> <to>...


5
Egad! Dove hai imparato a dire ${*:2}? Non farlo mai più! Ciò fallirà se uno dei nomi di file contiene spazio (o schede). Usa "${@:2}". Inoltre, utilizzare "$1"invece di solo $1.
G-Man,

chmod "$(stat -c '%a' "$fromfile")" tofilein GNU Coreutils, ma potresti anche usarlo --referencein quel caso poiché l' statutilità CLI non è POSIX, dice anche pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html ls -l che non lo taglierà: "L'output di ls (con -l e le opzioni correlate) contiene informazioni che logicamente potrebbero essere utilizzate da utility come chmod e touch per ripristinare i file in uno stato noto. Tuttavia, queste informazioni sono presentate in un formato che non può essere utilizzato direttamente da tali utility o essere facilmente tradotto in un formato che può essere utilizzato. "
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

5

Se non stai usando un sistema con chmod / chown di GNU (che supporta l' --referenceopzione) potresti provare ad analizzare l'output dils -l

Ecco un piccolo script per chmod(se hai un vedere che supporta regex estese potrebbero essere scritte in un modo molto più leggibile ...)

#!/bin/sh

reference=$1
shift
files=$*

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/"       | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/"    | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

AGGIORNAMENTO :

Questo è ancora più semplice usando stat:

chmod $( stat -f '%p' ${reference} ) ${files}

2
Invece di analizzare l' ls -loutput, potresti analizzare l' statoutput.
jfg956,

@jfgagne: grazie ha un senso non so perché non ci abbia pensato in primo luogo. Ho aggiornato la risposta
Matteo,

1
Stai usando la statsintassi * BSD qui. Il tuo chmod $(stat ...)comando non funzionerà perché %pda solo emette troppe informazioni per * BSD chmod, usate solo %Lpper emettere i bit u / g / o. Qualcosa di leggermente più elaborato sarebbe richiesto per i bit sticky / setuid / setgid.
mr.spuratic

0

Volevo aggiungere un adattamento alla sceneggiatura di Matteo . Un ciclo for dovrebbe essere usato per confermare l'esistenza dei file prima di eseguire effettivamente il comando chmod su di essi. Ciò consentirà l'errore di script più elegantemente.

Penso che questa sia l'opzione migliore perché può essere utilizzata per tutti i sistemi operativi * nix, come Solaris, Linux, ecc.

#!/bin/sh

reference=$1
shift
files=$*

for file in $reference $files; do
  [ -f $file ] || { echo "$file does not exist"; exit 1; }
done

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

Ho scoperto che su una delle mie macchine Solaris 10 statnon è stato trovato. Potrebbe essere un problema con la mia configurazione.


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.