Sklonować własność i uprawnienia z innego pliku?


125

Czy istnieje polecenie lub flaga do sklonowania własności / uprawnień użytkownika / grupy do pliku z innego pliku? Czy chcesz, aby perms i własność były dokładnie takie same jak w innym pliku?

Odpowiedzi:


175

Na GNU / Linux chowni chmodmają --referenceopcję

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

1
Czy możesz odnieść się do tej odpowiedzi (i prawdopodobnie ją zacytować) jako odpowiedzi na moje pytanie: unix.stackexchange.com/questions/44253/… ? , Myślę, że będę świetnym dodatkiem i chciałbym znaleźć tam głosy za to.
Grzegorz Wierzowiecki

@GrzegorzWierzowiecki: prawdopodobnie to pytanie powinno zostać zamknięte, ale jest trochę inne niż to i ma już odpowiedzi, więc lepiej nic nie robić.
enzotib

Jak sobie życzysz i sugerujesz. Dzięki za pomoc, nigdy nie zwracałem uwagi na --referenceparametr chmodi chownwcześniej :).
Grzegorz Wierzowiecki

12

Na dowolnym Uniksie z narzędziami GNU, takim jak (niewbudowany) Linux lub Cygwin, możesz używać chmod --referenceichown --reference .

Jeśli twój system ma listy ACL , spróbuj poleceń ACL getfacli setfacl. Te polecenia różnią się nieco w zależności od systemu, ale w wielu przypadkach można użyć getfacl other_file | setfacl -bnM - file_to_changedo skopiowania uprawnień. To nie kopiuje własności; możesz to zrobić ostrożnie analizując ls -l other_file, zakładając, że nie masz nazw użytkowników ani grup zawierających spacje.

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
Powinieneś mieć zainstalowany ACL i system plików podłączony z włączoną ACL.
enzotib

2
@enzotib Przynajmniej w systemie Linux narzędzia ACL będą działać w celu kopiowania uprawnień (ale nie własności), nawet jeśli źródłowy i docelowy system plików nie obsługuje list ACL.
Gilles

7

Zrobił polecenia bash na podstawie reakcji Matteo :)

Kod:

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

Stosowanie:

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


5
Egad! Gdzie nauczyłeś się mówić ${*:2}? Nigdy więcej tego nie rób! To się nie powiedzie, jeśli którakolwiek z nazw plików zawiera spację (lub tabulatory). Użyj "${@:2}". Użyj "$1"zamiast tego $1.
G-Man

chmod "$(stat -c '%a' "$fromfile")" tofilew GNU Coreutils, ale równie dobrze możesz użyć --referencew tym przypadku, ponieważ statnarzędzie CLI nie jest POSIX, mówi nawet pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.htmlto ls -l tego nie da: „Wyjście ls (z opcją -l i powiązanymi opcjami) zawiera informacje, które logicznie mogłyby zostać wykorzystane przez narzędzia takie jak chmod i touch, aby przywrócić pliki do znanego stanu. Jednak informacje te są przedstawione w formacie, który nie może być użyty bezpośrednio przez te narzędzia lub być łatwo przetłumaczone na format, którego można użyć. ”
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

5

Jeśli nie używasz systemu z chmod / chown GNU (które obsługują tę --referenceopcję), możesz spróbować przeanalizować wynikls -l

Oto mały skrypt dla chmod(jeśli widzisz, który obsługuje rozszerzone wyrażenia regularne, można je napisać w znacznie bardziej czytelny sposób ...)

#!/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}

AKTUALIZACJA :

Jest to jeszcze łatwiejsze przy użyciu stat:

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

2
Zamiast analizować ls -ldane wyjściowe, możesz przeanalizować statdane wyjściowe.
jfg956,

@jfgagne: dzięki ma sens Nie wiem, dlaczego w ogóle o tym nie myślałem. Zaktualizowałem odpowiedź
Matteo

1
Używasz stattutaj składni * BSD . Twoje chmod $(stat ...)polecenie nie będzie działać, ponieważ %psamo wypisuje za dużo informacji dla * BSD chmod, użyj %Lpdo wyprowadzenia tylko bitów u / g / o. W przypadku lepkich / setuid / setgid bitów wymagane byłoby coś nieco bardziej skomplikowanego.
mr.spuratic

0

Chciałem dodać korektę do skryptu Matteo . Należy użyć pętli for, aby sprawdzić, czy pliki istnieją przed uruchomieniem na nich komendy chmod. Pozwoli to na bardziej płynny błąd skryptu.

Myślę, że jest to najlepsza opcja, ponieważ można jej używać we wszystkich systemach operacyjnych * nix, takich jak Solaris, Linux itp.

#!/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}

Odkryłem, że na jednym z moich komputerów Solaris 10 statnie został znaleziony. Może to być problem z moją konfiguracją.


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.