Jak zmienić uprawnienie i właściciela grupy pliku jednocześnie


9

W celu zmiany uprawnień do pliku wiem, że mogę użyć chmod. Aby zmienić właściciela grupy, mógłbym użyć chgrp. Jeśli jednak chcę jednocześnie zmienić zarówno uprawnienia, jak i właściciela, którekolwiek polecenie, którego mógłbym użyć w systemie Linux?

Na przykład istnieje plik z tym uprawnieniem i właścicielem:

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

A teraz chcę to zmienić na:

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

Wiem, że mógłbym użyć tego polecenia: chmod 123 WantToChangeThisFile && chgrp admin WantToChangeThisFileale chcę wiedzieć, czy istnieje jakiś dobry sposób, aby to zrobić.

Odpowiedzi:


9

Istnieje koncepcja znana jako „UNIX-way”. Każde narzędzie powinno spełniać jedną prostą funkcję. Jeśli ktoś potrzebuje bardziej złożonej funkcji, może łączyć mniejsze narzędzia.

Przeciwnie jest projekt monolityczny, gdy cała funkcjonalność jest zgromadzona w jednym wielkim narzędziu.

Jeśli chcesz zrobić coś złożonego - po prostu napisz skrypt, wywołując proste narzędzia.


Oto skrypt pisałem , która łączy tych narzędzi do jednej funkcji powłoki ch.
Keith,

2
nie ma mowy, że jest to odpowiedź, o co prosił może być osiągnięcie z kilku narzędzi już istnieje takie jak rsync i choć linux mają tendencję do woli jedno narzędzie / jedna funkcja to znaczy narzędzi robi wiele rzeczy są nie istniejące
Kiwy

@Kiwy Niektóre narzędzia linuxowe nie są zgodne z zasadami uniksowymi i łączą różne funkcje o różnym charakterze. Na przykład systemd.
Kondybas,

1
@Kondybas „ma tendencję do” jest ważną częścią zdania. istnieje wyjątek od reguły. Wciąż twoja odpowiedź jest naprawdę zła.
Kiwy

9

Jeśli chcesz także gdzieś skopiować plik (np. Jego ostateczne miejsce docelowe), możesz rzucić okiem na installpolecenie:

install -m 0777 -o root $sourcefile $destinationfile


1

Ważne jest użycie odpowiedniego narzędzia do zadania w * nix, ale w rzeczywistości powtarzanie tej samej ścieżki w każdym łańcuchowym poleceniu wygląda głupio. Zamiast tego powinieneś naprawdę używać zmiennych Bash, aw mniejszych skryptach, szczególnie korzystaj z $_.

Twoje polecenie brzmiałoby:

chmod 123 WantToChangeThisFile && chgrp admin $_

ALT +. robi to samo, wyciągając ostatnio używany argument w bieżącej powłoce.


0

Rsync jest przydatny w tym przypadku:

Z dokładnej instrukcji (TM)

--chown = USER: GROUP proste mapowanie nazwy użytkownika / grupy

--chmod = CHMOD wpływa na uprawnienia do plików i / lub katalogów

Na przykład chcesz chmod / mnt / lala / lala4000 / „ugo = rX” i zmienić „foo.bar”

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

To rekurencyjnie chown i chmod reż.


0

Możesz osiągnąć suchy cel dzięki długiemu rsyncdowodzeniu

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

nie rozumiem
Pierre.Vriens

Jest to niebezpieczne: wpłynie na wszystkie pasujące pliki w określonym katalogu i podkatalogach, a nie tylko na jeden plik, na który wskazuje.
telcoM

-1

Możesz zrobić, chown username:groupname file ...aby zmienić oba jednocześnie. Zmienia dwa pola w tej samej (inode) strukturze, więc ich połączenie pozwala zaoszczędzić dwa wywołania systemowe (jedno do odczytu bieżących wartości i jedno do ustawienia zmodyfikowanych vaules).


chownzmienia tylko właścicieli. W jaki sposób zmienia to uprawnienia w tym samym czasie, gdy zażądano OP? Uwaga Przykład OP zawiera chmodrównież.
jscott

Ach, myślę, że chciał zmienić 3 rzeczy, jak napisał. Dla zmiany właściciela grupy myślałem, że ma na myśli grupę i właściciela.
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
możesz przynajmniej wyjaśnić, jak to działa i jak powinno się go używać (parametry, ile to jest ...)
Kiwy

2
Nie wklejaj tylko kodu jako odpowiedzi.
Konrad Gajewski

Komentowanie raczej nie będzie produktywne; to jedyna rzecz, którą ten użytkownik kiedykolwiek opublikował, i od tego czasu nawet się nie zalogował.
G-Man mówi „Przywróć Monikę”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.