วิธีคืนค่าความเป็นเจ้าของกลุ่ม / ผู้ใช้เริ่มต้นของไฟล์ทั้งหมดภายใต้ / var?


13

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


2
แก้ไขแล้วเนื่องจากคำถามทั่วไปของคุณซ้ำกับchownคำสั่งวิธีการย้อนกลับอย่างแน่นอนหรือไม่ และจะถูกปิด
jw013

ดูเหมือนว่ามีวิธีการแก้ไขเช่นนี้แต่ไม่เพียง แต่สำหรับ / var และไม่เพียง แต่สำหรับการกระจายตามรอบต่อนาที
sepehr

คุณใช้ distro ตัวใด
Derobert

@derobert การทดสอบ debian aka
wheezy

คำตอบ:


6

คล้ายกับหนึ่งในคำตอบข้างต้นหากคุณมีสำเนาของไดเรกทอรีที่มีสิทธิ์ที่ถูกต้องชื่อ "var" ในไดเรกทอรีท้องถิ่นของคุณคุณสามารถใช้สองคำสั่งต่อไปนี้เพื่อเรียกคืนสิทธิ์ไปยังไดเรกทอรี / var

sudo find var -exec chown --reference="{}" "/{}" \;
sudo find var -exec chmod --reference="{}" "/{}" \;

10

คำตอบที่ง่ายที่สุด (และอาจถูกต้องที่สุด) คือ "คุณไม่สามารถทำได้" แต่ถ้าคุณต้องการลองนี่เป็น bash script ที่จะแก้ไขสิทธิ์ของไฟล์ภายใต้ / var ที่อยู่ในแพ็คเกจ. deb

หมายเหตุ:

  • มันจะไม่แก้ไข perms สำหรับไฟล์ที่ไม่ใช่ของแพ็คเกจ
  • มันจะไม่แก้ไข perms สำหรับไฟล์ที่แพ็กเกจไม่สามารถดาวน์โหลดได้โดย apt-get - เช่นแพคเกจดั้งเดิมหรือของบุคคลที่สาม
  • AFAIK ไม่มีไฟล์ในแพ็คเกจ debian มีแท็บในชื่อไฟล์ดังนั้นฉันจึงใช้ TAB เป็น IFS สำหรับลูปที่อ่านแล้ว ฉันได้ตรวจสอบ Contents-amd64.gz และ Contents-i386.gz เพื่อดูเดเบียนและยืนยันว่าไม่มีแท็บ แต่แพ็คเกจของบุคคลที่สามอาจมีบางอย่าง

สคริปต์ทำงานโดยสร้างรายการแพคเกจที่ติดตั้งซึ่งมีไฟล์ใน var ดาวน์โหลดแพ็คเกจเหล่านั้นและใช้dpkg-deb -cเพื่อค้นหาว่าสิทธิ์ควรเป็นอะไร

ส่วนที่ยากที่สุดคือการเขียนฟังก์ชั่นการแปลงสตริงการอนุญาต (ที่แสดงโดยls -lหรือtar v) เป็นโหมดตัวเลขฐานแปดรวมถึงการจัดเลี้ยงสำหรับ setuid, setgid และเหนียวบิต .... บางสิ่งที่ง่ายต่อการเขียนด้วยอัลกอริทึมที่ดี ในพูดว่า Perl เป็นปัญหามากเกินไปในการทุบตีดังนั้นมันง่ายกว่าที่จะบังคับให้มันดุร้าย

ในที่สุดสคริปต์จะถูกเขียนให้อยู่ในโหมด "debug-mode" หรือ "dry-run" หากต้องการเปลี่ยนเจ้าของ / กลุ่ม / perms ให้ใส่ความคิดเห็นหรือลบสองบรรทัดด้วย__EOF__เครื่องหมายเอกสารที่นี่

#! /bin/bash

perm_string_to_mode() {
  string="$1"
  let perms=0

  [[ "${string}" = ?r???????? ]] && perms=$(( perms +  400 ))
  [[ "${string}" = ??w??????? ]] && perms=$(( perms +  200 ))
  [[ "${string}" = ???x?????? ]] && perms=$(( perms +  100 ))
  [[ "${string}" = ???s?????? ]] && perms=$(( perms + 4100 ))
  [[ "${string}" = ???S?????? ]] && perms=$(( perms + 4000 ))
  [[ "${string}" = ????r????? ]] && perms=$(( perms +   40 ))
  [[ "${string}" = ?????w???? ]] && perms=$(( perms +   20 ))
  [[ "${string}" = ??????x??? ]] && perms=$(( perms +   10 ))
  [[ "${string}" = ??????s??? ]] && perms=$(( perms + 2010 ))
  [[ "${string}" = ??????S??? ]] && perms=$(( perms + 2000 ))
  [[ "${string}" = ???????r?? ]] && perms=$(( perms +    4 ))
  [[ "${string}" = ????????w? ]] && perms=$(( perms +    2 ))
  [[ "${string}" = ?????????x ]] && perms=$(( perms +    1 ))
  [[ "${string}" = ?????????t ]] && perms=$(( perms + 1001 ))
  [[ "${string}" = ?????????T ]] && perms=$(( perms + 1000 ))

  echo $perms
}

# generate a list of installed packages that have files etc in /var
grep -l /var/ /var/lib/dpkg/info/*.list  | \
  sed -e 's:/var/lib/dpkg/info/::' -e 's/\.list$//' | \
  xargs dpkg -l | \
  awk '/^[hi]/ {print $2}' > /tmp/packages.list

# clean out the apt cache, so we only have one version of each package
apt-get clean

# download the packages as if we were going to reinstall them
# NOTE: packages which are no longer available for download
# will not have their permissions fixed.  apt-get will complain about
# those packages, so you can get a list by redirecting or tee-ing the
# output of this script.
xargs apt-get -y -d -u --reinstall install < /tmp/packages.list

for pkg in $(cat /tmp/packages.list) ; do
   PKGFILE="/var/cache/apt/archives/${pkg}_*.deb"

   if [ -e $PKGFILE ] ; then

     dpkg-deb -c /var/cache/apt/archives/${pkg}_*.deb | \
       awk '/\.\/var\// {print $1, $2, $6}' | \
       sed -e 's/ /\t/' -e 's/ /\t' | \
       while IFS=$'\t' read permstring ownergroup filename ; do
          # don't change owner/group/perms on symlinks
          if ! [[ "${permstring}" =~ ^l ]] ; then
            mode=$(perm_string_to_mode $permstring)
            # change "owner/group" to "owner:group" for chown
            ownergroup=${ownergroup//\//:}
            # remove leading '.' from filename
            filename=${filename#?}
cat <<__EOF__
            chown "$ownergroup" "$filename"
            chmod "$mode" "$filename"
__EOF__ 
         fi
       done
     echo
   fi
done

แน่นอนว่าสคริปท์นั้นสามารถปรับเปลี่ยนได้อย่างง่ายดายเพื่อแก้ไข perms ของไฟล์แพ็กเกจในไดเรกทอรีอื่น ๆ หรือในทุกไดเร็กทอรี

สคริปต์นี้จะง่ายกว่านี้มากหากไฟล์ $ packagename.list ที่/var/lib/dpkg/infoมีเจ้าของกลุ่มและเลขฐานแปดรวมถึงชื่อไฟล์ ... แต่ไม่มี


1
ดี นอกจากนี้คุณอาจจะไม่สามารถที่จะเปลี่ยน grep ของคุณผ่าน .list * dpkg -S /varพร้อม dpkg-statoverride --list '/var/*'นอกจากนี้หลังจากการใช้สคริปต์นี้หนึ่งในความต้องการที่จะตรวจสอบ
Derobert

จริง แต่dpkg -Sช้า (ซึ่งเป็นเหตุผลที่ฉันเขียนdlocate) จุดดีเกี่ยวกับdpkg-statoverride.... และรูปแบบผลลัพธ์สมบูรณ์แบบ
cas

1
ขอบคุณสำหรับสคริปต์ มีการพิมพ์ผิดในหนึ่งใน sed invocations ที่ว่างเปล่าเปลี่ยนเป็นแท็บมันหายไป '/' สุดท้าย (และในขณะที่เราอยู่ที่นี่ทำไมไม่เพียงแค่เขียน: sed -e 's / + / \ t / g' | \
Chelmite

3

คุณทำได้

ติดตั้งการแจกจ่ายแบบเดียวกันบนเครื่องอื่นหรือ VM และใช้การchmod --referซิงโครไนซ์สิทธิ์/var


1

คำตอบง่ายๆคือ "คุณไม่สามารถ"

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

อีกวิธีหนึ่งที่ยุ่งยากกว่าคือคุณสามารถเมานต์ / var ที่อุปกรณ์อื่นและโปรแกรมจะสร้างไดเรกทอรีที่หายไปอีกครั้ง

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