Sahiplik ve izinleri başka bir dosyadan klonlamak?


125

Bir dosyadaki kullanıcı / grup sahipliğini ve izinlerini başka bir dosyadan klonlamak için bir komut veya bayrak var mı? İzinleri ve mülkiyeti tam olarak başka bir dosyanınkine göre yapmak için?

Yanıtlar:


175

GNU / Linux'ta chownve chmodbir --referenceseçenek var

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

1
Unix.stackexchange.com/questions/44253/… sorusuna cevap olarak bu cevaba atıfta bulunabilir (ve muhtemelen alıntı) ? , Harika bir ekleme olacağımı ve bunun için oyları bulmayı çok isterim.
Grzegorz Wierzowiecki

@ GrzegorzWierzowiecki: muhtemelen bu sorunun kapatılması gerekiyor, ama bundan biraz farklı ve zaten cevapları var, bu yüzden hiçbir şey yapmasam iyi olur.
enzotib

İstediğiniz ve önerdiğiniz gibi. Yardım için teşekkürler, ben dikkat koymak asla --referencebir parametre chmodve chown:) önce.
Grzegorz Wierzowiecki

12

Böyle (-olmayan gömülü) Linux veya Cygwin gibi herhangi unix GNU kamu hizmetleri, üzerinde, kullanabilir chmod --referencevechown --reference .

Sisteminiz varsa ACL , ACL komutları denemek getfaclve setfacl. Bu komutlar sistemden sisteme biraz farklılık gösterir, ancak çoğunda getfacl other_file | setfacl -bnM - file_to_changeizinleri kopyalamak için kullanabilirsiniz . Bu mülkiyeti kopyalamaz; Bunu, ls -l other_fileboşluk içeren kullanıcı veya grup adlarınızın olmadığını varsayarak, dikkatli bir şekilde ayrıştırma ile yapabilirsiniz.

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
ACL kurulu olmalı ve ACL etkinleştirilmiş dosya sistemi kurulmalıdır.
enzotib

2
@enzotib En azından Linux'ta, kaynak ve hedef dosya sistemi ACL'leri desteklemese bile, ACL araçları izinleri kopyalamak (ancak mülkiyeti değil) için çalışacaktır.
Gilles

7

Matteo cevabına göre bir bash komutu yaptı :)

Kod:

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

Kullanımı:

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


5
Egad! Söylemeyi nereden öğrendin ${*:2}? Bunu bir daha yapma! Dosya adlarından herhangi biri boşluk (veya sekmeler) içeriyorsa, bu başarısız olur. Kullanın "${@:2}". Ayrıca, "$1"sadece yerine kullanın $1.
G-Man

chmod "$(stat -c '%a' "$fromfile")" tofileGNU Coreutils'te, ancak CLI yardımcı programı POSIX olmadığından --referencebu durumda da kullanabilirsiniz stat, hatta pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html ls -l bunu kesmeyecek diyor : "ls çıktısı (-l ve ilgili seçeneklerle), dosyaları bilinen bir duruma geri yüklemek için chmod ve dokunma gibi yardımcı programlar tarafından mantıksal olarak kullanılabilecek bilgiler içerir, ancak bu bilgiler doğrudan bu yardımcı programlar tarafından kullanılamayan bir biçimde sunulur veya kolayca kullanılabilecek bir formata çevrilebilir. "
Ciro Santilli新疆改造中心法轮功六四事件

5

GNU's chmod / chown ( --referenceseçeneği destekleyen ) ile bir sistem kullanmıyorsanız , çıktısını ayrıştırmayı deneyebilirsiniz.ls -l

Burada küçük bir betik chmod(eğer genişletilmiş regex'leri destekleyen bir görüntünüz varsa, daha okunaklı bir şekilde yazılabilirler…)

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

GÜNCELLEME :

Bu kullanarak daha da kolay stat:

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

2
ls -lÇıktıyı çözümlemek yerine çıktıyı çözümleyebilirsiniz stat.
jfg956 21:11

@jfgagne: teşekkürler mantıklı, neden ilk önce onu düşünmediğimi bilmiyorum. Cevabı güncelledim
Matteo

1
statBurada * BSD sözdizimini kullanıyorsunuz . Sizin chmod $(stat ...)komut çünkü çalışmayacak %p* BSD yıllardan yalnız çıkışlar çok fazla bilgi chmod, kullanmak %Lpçıkışına sadece u / g / o bitleri. Yapışkan / setuid / setgid bitleri için biraz daha ayrıntılı bir şey gerekir.
mr.spuratic

0

Matteo'nun senaryosuna bir düzenleme eklemek istedim . Bir for döngüsü, dosyalar üzerinde chmod komutunu çalıştırmadan önce var olduklarını doğrulamak için kullanılmalıdır. Bu, komut dosyasının daha incelikli bir şekilde bozulmasına izin verecektir.

Bunun en iyi seçenek olduğunu düşünüyorum çünkü Solaris, Linux gibi tüm * nix işletim sistemlerinde kullanılabiliyor.

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

Solaris 10 makinelerimden birinde statbulunamadı. Bu benim yapılandırmamla ilgili bir sorun olabilir.


0

Bu benim için çalışıyor:

cp -p --attributes-only <from> <to>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.