Perlu memperbaiki izin file di direktori home pengguna


24

Adakah yang memiliki alat atau skrip yang secara rekursif akan memperbaiki izin file pada direktori?

Pada mesin Linux Ubuntu, banyak file disalin ke disk USB dengan izin penuh 777 (pengguna, grup, lainnya - baca, tulis, jalankan) dalam kesalahan. Saya ingin menempatkan mereka kembali di direktori pengguna yang diperbaiki.

Direktori harus 775 dan semua file lainnya bisa 664. Semua file adalah gambar, dokumen atau MP3, jadi tidak ada yang perlu dieksekusi. Jika bit direktori diatur maka perlu eksekusi, selain itu hanya perlu pengguna dan grup, baca dan tulis.

Saya pikir itu layak untuk memeriksa apakah ada utilitas seperti itu sebelum meretas skrip shell :)


Jawaban:


51

Ini harus melakukan trik:

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

1
+1 untuk menggunakan -print0 / xargs -0 :-).
sleske

14

find dapat melakukan trik sendiri dengan -exec:

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

untuk mencegah menemukan memunculkan chmod untuk setiap entri:

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

(ini secara efektif memanggil chmod sekali dengan daftar semua file sebagai parameter daripada satu chmod per file)


6
Lebih lambat daripada menggunakan xargs, karena Anda mencari chmod untuk setiap file, di mana xargs akan menjalankan proses chmod dengan sebanyak mungkin file yang dapat ditampung di baris perintah. Pada pohon yang sangat besar, ini bisa membuat perbedaan yang adil.
David Pashley

1
Juga, print0 / xargs -0 akan menangani bahkan nama file yang sangat aneh; tidak begitu yakin tentang find -exec.
sleske

8

Jawaban ini tidak akan menyelesaikan masalah Anda, tetapi seseorang mungkin menemukan itu berguna untuk masalah serupa di mana file memiliki izin kurang dari yang seharusnya mereka lakukan.

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

Keajaiban adalah izin X, bukan x. Halaman manual chmod menggambarkannya sebagai berikut:

mengeksekusi / mencari hanya jika file tersebut adalah direktori atau sudah memiliki izin eksekusi untuk beberapa pengguna

Ini tidak cocok dalam kasus Anda karena file Anda memiliki izin eksekusi, akan cocok dengan tes kedua.


1
g harus rwX untuk 775 dan 664.
aventurin

1

Saya membuat skrip dari solusi freiheit, itu menambahkan pemeriksaan argumen dasar.

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

Ide bagus. Namun, baris kedua melempar kesalahan ketika target adalah sebuah direktori: chmod: missing operand after ‘0644’. Dapatkah saya menyarankan untuk membungkus pernyataan temuan dengan tanda cek untuk melihat apakah target itu ada? 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
Undervers

Hampir benar; tetapi jika targetnya adalah direktori, Anda lupa chmod file di dalamnya, dan jika itu file, Anda hanya perlu chmod file itu saja.
sean

0

Jika Anda menggunakan ssh, ada baiknya untuk tidak memodifikasi ~/.ssh izin.

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

Saya membuat skrip bash yang sangat sederhana tempo hari karena saya perlu memperbaiki izin. Mengapa tidak ada utilitas formal untuk mengatur ulang izin dasar, non-root, file dan folder?

Script menggunakan find to 755 all folder dan 644 libraries. Itu kemudian menguji setiap file dengan diri untuk melihat apakah memiliki header elf biner. Jika tidak, ini memindai dalam dua karakter pertama untuk shebang #!. Ini 755 instance dan 644 segalanya setelah memeriksa untuk melihat apakah file sudah memiliki izin yang cocok.

Kasus khusus ditangani dengan pengecualian seperti *.bakuntuk file yang akan diabaikan.

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

Saya menemukan solusi C-shell yang disederhanakan. Ini mungkin bukan bukti yang benar-benar bodoh tetapi harus bekerja untuk sebagian besar direktori. Ini menganggap perintah 'file' Unix berfungsi, dan menemukan file exec untuk meresetnya kembali ke izin exec:

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
Ini tidak hanya mengulangi beberapa jawaban, tetapi juga memperkenalkan kesalahan dan fungsionalitas yang tidak diminta OP.
RalfFriedl

0

Alternatif, yang tidak secara tepat menjawab permintaan asli, tetapi lebih mungkin apa yang ingin OP, adalah untuk menentukan izin secara simbolis. Misalnya, saya berasumsi bahwa OP ingin "menghapus akses tulis untuk umum, dan menghapus izin yang dapat dieksekusi dari semua file".

Ini dimungkinkan jika Anda menggunakan representasi izin simbolis.

  • ow adalah "hapus akses tulis dari publik" ("o" - lainnya, "-" - hapus, "w" - tulis)
  • ax adalah "hapus eksekusi untuk semua orang hanya pada file" ("a" - semua, "-" - hapus, "x" - jalankan)

Menulisnya dengan cara ini alih-alih secara eksplisit mengatur "0664" Anda menghindari secara tidak sengaja mengizinkan izin tambahan untuk file yang sebelumnya dikunci. Misalnya, jika suatu file adalah 0770 itu tidak akan menjadi 0664 karena kesalahan.

Untuk melakukan persyaratan pertama, Anda cukup menggunakan chmod:

chmod --recursive o-w $dir

Untuk melakukan persyaratan kedua:

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

Atau untuk melakukan keduanya:

find $dir -type f -exec chmod a-x,o-w {} +
find $dir -type d -exec chmod o-w {} +
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.