Bir kullanıcının giriş dizinindeki dosya izinlerini düzeltmeniz gerekiyor


24

Bir dizindeki dosya izinlerini tekrar tekrar düzeltecek bir aracı veya komut dosyası var mı?

Bir Ubuntu Linux makinesinde, bir sürü dosya yanlışlıkla 777 izinle (kullanıcı, grup, diğer - okuma, yazma, yürütme) hatalı olarak bir USB diske kopyalandı. Onları düzeltmek için kullanıcının dizinine geri koymak istiyorum.

Dizinler 775 ve diğer tüm dosyalar 664 olabilir. Tüm dosyalar resim, belge veya MP3'lerdir, bu nedenle hiçbirinin çalıştırılabilir olması gerekmez. Dizin biti ayarlanmışsa, yürütme yapması gerekir, aksi halde sadece kullanıcı ve gruba ihtiyaç duyar, oku ve yaz.

Bir kabuk betiğini kırmadan önce böyle bir yardımcı program olup olmadığını kontrol etmeye değeceğini düşündüm :)


Yanıtlar:


51

Bu hile yapmak gerekir:

find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664

1
-Print0 / xargs -0 :-) kullanmak için +1.
11'de sleske

14

-exec ile hile yapmayı öğren:

find /home/user -type f -exec chmod 0664 {} \;
find /home/user -type d -exec chmod 0775 {} \;

Her giriş için bir chmod bulunmasını engellemek için:

find /home/user -type f -exec chmod 0664 {} +
find /home/user -type d -exec chmod 0775 {} +

(bu, her dosya için bir chmod yerine parametreler olarak tüm dosyaların listesiyle birlikte chmod'u etkili bir şekilde çağırır)


6
Xargs kullanmaktan daha yavaş, her dosya için bir chmod öngördüğünüzden, xargs bir komut satırına sığabileceği kadar çok sayıda chmod işlemini çalıştıracağından. Çok büyük bir ağaçta, bu adil bir fark yaratabilir.
David Pashley

1
Ayrıca, print0 / xargs -0, çok garip dosya isimlerini bile idare eder; -exec'i bulmak konusunda pek emin değilim.
11'de sleske

8

Bu cevap sorununuzu çözmeyecek, ancak birileri dosyaları olması gerekenden daha az izne sahip olduğu benzer bir sorun için yararlı bulabilir.

# chmod -R . u=rwX,g=rX,o=rX

Büyü, x yerine X iznidir. Chmod manpage şöyle açıklar:

yalnızca dosya bir dizinse veya zaten bazı kullanıcılar için yürütme iznine sahipse yürütme / arama

Bu, sizin durumunuz için uygun değildir, çünkü dosyalarınız ikinci yürütmeyle eşleşecek şekilde yürütme iznine sahiptir.


1
g 775 ve 664 için rwX olmalıdır.
aventurin

1

Freiheit'in çözümünden bir senaryo yazdım, temel argüman kontrolü ekliyor.

#!/bin/sh

if [ $# -lt 1 ]; then
    echo "USAGE: $0 <path>"
    exit 1
fi

find $1 -type d -print0 | xargs -0 chmod 0755
find $1 -type f -print0 | xargs -0 chmod 0644

İyi bir fikir. Hedef bir dizindir Ancak, ikinci hat bir hata verir: chmod: missing operand after ‘0644’. Hedefin var olup olmadığını görmek için find ifadelerini bir çekle sarmayı önerebilir miyim? if [ -d $1 ]; then find $1 -type d -print0 | xargs -0 chmod 0755; fi; if [ -f $1 ]; then find $1 -type f -print0 | xargs -0 chmod 0644; fi
17:17

Neredeyse doğru; ancak hedef bir dizinse, içindeki dosyaları chmod unuttum ve bir dosya ise, sadece o dosyayı chmod etmeniz yeterlidir.
sean

0

Ssh kullanıyorsanız, ~/.sshizinleri değiştirmemek iyi bir fikirdir .

DIR=/home/user
find $DIR -type d -not -path "$DIR/.ssh" -print0 | xargs -0 chmod 0775
find $DIR -type f -not -path "$DIR/.ssh/*" -print0 | xargs -0 chmod 0664

0

Geçen gün gerçekten basit bir bash betiği yaptım çünkü izinleri düzeltmem gerekiyordu. Temel, root olmayan, dosya ve klasör izinlerini sıfırlamak için neden resmi bir yardımcı program yok?

Betik 755 tüm klasörleri ve 644 kütüphanelerini bulur. Daha sonra her dosyayı bir ikili elf başlığına sahip olup olmadığını görmek için el ile test eder. Değilse, ilk iki karakteri shebang için tarar #!. Bu örnekleri 755 ve 644, dosyanın zaten eşleşen iznine sahip olup olmadığını kontrol ettikten sonra her şeyi kontrol eder.

Özel durumlar, *.bakgöz ardı edilecek dosyalar gibi bir istisna dışında ele alınmaktadır .

#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  echo "Processing ..."
  find -H $(pwd) -type d -exec chmod 0755 {} \;
  # set dirs to 755
  find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
  # libs
  IFS=$'\n'
  for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
    tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
    if [ -z "$tstbin" ]; then
      tstbat=$(cat "$value" | head -c2 | grep -io '#!')
      if [ -n "$tstbat" ]; then
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "755" ]; then
          chmod 755 $value
          echo "Set script  755 $value"
          # set batch to 755
        fi
      else
        perm=$(stat -c '%a' "$value")
        if [ "$perm" != "644" ]; then
          chmod 644 $value
          echo "Set regular 644 $value"
          # set regular files to 644
        fi
      fi
      # above aren't elf binary
    else
      perm=$(stat -c '%a' "$value")
      if [ "$perm" != "755" ]; then
        chmod 755 $value
        echo "Set binary  755 $value"
        # set elf binaries to 755
      fi
    fi
  done
  unset IFS
  # process linux permissions for files and folders
else
  echo "Aborted."
fi

0

Basitleştirilmiş bir C-shell çözümü buldum. Bu tamamen aptalca bir kanıt olmayabilir, ancak çoğu dizin için çalışmalıdır. Unix 'file' komutunun çalıştığını varsayar ve bunları çalıştırma izinlerine sıfırlamak için exec dosyalarını bulur:

find /home/user -type d | xargs chmod 0775
find /home/user -type f | xargs -0 chmod 0664
find /home/user -type f -exec file {} \; | grep executable | cut -d":" -f1 | xargs chmod 0775

1
Bu sadece bazı cevapları tekrarlamakla kalmıyor, OP'nin istemediği bir hata ve işlevsellik getiriyor.
RalfFriedl

0

Orijinal talebi tam olarak cevaplamayan, ancak OP'nin neyi amaçladığı daha olası bir alternatif, izinleri sembolik olarak belirtmektir. Örneğin, OP’nin "genel için yazma erişimini kaldırmak ve tüm dosyalardan çalıştırılabilir izinleri kaldırmak" istediğini kabul ediyorum.

Sembolik izin gösterimini kullanıyorsanız bu mümkündür.

  • ow "yazma erişimini halktan kaldır" ("o" - diğerleri, "-" - kaldır, "w" - yazma)
  • ax "sadece dosyalardaki herkes için yürütme" ("a" - tümü, "-" - kaldır, "x" - yürütme)

Açıkça "0664" ayarı yapmak yerine bu şekilde yazmanız, yanlışlıkla kilitlenmiş dosyalara yanlışlıkla izin vermekten kaçınırsınız. Örneğin, bir dosya 0770 ise, yanlışlıkla 0664 olmaz.

İlk gereksinimi yapmak için sadece kullanabilirsiniz chmod:

chmod --recursive o-w $dir

İkinci gereksinimi yapmak için:

find $dir -type f -exec chmod a-x {} +

Veya ikisini birden yapmak için:

find $dir -type f -exec chmod a-x,o-w {} +
find $dir -type d -exec chmod o-w {} +
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.