Klasörlere dokunmadan yürütme izinlerini dosyalardan yinelemeli olarak nasıl kaldırırım?


40

Bir NTFS sürücüsüne yedekleme yaptım ve bu yedeklemenin gerçekten gerekli olduğu kanıtlandı. Ancak, NTFS sürücüsü izinleri berbat etti. Her dosyayı elle düzeltmek için onları normal durumuna getirmek istiyorum.

Bir problem birden bire benim kazandığım tüm metin dosyalarımın izinsiz çalıştırılmasıdır ki bu yanlış. Bu yüzden denedim:

sudo chmod -R a-x folder\ with\ restored\ backup/

Ancak bu, xdizinlerden izinleri kaldırması ve onları okunamaz hale getirmesi yanlıştır .

Bu durumda doğru komut nedir?


1
Meta: Unix sistemlerinin neden exec bit'in DOS veya Windows dosya sistemlerine kurulu dosyalara eklendiğini anlamadım. Bu dosyaları hiç kimsenin çalıştırması gibi değil. Genelde uygun olan yerlerde montaj seçeneklerime "noexec" eklerim.
Edward Falk

Yanıtlar:


68
chmod -R -x+X *

-xKaldırır tüm izinleri yürütmek
The +Xancak, tüm yürütme izinlerini katacak sadece dizinleri için.


2
Sonunda izinleri normale döndürmek için kullandığım komut: `chmod -R a-x + X, u-x + rwX, go-wx + rX dizini / adı`
gaazkam

3
Ayrıca Edward’ın BSD istisnası hakkındaki cevabını da görebilirsiniz
fikr4n

4
Bu, "klasörlere dokunmadan" gereksinimi karşılamaz. Yürütme (belki de dünya için) bazı dizinlerde bilerek kaldırılmışsa? Eklememelisin.
Ben Voigt

4
Bu Mac üzerinde işe yaramadı. -R bayrağının başlangıcına taşınması, bu çalışmayı hem linux hem de Mac terminallerinde yapacaktır. chmod -R -x+x *
JoeMoe1984

2
Aslında doğru sıra ile OSX'de çalışır, ancak aslında istenen etkiye sahip değildir. Bunu iki ayrı adım olarak yapmanız gerekir:chmod -R -x * && chmod -R +X *
Timmmm

14

Tamam, Mac OS X, BSD ve Linux için "chmod" man sayfalarını tekrar okudum ve birkaç deney yaptım. İşte sembolik modlar hakkında öğrendiklerim. Karmaşıklaşabilir, ancak anlamaya değer:

  • Genel biçim fıkra [, fıkra …] buradadır:
  • fıkra : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( who ) (çoklu belirt) kullanıcı, grup, diğerleri veya herkes için izin ayarlamak anlamına gelir. Belirtilmezse, varsayılan değer ' a'dır , ancak umask etkindir.
  • [+ - =] ( eylem ) (birini belirtin) şu anlama gelir:
    • +, belirtilen izinleri geçerli olan izinlere eklemek anlamına gelir
    • - Belirtilen izinlerin yürürlükteki izinlerden kaldırılması anlamına gelir.
    • = izinleri belirtilen izinlere ayarlamak, diğerlerini silmek anlamına gelir
  • [rwxXstugo] ( izin ) (rwxXst VEYA ugo'nun çoğunu belirtin), belirtilen kullanıcılar için izinleri aşağıdaki gibi ayarlar:
    • r - oku
    • w - yaz
    • x - yürütme / arama
    • X - iff dizininde execute / search VEYA herhangi bir execute bit zaten ayarlanmış.
    • s - intihar veya sgid
    • t - yapışkan
    • u - kullanıcı iznini kopyala
    • g - grup iznini kopyala
    • o - diğer izinleri kopyala

Örneğin, a+xbir dosyayı herkes tarafından çalıştırılabilir yapar. a+Xbir dosyayı herkes tarafından çalıştırılabilir olsaydı, herkes tarafından çalıştırılabilir hale getirirdi.

a+xBir dizini herkes tarafından aranabilir yapar. a+Xaynı zamanda herkes tarafından aranabilir bir dizin oluşturur.

BSD ve Linux arasındaki temel fark, BSD ile, chmod yürütülmeden önce dosyanın izinlerine dayanarak tespit yapılmasıdır . Linux ile belirleme, + X yan tümcesinin yürütülmesinden hemen önce belirlenir.

Böylece, BSD ile kombinasyon a-x,a+X, yürütme / arama iznini kaldırır ve daha sonra herkes tarafından aranabilir bir dizin oluşturur ve orijinal olarak herhangi biri tarafından çalıştırılabilir olsaydı , bir dosyayı herkes tarafından çalıştırılabilir hale getirir .

Linux ile, a-x,a+Xyürütme / arama iznini kaldırır ve daha sonra bir dosyayı kimsenin çalıştırmadığı bir dosya bırakırken herkes tarafından aranabilir bir dizin oluşturur.


İşte somut bir örnek: bir BSD makinesinde: bir dizin, çalıştırılabilir bir dosya ve çalıştırılamaz bir dosya:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Hem dizinin hem de "fie" nin kullanıcı tarafından yürütülebilir / aranabilir olduğunu, ancak başkaları tarafından olmadığını gözlemleyin.

Şimdi idam ediyoruz chmod a-x,a+X *. İlk fıkra, tüm dosyalar için tüm kullanıcılardan çalıştırma / arama bitini soracak, ancak ikinci fıkra hem "ücret" hem de "fie" için geri ekleyecektir. Bir dizin olduğu için "fee" ve başlayabileceği en az bir çalıştırılabilir bit olduğundan "fie".

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Ben de aynı sonucu elde ettim chmod -x+X.

Sonuç: Jak Gibb'in çözümü Linux'ta çalışacak, ancak BSD için iki geçiş yapmanız gerekecek.

Bunu SVr4 veya diğer Unix değişkenlerinde test etmedim.


Güzel okuma. Bu konuda araştırma yaptığın için teşekkürler.
Jak Gibb,

10

Bunu yapmanın bir yolu:

find backup -type f -exec chmod 0644 {} +

6
Bu, değiştirmek istemediğiniz izinleri ekleme veya kaldırma işlemini ortadan kaldırabilir. Kullanımı daha iyichmod a-x {}
Edward Falk

1
@EdwardFalk chmod a-x {}ayrıca değiştirmek istemediğiniz izinleri de çıkarabilir ve dosyaları dünyaya yazılabilir hale getirebilir. Mesele şu ki, 0644 "genel olarak makul" bir uzlaşmadır. Tabii ki, OP, bilgisayarından internetten çözümler uygulamadan önce, aynı zamanda beyni de meşgul etmelidir.
Satō Katsura

4
"ax", kullanıcı, grup, diğerleri için yürütme iznini kaldırır ve bildiğim kadarıyla diğer izinleri değiştirmez. Yanlış mıyım?
Edward Falk

1
@EdwardFalk Hayır, haklısın. Ancak, dosya kümesinin gerçekte ne olduğunu bilmiyorsunuz ve ayrıca önceden izinlerin ne olduğunu bilmiyorsunuz chmod. Yedek dosyalarında komut dosyaları ve ikili dosyalar varsa, xbunlardan kaldırma işlemi yanlıştır. Eğer önceki izinler chmod0777 ise, o chmod a-xzaman hala 0666'yı bırakacaksınız, ki bu muhtemelen istediğiniz şey değildir. Demek istediğim bu chmod 0644daha iyi sezgisel tarama, chmod a-xyanlış değil .
Satō Katsura

1
@NajibIdrissi UNIX izinlerine sahip olmayan yabancı bir dosya sistemine kopyaladığınızda ne zaman, bildiğiniz gibi, 0777 olarak değiştirildi. OP'nin yaptığı tam olarak buydu.
Satō Katsura

6
 find backup ! -type l ! -type d -exec chmod a-x {} +

Dizini olmayan (istediğiniz gibi) veya sembolik linke sahip olmayan dosyalara yürütme iznini kaldırır ( sembolik bağlantılar genellikle her zaman rwxrwxrwx'tir ve chmodüzerlerindeki sembolik bağlantı hedefini etkiler).

Bunu not et:

 find backup -type f -exec chmod a-x {} +

sadece normal dosyaların iznini değiştirirdi . Dışlayacak Yani dizinleri ve sembolik değil, aynı zamanda cihazları , adlandırılmış kanalları , prizler (bir NTFS dosya sisteminin bir yedekleme OP'ın durumunda, bu mevcut olması muhtemel olur gerçi) sistemine bağlı olarak ve muhtemelen diğerleri.


2

Zsh'de, yalnızca normal dosyaları eşleştirmek (sembolik bağlantılar dahil değil) ve nokta dosyalarını eşleştirmek için glob niteleyicisini . kullanın D:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Komut satırı çok uzunsa, şunları kullanabilirsiniz zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
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.