Bir dizinde yanlışlıkla -R + x chmod. Doğru izinleri nasıl geri yüklerim?


20

Daha açık söylemek gerekirse, öyleydi chmod -R 755. Şimdi her dosya yürütülebilir, ki ben istemiyorum. Ben her dosya için ilk iki bayt bakmak gerektiğini düşünüyorum #!, ama bu her şeyi kapsayacak mı? Bunun yerine fileher şeye bakmak ve kararımı buna dayandırmalı mıyım? Ya da, büyük olasılıkla, bunu yapmanın daha iyi bir yolu var mı?

Bir dizinde tekrar tekrar gezinmek ve 'yürütülebilir' olması gerekmeyen dosyalar üzerinde -x ayarlamak için tercih edilen yol nedir?


Bunu /başka bir dizinde mi yaptınız ?
gvkv

1
@gvkv: Hayır /, tamamen sahip olduğum bir dizin.
Larry Wang

1
@Gelecekte, tüm izinlere tecavüz etmek ve muhtemelen tüm dosyalarda yazma işlemlerine neden olmak yerine, + x değişkenini kullanmalısınız.
Ağustos'ta xenoterracide

@xenoterracide: Kabul etti. Gerçekten istediğim, gruba benimle aynı izinleri vermekti (ki bu sonuç oldu!), Yazmadan önce yeterince düşünmedim.
Larry Wang

Kaç dosyadan bahsediyoruz? Kaç tane çalıştırılabilir olmalıdır? Dosya adlarından anlamanın bir yolu var mı?
David Thornley

Yanıtlar:


15

Burada sihirli mermi yok. İzinler her zaman gereksiz olmayan bilgiler taşır.

Bunu bir sistem dizininde yapmış olsaydınız, sisteminiz çok kötü durumda olurdu, çünkü setuid ve setgid bitleri ve dünya tarafından okunamayan dosyalar ve dosyalar hakkında endişelenmeniz gerekir. grup ya da dünya tarafından yazılabilir olması gerekiyordu.

Kullanıcı başına bir dizinde, dünya tarafından okunabilir olması gerekmeyen dosyalar hakkında endişelenmeniz gerekir. Orada kimse size yardım edemez.

Yürütülebilirliğe gelince, iyi bir kural, yürütülebilecek gibi görünmeyen her şeyin gerçekleştirilemez hale getirilmesi olacaktır. Çekirdek, ilk iki baytı olan komut #!dosyalarını, ilk dört baytı 12 değerine sahip baytın \x7fELFbulunduğu ELF ikili dosyalarını \x7fve birkaç nadir dosya türünü (a.out, kayıtlı herhangi bir şey binfmt_misc) çalıştırabilir. Bu nedenle, aşağıdaki komut izinlerinizi makul bir duruma geri yüklemelidir (bash 4 veya zsh olduğunu varsayar, aksi takdirde finddizin ağacında gezinmek için kullanın ; uyarı, doğrudan tarayıcıya yazılır):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

Bir dizin ağacının, Linux'ta ve muhtemelen ACL destekli diğer birleşimlerin izinlerini yedeklemek ve geri yüklemek için basit bir yol olduğunu unutmayın:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions

Teşekkürler! Neyse ki, her şey bu iki kategoriye giriyor. Bu bir şey kaçırırsa, daha sonra başa çıkabilirim.
Larry Wang

Akılda Ayı **/*gerektirir globstar.
Chris Down

Bu senaryoda iki değişiklik öneriyorum. Bir, findglobstar yerine kullanın ; iki, kafaya bakmak yerine, filene olduğunu görmek ve oradan dallamak için komutu kullanın.
Shadur

@Shadur finddaha az güvenilirdir globstar, globstarhemen hemen her durumda tercih edilir.
Chris Down

1
@Gilles "Eğer varsa, çok daha üstün" olduğu gibi tercih edilir, sadece daha hızlı değil, aynı zamanda daha güvenilirdir (ve beklenmedik SNAFU'ları yoktur).
Chris Down

6

Ben senin gibi bir şey isteyeceğine inanıyorum

find dir -type f -exec chmod ugo-x '{}' +

Bu, tüm normal dosyaları, özyinelemeli olarak dir (dizini ve aygıtları hariç tutar) arar ve yürütülebilir biti kaldırır.

Buradan başlıyorum ve sonra yürütülebilir, yürütülebilir olması gereken dosyaları yapmaya çalışıyorum.

Aşağıdakiler tam olarak istediğiniz gibi çalışmalıdır (tüm normal dosyaları bulur, #!

find . -type f | xargs grep -L #! | xargs chmod ugo-x

muhtemelen yukarıdakilerin daha iyi bir versiyonu (daha az boru)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 

3
Emin olun grep -L '^#!'(tırnak gereklidir ve en azından ^kısıtlar satırın başında eşleme), ancak eşleşmeleri olarak hala çok hoşgörülü olduğunu #!herhangi hatta. xargsBoşluk veya tırnak işareti içeren dosya adlarında kullanmak başarısız olur; kullanın xargs -d '\n'(GNU gerektirir xargs).
Gilles 'SO- kötü olmayı kes

0

Eh, bir shebang hattı olmadan, dosya nominal olarak bir kabuk komut dosyası olarak yürütülür /bin/sh. Fikriniz iyi bir başlangıçtır ve söz konusu dizinin kritik görev dosyaları içermediği varsayımına göre, muhtemelen bazılarını grepve chmodcombo'yu yürütme riski yoktur . Yanlış pozitiflerle karşılaşabilirsiniz, yani çalıştırılabilir bitleri olması amaçlanmamış bir shebang satırına sahip dosyalar, ancak dizinde ne olduğu hakkında daha fazla bilgi bilmeden, yalnızca sizin için önemli bir varoluşsal tehdit oluşturup oluşturmadığına karar verebilirsiniz. sistem ve / veya veri.


Yanlış pozitifler konusunda yanlış negatifler kadar endişelenmiyorum. Başlamadığımı düşünmediğim ikili dosyalar var #!.
Larry Wang
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.