จำเป็นต้องแก้ไขการอนุญาตของไฟล์ในโฮมไดเร็กตอรี่ของผู้ใช้


24

ใครบ้างมีเครื่องมือหรือสคริปต์ที่จะแก้ไขสิทธิ์ไฟล์ในไดเรกทอรีซ้ำ?

บนเครื่อง Ubuntu Linux ไฟล์จำนวนมากถูกคัดลอกไปยังดิสก์ USB ที่มีสิทธิ์ 777 อย่างเต็มรูปแบบ (ผู้ใช้กลุ่มอื่น ๆ - อ่านเขียนดำเนินการ) โดยมีข้อผิดพลาด ฉันต้องการนำกลับไปไว้ในไดเรกทอรีของผู้ใช้ที่ถูกต้อง

ไดเรกทอรีควรเป็น 775 และไฟล์อื่น ๆ ทั้งหมดอาจเป็น 664 ไฟล์ทั้งหมดเป็นรูปภาพเอกสารหรือ MP3 ดังนั้นจึงไม่จำเป็นต้องเรียกใช้ หากตั้งค่าไดเรกทอรีบิตแล้วมันต้องมีการดำเนินการอื่น ๆ ที่ชาญฉลาดก็แค่ต้องการผู้ใช้และกลุ่มอ่านและเขียน

ฉันคิดว่ามันคุ้มค่าที่จะตรวจสอบว่ามียูทิลิตี้อยู่ก่อนที่จะแฮ็กเชลล์สคริปต์ด้วยกันไหม :)


นี่คือหนึ่งฉันทำก่อนหน้านี้: http://timwise.blogspot.com/2008/08/reseting-home-folder-permissions-in.html
ทิมอาเบล

คำตอบ:


51

สิ่งนี้ควรทำเคล็ดลับ:

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

1
+1 สำหรับการใช้ -print0 / xargs -0 :-)
sleske

14

ค้นหาสามารถทำเคล็ดลับเพียงอย่างเดียวด้วย -exec:

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

เพื่อป้องกันการค้นพบจากการวางไข่ chmod สำหรับแต่ละรายการ:

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

(สิ่งนี้เรียก chmod ได้อย่างมีประสิทธิภาพเพียงครั้งเดียวด้วยรายการของไฟล์ทั้งหมดเป็นพารามิเตอร์มากกว่าหนึ่ง chmod ต่อไฟล์)


6
ช้ากว่าการใช้ xargs เนื่องจากคุณใช้ chmod สำหรับไฟล์ทุกไฟล์โดยที่ xargs จะเรียกใช้กระบวนการ chmod ที่มีไฟล์มากที่สุดเท่าที่มันจะพอดีกับบรรทัดคำสั่ง บนต้นไม้ที่มีขนาดใหญ่มากสิ่งนี้สามารถสร้างความแตกต่างได้อย่างยุติธรรม
David Pashley

1
นอกจากนี้ print0 / xargs -0 จะจัดการกับชื่อไฟล์ที่แปลกมาก ไม่แน่ใจเกี่ยวกับการค้นหา -exec
sleske

8

คำตอบนี้จะไม่แก้ปัญหาของคุณ แต่บางคนอาจพบว่ามีประโยชน์สำหรับปัญหาที่คล้ายกันซึ่งไฟล์มีสิทธิ์น้อยกว่าที่ควรทำ

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

ความมหัศจรรย์คือการอนุญาต X มากกว่า x chmod manpage อธิบายดังนี้:

ดำเนินการ / ค้นหาเฉพาะในกรณีที่ไฟล์เป็นไดเรกทอรีหรือมีสิทธิ์ดำเนินการสำหรับผู้ใช้บางส่วนแล้ว

สิ่งนี้ไม่เหมาะสมในกรณีของคุณเนื่องจากไฟล์ของคุณมีสิทธิ์ดำเนินการดังนั้นจะตรงกับการทดสอบครั้งที่สอง


1
g ควรเป็น rwX ในราคา 775 และ 664
aventurin

1

ฉันสร้างสคริปต์จากโซลูชันของ freiheit เพิ่มการตรวจสอบอาร์กิวเมนต์ขั้นพื้นฐาน

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

ความคิดที่ดี. chmod: missing operand after ‘0644’แต่บรรทัดที่สองโยนข้อผิดพลาดเมื่อเป้าหมายเป็นไดเรกทอรี: ฉันขอแนะนำให้ตัดคำสั่งค้นหาด้วยการตรวจสอบเพื่อดูว่ามีเป้าหมายอยู่หรือไม่ 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
แยก

เกือบจะถูกต้องแล้ว แต่ถ้าเป้าหมายเป็นไดเรกทอรีคุณลืมที่จะ chmod ไฟล์ในนั้นและถ้ามันเป็นไฟล์คุณเพียงแค่ต้อง chmod ไฟล์นั้นเท่านั้น
ฌอน

0

ในกรณีที่คุณใช้งาน SSH คุณไม่ควรแก้ไขการ~/.sshอนุญาต

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

ฉันทำสคริปง่ายๆจริงๆเมื่อวันก่อนเพราะฉันต้องการแก้ไขสิทธิ์ เหตุใดจึงไม่มียูทิลิตี้อย่างเป็นทางการในการรีเซ็ตสิทธิ์พื้นฐานไม่ใช่รูทไฟล์และโฟลเดอร์

สคริปต์ใช้ find ถึง 755 โฟลเดอร์ทั้งหมดและ 644 library จากนั้นทดสอบแต่ละไฟล์ด้วย readelf เพื่อดูว่ามีส่วนหัวไบนารี elf หรือไม่ ถ้าไม่ได้ก็จะสแกนในตัวละครทั้งสองเป็นครั้งแรกสำหรับ #!shebang มีอินสแตนซ์เหล่านั้น 755 และ 644 ทุกอย่างหลังจากตรวจสอบเพื่อดูว่าไฟล์มีสิทธิ์จับคู่แล้ว

กรณีพิเศษได้รับการจัดการโดยมีข้อยกเว้นเช่น*.bakไฟล์ที่จะถูกละเว้น

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

ฉันพบโซลูชัน C-shell ที่ง่ายขึ้น สิ่งนี้อาจไม่สามารถพิสูจน์ได้อย่างสมบูรณ์ แต่ควรใช้กับไดเรกทอรีส่วนใหญ่ มันถือว่าคำสั่ง 'ไฟล์' Unix ทำงานและค้นหาไฟล์ exec เพื่อรีเซ็ตพวกเขากลับไปเป็นสิทธิ์ของ 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
สิ่งนี้ไม่เพียงแค่ทำซ้ำคำตอบบางส่วนเท่านั้นมันแนะนำข้อผิดพลาดและฟังก์ชั่นการทำงานที่ OP ไม่ได้ถาม
RalfFriedl

0

ทางเลือกอื่นซึ่งไม่ตอบรับคำขอต้นฉบับอย่างแน่นอน แต่มีแนวโน้มที่สิ่งที่ OP ต้องการคือการระบุสิทธิ์อนุญาตเชิงสัญลักษณ์ เช่นฉันคิดว่า OP ต้องการ "ลบสิทธิ์การเข้าถึงเพื่อเขียนสำหรับสาธารณะและลบสิทธิ์การใช้งานจากไฟล์ทั้งหมด"

สิ่งนี้เป็นไปได้ถ้าคุณใช้การอนุญาตให้ใช้สัญลักษณ์แทน

  • โอ๊ยคือ "ลบการเข้าถึงการเขียนจากสาธารณะ" ("o" - อื่น ๆ , "-" - ลบ, "w" - เขียน)
  • ax คือ "remove execute สำหรับทุกคนในไฟล์เท่านั้น" ("a" - all, "-" - remove, "x" - execute)

เขียนด้วยวิธีนี้แทนการตั้งค่า "0664" โดยชัดแจ้งคุณหลีกเลี่ยงการอนุญาตให้ใช้สิทธิ์เพิ่มเติมไปยังไฟล์ที่ถูกล็อคไว้ก่อนหน้านี้ เช่นหากไฟล์เป็น 0770 จะไม่กลายเป็น 0664 โดยไม่ได้ตั้งใจ

ในการทำข้อกำหนดแรกคุณสามารถใช้chmod:

chmod --recursive o-w $dir

ในการทำข้อกำหนดที่สอง:

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

หรือจะทำทั้งสองอย่าง:

find $dir -type f -exec chmod a-x,o-w {} +
find $dir -type d -exec chmod o-w {} +
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.