Bir dosyanın izinlerini çoğaltmanın standart yolu


10

Bir dosyanın izinlerini başka bir dosyaya çoğaltmak için standart bir POSIX yolu bulmaya çalışıyorum. Bir GNU sisteminde bu kolaydır:

[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul  8 20:40 hardcopy.1
---------- 1 alexmchale users 2824 May 14 13:45 hardcopy.4
[alexmchale@bullfrog ~]$ chmod --reference=hardcopy.1 hardcopy.4
[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul  8 20:40 hardcopy.1
-rw-r--r-- 1 alexmchale users 2824 May 14 13:45 hardcopy.4

Ne yazık ki, chmod'un --reference bayrağı standart olmayan bir seçenektir. Yani bu benim amacım için. Tek astar olmasını tercih ederim, ama bu gerekli değil. Sonuçta, POSIX sh sözdiziminde olması gerekir.

Yanıtlar:


7

Bir ayartma ayrıştırmaktır ls. Bu ayartmadan kaçının .

Aşağıdakiler işe yarıyor gibi görünüyor, ancak Kluge ile dolu. cpHedef dosyanın izinlerini korumaya dayanır . Bu demo için "template" dosyası zaten mevcut olmamalıdır.

  • Dosyayı istediğiniz izinlerle yeni bir dosyaya kopyalayın
  • Değiştirmek istediğiniz dosyayı önceki adımda oluşturulan dosyaya kopyalayın
  • Değiştirmek istediğiniz orijinal dosyayı kaldırın
  • Ara dosyayı, değiştirilecek dosyanın adıyla yeniden adlandırın

Demo:

$ echo "contents of has">has
$ echo "contents of wants">wants
$ chmod ug+x has     # just so it's different - represents the desired permissions
$ cp has template
$ cat has
contents of has
$ cat wants
contents of wants
$ cat template
contents of has
$ ls -l has wants template
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 16 2010-07-31 09:23 template
-rw-r--r-- 1 user user 18 2010-07-31 09:22 wants
$ cp wants template
$ ls -l has wants template
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 18 2010-07-31 09:24 template
-rw-r--r-- 1 user user 18 2010-07-31 09:22 wants
$ cat template
contents of wants
$ rm wants
$ mv template wants
$ ls -l has wants
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 18 2010-07-31 09:24 wants
$ cat has
contents of has
$ cat wants
contents of wants

Şimdi bu ilginç bir yaklaşım. Bunu test edeceğim ve çeşitli sunuculara karşı ne kadar iyi çalıştığını göreceğim. Bana hile yapacakmış gibi geliyor.
Alex

@Alex: endişe ediyorsanız, dosya sahipliği ile de test ettiğinizden emin olun.
sonraki duyuruya kadar duraklatıldı.

İlk cp komutu, cp has templatekullanması gerektiğini cp -pmodu ve sahiplik özelliklerini korumak için.
mernst

@mernst: Bu, yalnızca cpdosyanın sahibi / grubu (örn. "kullanıcı") kopyalamayı yapan gruptan (örn. kök) farklıysa ilk için gereklidir .
sonraki duyuruya kadar duraklatıldı.

@Dennis Willamson: Tamam, ama bu bir olasılık ve orada kullanmak için herhangi bir olumsuz görmüyorum cp -p.
mernst

12

statDosya izni almak için komutu kullanabilirsiniz :

  • Mac OS X (BSD) sözdizimi:

    chmod `stat -f% Bir dosyaWithPerm` fileToSetPerm

  • Linux sözdizimi (emin değilim):

    chmod `stat -c% bir dosyaWithPerm` fileToSetPerm

` Sembolü Backquote olduğunu.


1
statPOSIX için gerekli olduğunu düşünmüyorum . Genellikle mevcut değildir.
sonraki duyuruya kadar duraklatıldı.

stat (komut satırı) POSIX değildir ve taşınabilir değildir. Dennis ++
jim mcnamara

1

ACL yardımcı programları getfacl ve setfacl bu amaç için kullanılabilir, ancak bu POSIX uyumlu olup olmadığını bilmiyorum. En azından FreeBSD 8.0 ve Linux'ta çalışır, ancak diğer yandan ACL yardımcı programlarını yüklemeniz gerekebilir.

Man sayfasından:

getfacl file1 | setfacl -b -n -M - file2
Copy ACL entries from file1 to file2.

Ben getfacl ve setfacl ACL ek olarak standart dosya izinlerini çalışabilir düşünüyorum.


ACL'ler ve benzeri POSIX tarafından tanımlanır, uygulamaya özgüdür, bu nedenle uyumluluk için gerekli değildir.
sonraki duyuruya kadar duraklatıldı.


0

Taşınabilir, basit bir yol standart bir yardımcı program değildir - templatefile üzerinde stat (), ardından hedef dosya (lar) da chmod () öğesini çağırmanız gerekir. Bu, C gibi bir dil veya perl gibi yaygın olarak kullanılan başka bir dil kullanmak anlamına gelir.

Dosya erişim izinleri, yapı statüsü st_mode üyesinde 0007777 bit ile belirtilir. Dennis'in çözümü doğrudur, eğer G / Ç üzerinde biraz ağırsa, gerçekten büyük dosyalar için başarısız olabilir:

cp has template

Üretime hazır olmayan bu örneği düşünün:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

mode_t 
getperm(const char *template_file)
{
    struct stat st;
    if(stat(template_file, &st)==-1)
    {
       perror("Cannot stat file");
       exit(1);
    }
    return st.st_mode;
}

int main(int argc, char **argv)
{    
    mode_t mode=getperm(argv[1]);
    int i=0;
    for(i=2; argv[i]!=NULL; i++)    
    {
       if(chmod(argv[i], mode)==-1)
          fprintf(stderr, "Permissions failed on %s:\n\t%s\n",
              argv[i], strerror(errno));
    }       
    return 0;
}
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.