Come modificare l'autorizzazione e il proprietario del gruppo di un file contemporaneamente


9

Per cambiare il permesso dei file, so che potrei usare chmod. Per cambiare il proprietario del gruppo, potrei usare chgrp. Tuttavia, se voglio cambiare sia l'autorizzazione che il proprietario allo stesso tempo, qualsiasi comando che potrei usare su Linux?

Ad esempio, esiste un file con questa autorizzazione e proprietario:

-rw-r--r--+  1 raymondtau  staff    0 May  8 16:38 WantToChangeThisFile

E ora voglio cambiarlo in:

---x-w--wx+  1 raymondtau  admin    0 May  8 16:38 WantToChangeThisFile

So che potrei usare questo comando:, chmod 123 WantToChangeThisFile && chgrp admin WantToChangeThisFilema voglio sapere se esiste un modo preciso per farlo.

Risposte:


9

Esiste un concetto noto come "UNIX-way". Ogni strumento dovrebbe svolgere una semplice funzione. Se uno ha bisogno di una funzione più complessa, può combinare strumenti più piccoli.

Il contrario è il design monolitico quando tutte le funzionalità sono aggregate in un unico strumento enorme.

Se vuoi fare qualcosa di complesso, basta scrivere uno script, invocando strumenti semplici.


Ecco uno script che ho scritto che combina questi strumenti in una funzione di shell ch.
Keith,

2
non c'è modo che sia una risposta, ciò che ha chiesto potrebbe essere raggiunto con diversi strumenti già esistenti come rsync e anche se Linux tende a preferire uno strumento / una funzione, significa che non esistono strumenti che fanno cose multiple
Kiwy

@Kiwy Alcuni strumenti di Linux non rispettano i principi unix-way e combinano funzioni diverse di diversa natura. Come systemd per esempio.
Kondybas,

1
@Kondybas "tende a" è la parte importante della frase. esiste un'eccezione alla regola. Tuttavia la tua risposta per me è davvero negativa.
Kiwy,

9

Se anche quello che vuoi è copiare il file da qualche parte (come la sua destinazione finale), potresti dare un'occhiata al installcomando:

install -m 0777 -o root $sourcefile $destinationfile


1

L'uso dello strumento giusto per il lavoro in * nix è importante, ma in effetti ripetere lo stesso percorso in ogni comando concatenato sembra sciocco. Invece, dovresti davvero usare le variabili di Bash e, in script più piccoli, in particolare farne uso $_.

Il tuo comando diventerebbe:

chmod 123 WantToChangeThisFile && chgrp admin $_

ALT +. fa la stessa cosa di estrarre l'ultimo argomento usato nella tua shell corrente.


0

Rsync è utile in questo caso:

Dal Fine Manual (TM)

--chown = USER: GRUPPO semplice mappatura nome utente / nome gruppo

--chmod = CHMOD influenza le autorizzazioni per file e / o directory

Quindi, ad esempio, vuoi chmod / mnt / lala / lala4000 / "ugo = rX" e chown "foo.bar"

rsync --chmod = ugo = rX --chown = foo: bar -rvtpolgh / mnt / lala / lala4000 / / mnt / lala / lala4000 /

In questo modo ricorsivamente chown e chmod la dir.


0

Potresti raggiungere un obiettivo con un rsynccomando lungo

rsync -a --chown=root:root --chmod=F755 filename filename

non capisco
Pierre.Vriens,

Questo non è sicuro: influenzerà tutti i file corrispondenti nella directory e nelle sottodirectory specificate, non solo il file a cui è indicato.
telcoM,

-1

Puoi fare chown username:groupname file ...per cambiare entrambi contemporaneamente. Sta cambiando due campi nella stessa struttura (inode), quindi la sua combinazione consente di salvare due chiamate di sistema (una per la lettura dei valori correnti e una per l'impostazione dei vaule modificati).


chowncambia solo i proprietari. In che modo ciò modifica le autorizzazioni contemporaneamente a OP richiesto? Nota L'esempio di OP include anche un chmod.
jscott,

Ah, pensavo che volesse cambiare 3 cose, mentre scriveva Per cambiare il proprietario del gruppo pensavo che intendesse gruppo e proprietario.
Wurtel,

-3
#!/bin/bash

# Setting the Variables for execution
LOGDIR=$HOME
CURRENTTIME=$(date +"%Y%m%d%s%H%M%S")
LOGFILE=${LOGDIR}/chgpermission_${CURRENTTIME}.log
MASTERFILE=$1
INDEX=0

# Checking the number of Parameters passed
if [ "$#" -ne 1 ]; then
    echo "Master file name is mandatory parameter" > ${LOGFILE}
    exit 1
fi

# Loading the Master file into an Array 
echo "Loading the Master file ${MASTERFILE} into an array" >> ${LOGFILE}
while read line
do
#echo $line  
MASTERARRAY[$INDEX]=$HOME/$line 
INDEX=$(expr $INDEX + 1) 
done < ${MASTERFILE}

echo "Number of parameters in an master array ${MASTERARRAY[@]}" >> ${LOGFILE}

# Changing the permission of the file 
echo "Changing the permission of the file in master file ${MASTERFILE}" >> ${LOGFILE} 
index=0
for index in "${MASTERARRAY[@]}"
do
    if [ -f "$index" ] 
    then
       echo "$index file exist"
       echo  "$index file exist" >> ${LOGFILE}
       chmod 755 "$index" 
       chown workstation "$index"
       chgrp workstation "$index" 
    else
      echo "$index file does not extst"
      echo "$index file does not exist" >> ${LOGFILE}  
    fi 
done 

2
potresti almeno fornire una spiegazione di come funziona e come dovrebbe essere utilizzato (parametri di quanto sono ...)
Kiwy,

2
Per favore, non basta incollare un po 'di codice come risposta.
Konrad Gajewski,

È improbabile che commentare sia produttivo; questa è l'unica cosa che questo utente abbia mai pubblicato e da allora non hanno nemmeno effettuato l'accesso.
G-Man dice "Ripristina Monica" il
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.