ฉันบังเอิญ chmod -R + x ในไดเรกทอรี ฉันจะคืนค่าสิทธิ์ที่ถูกต้องได้อย่างไร


20

chmod -R 755ดีที่จะเฉพาะเจาะจงก็คือ ตอนนี้ทุกไฟล์สามารถใช้งานได้ซึ่งฉันไม่ต้องการ ฉันคิดว่าฉันควรดูสองไบต์แรกของแต่ละไฟล์เพื่อหา#!แต่สิ่งนี้จะครอบคลุมทุกอย่างหรือไม่ ฉันควรใช้fileเพื่อดูทุกสิ่งและตัดสินใจบนพื้นฐานนั้นแทนหรือไม่ หรือมีโอกาสมากขึ้นที่จะมีวิธีที่ดีกว่านี้?

เป็นวิธีที่ต้องการในการเรียกซ้ำผ่านไดเรกทอรีและตั้งค่า -x ในไฟล์ที่ไม่ควรจะ 'ปฏิบัติการ' คืออะไร?


คุณทำสิ่งนี้ที่/หรือในไดเรกทอรีอื่นหรือไม่?
gvkv

1
@gvkv: ไม่ใช่/ไดเรกทอรีที่ฉันเป็นเจ้าของอย่างสมบูรณ์
Larry Wang

1
@ แลร์รี่ในอนาคตคุณควรใช้ตัวแปร + x มากกว่าการข่มขืนสิทธิ์ทั้งหมดและอาจทำให้เขียนไฟล์ทั้งหมดได้
xenoterracide

@xenoterracide: เห็นด้วย สิ่งที่ฉันต้องการจริงๆคือให้สิทธิ์แบบกลุ่มเหมือนกับฉัน (ซึ่งจบลงด้วยการเกิดขึ้น!) ฉันแค่คิดไม่พอก่อนที่ฉันจะพิมพ์
Larry Wang

เราพูดถึงไฟล์กี่ไฟล์? ควรปฏิบัติการได้กี่ตัว? มีวิธีบอกจากชื่อไฟล์หรือไม่?
David Thornley

คำตอบ:


15

ไม่มีสัญลักษณ์เวทมนต์ที่นี่ สิทธิ์ดำเนินการข้อมูลที่ไม่ซ้ำซ้อนเสมอ

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

ในไดเรกทอรีต่อผู้ใช้คุณต้องกังวลเกี่ยวกับไฟล์ที่ไม่ควรอ่านได้ทั่วโลก ไม่มีใครช่วยคุณได้

สำหรับความสามารถในการปฏิบัติงานกฎข้อที่ดีก็คือการทำให้ทุกอย่างที่ดูเหมือนจะไม่ถูกประหาร เคอร์เนลสามารถเรียกใช้งานสคริปต์ที่มีสองไบต์แรกคือ#!ELF ไบนารีที่มีสี่ไบต์แรก\x7fELFโดยที่\x7fเป็นไบต์ที่มีค่า 12 และประเภทไฟล์ rarer น้อย (a.out สิ่งที่ลงทะเบียนด้วยbinfmt_misc) ดังนั้นคำสั่งต่อไปนี้ควรคืนค่าการอนุญาตของคุณให้อยู่ในสถานะที่เหมาะสม (สมมติว่าทุบตี 4 หรือ zsh มิฉะนั้นใช้findเพื่อสำรวจทรีไดเรกทอรี, คำเตือน, พิมพ์ลงในเบราว์เซอร์โดยตรง):

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

โปรดทราบว่ามีวิธีง่าย ๆ ในการสำรองและคืนค่าสิทธิ์ของแผนผังไดเรกทอรีบน Linux และอาจรวมถึง Unices อื่น ๆ ที่มีการสนับสนุน ACL:

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

ขอบคุณ! โชคดีที่ฉันคิดว่าทุกอย่างตกอยู่ในสองประเภทนี้ หากสิ่งนี้หายไปฉันสามารถจัดการกับมันได้ในภายหลัง
Larry Wang

จำไว้ว่าต้องใช้**/* globstar
Chris Down

ฉันขอแนะนำการเปลี่ยนแปลงสองครั้งสำหรับสคริปต์นี้ หนึ่งใช้findมากกว่า globstar; สองแทนที่จะมองที่หัวให้ใช้fileคำสั่งเพื่อดูว่ามันคืออะไรและแยกจากที่นั่น
Shadur

@Shadur findมีความน่าเชื่อถือน้อยกว่าglobstar, globstarเป็นที่นิยมในเกือบทุกกรณี
Chris Down

1
@Gilles ชอบได้ดีกว่าใน "ถ้าคุณมีมันมันยอดเยี่ยมกว่า" ไม่เพียง แต่จะเร็วกว่า แต่ยังมีความน่าเชื่อถือมากกว่า (และไม่มี SNAFUs ที่ไม่คาดคิด)
Chris Down

6

ฉันเชื่อว่าคุณจะต้องการอะไรเช่นนี้

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

สิ่งนี้จะค้นหาไฟล์ปกติทั้งหมดซ้ำ ๆ ใน dir (ยกเว้นไดเรกทอรีและอุปกรณ์) และลบบิตที่เรียกใช้งานได้

ฉันจะเริ่มต้นที่นี่จากนั้นจึงหาทางสร้างไฟล์ที่สามารถเรียกใช้งานได้และปฏิบัติการได้

ต่อไปนี้ควรจะทำงานได้ตามที่คุณขอ (มันจะหาไฟล์ปกติทั้งหมด, grep พวกเขาสำหรับ #! แล้วเอาบิต x ถ้าไม่พบ)

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

อาจเป็นรุ่นที่ดีกว่าของข้างต้น (ท่อน้อยลง)

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

3
ทำgrep -L '^#!'อย่างน้อย (จำเป็นต้องมีเครื่องหมายคำพูดและ^จำกัด การจับคู่ที่จุดเริ่มต้นของบรรทัด) แต่ก็ยังอนุญาตได้มากเกินไปเมื่อ#!เทียบกับบรรทัดใด ๆ การใช้xargsจะล้มเหลวด้วยชื่อไฟล์ที่มีช่องว่างหรือข้อความที่อ้างถึง; ใช้xargs -d '\n'(ต้องใช้ GNU xargs)
Gilles 'หยุดชั่วร้าย'

0

ดีโดยไม่ต้องใช้สาย shebang, /bin/shไฟล์จะถูกดำเนินการตามสคริปต์เปลือกนามกับ คุณคิดว่าเป็นการเริ่มต้นที่ดีและด้วยข้อสันนิษฐานที่ว่าไดเรกทอรีที่เป็นปัญหานั้นไม่มีไฟล์ภารกิจที่มีความสำคัญซึ่งอาจไม่มีความเสี่ยงในการเรียกใช้งานบางอย่างgrepและchmodคอมโบ คุณอาจพบกับผลบวกปลอมเช่นไฟล์ที่มีเส้น Shebang ที่ไม่ได้ตั้งใจให้มีบิตที่สามารถเรียกใช้งานได้ แต่ไม่ทราบข้อมูลเพิ่มเติมเกี่ยวกับจุดประสงค์ของสิ่งที่อยู่ในไดเรกทอรีคุณเพียงคนเดียวเท่านั้นที่สามารถตัดสินใจได้ว่า ระบบและ / หรือข้อมูล


ฉันไม่ได้กังวลมากเกี่ยวกับผลบวกปลอมว่าเป็นเชิงลบที่ผิด #!มีไบนารีที่ฉันไม่คิดว่าเริ่มต้นด้วยการเป็น
Larry Wang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.