ฉันจะค้นหาไฟล์และไดเรกทอรีทั้งหมดที่เขียนได้โดยผู้ใช้ที่ระบุได้อย่างไร


10

ภายใต้ Linux ฉันจะค้นหาไฟล์และไดเรกทอรีทั้งหมดที่สามารถเขียนได้ (หรือที่จริงแล้วไม่สามารถเขียนได้) โดยผู้ใช้รายใด

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


โอเคขอบคุณทุกคนสำหรับคำตอบ ฉันพบวิธีแก้ปัญหา "ค้นหา" ผ่านทาง Google แล้ว แต่สงสัยว่ามีวิธีการใช้งานกับผู้ใช้ที่กำหนดโดยทั่วไปหรือไม่ ดูเหมือนว่าไม่มีวิธีอื่นใดนอกจากเป็น su ในฐานะผู้ใช้จากนั้นเรียกใช้คำสั่ง find - หากไม่มีใครอื่นเข้ามา ฉันจะยอมรับคำตอบของโอฟีเดียนในวันพรุ่งนี้หากไม่มีคำตอบที่ดีกว่านี้
Pistos

คำตอบ:


18

ใช้คำสั่ง 'find' หากคุณติดตั้ง findutils เวอร์ชัน 4.3.0 หรือสูงกว่า:

สำหรับไฟล์ทั้งหมดภายใต้ไดเร็กทอรีปัจจุบันที่ผู้ใช้ปัจจุบันสามารถเขียนได้:

find . -writable

สำหรับไฟล์ทั้งหมดภายใต้ไดเร็กทอรีปัจจุบันที่ผู้ใช้ปัจจุบันไม่สามารถเขียนได้:

find . ! -writable

ตามหน้าคน:

การทดสอบนี้ใช้การเรียกใช้การเข้าถึงระบบ (2) และสามารถถูกหลอกได้โดยเซิร์ฟเวอร์ NFS ซึ่งทำการแมป UID (หรือการรูทสควอช) เนื่องจากระบบจำนวนมากใช้การเข้าถึง (2) ในเคอร์เนลของไคลเอ็นต์และไม่สามารถใช้ประโยชน์ได้ ข้อมูลการแมป UID ที่เก็บไว้บนเซิร์ฟเวอร์


4
แค่คิดว่าฉันจะพูดถึงการแก้ไขเพิ่มเติม: จริง ๆ แล้วฉันต้องทำกับผู้ใช้ที่ไม่มีเชลล์ล็อกอิน (/ sbin / nologin) ในการทำเช่นนั้นฉันใช้ sudo เช่นนี้: sudo -u ไม่มีใครพบ ! เขียนได้
Pistos

สิ่งนี้ไม่ตอบคำถามดังนั้นจึงไม่ควรเป็นคำตอบที่ยอมรับได้ คำถามเกี่ยวกับ "ผู้ใช้เฉพาะ" ไม่ใช่เกี่ยวกับ "ผู้ใช้ปัจจุบัน"
jlh

และเพื่อซ่อนข้อผิดพลาดที่ได้รับอนุญาตถูกปฏิเสธเพิ่ม2>&1 | grep -v "Permission denied"เป็นfind . -writable 2>&1 | grep -v "Permission denied"
iolsmit

3

คุณสามารถสร้างสคริปต์ Perl ( writable.pl) ดังนี้:

#!/usr/bin/perl

use strict;

sub recurse {
  my $path = shift;
  my @files = glob "$path/{*,.*}";
  for my $file (@files) {
    if (-d $file) {
      if ($file !~ /\/\.$/ && $file !~ /\/\.\.$/) {
        recurse($file);
      }
    } else {
      print "$file\n" if -w $file;
    }
  }
}

print "Writable files for " . getlogin() . "\n";
recurse($ARGV[0]);

จากนั้นใช้สคริปต์นี้เป็นรูตดังนี้:

su USERNAME -c "./writable.pl DIRECTORY"

การกรอกUSERNAMEและDIRECTORYตามความเหมาะสม


ยอดเยี่ยม ขอบคุณ. $ ARGV [0] ถูกนำมาเป็นค่าว่างในเชลล์ bash บน CentOS 6.2 ไม่แน่ใจว่าทำไม ฉันแก้ไขสคริปต์เพื่ออ่านจากไฟล์
doon

1

คุณแน่ใจหรือว่าเป็นคำถามที่คุณต้องการถาม

ในการพูดว่า "ฉันต้องการดูไฟล์ทั้งหมดที่บัญชี X สามารถเขียนถึง" หมายความว่าทุกไฟล์ที่พวกเขาเป็นเจ้าของด้วย u + w ทุกไฟล์ที่เป็นเจ้าของโดยกลุ่มใด ๆ ที่พวกเขาอยู่ในกลุ่มนั้นถูกตั้งค่า g + w และทุก ๆ โลกไฟล์เขียนได้ (o + W)

การเขียนไม่ได้จะยิ่งยากขึ้น คุณน่าจะดีกว่าที่จะทำรายชื่อของทุกไฟล์จากนั้นแยกไฟล์ที่สามารถเขียนได้


3
แน่นอนว่ามันซับซ้อนยิ่งขึ้นหากระบบเปิดใช้งาน ACL
Zoredache

2
ไม่นับไฟล์ chattr + i
Matt Simmons

1

สำหรับคำตอบของเอ็ดดี้ถ้าคุณโยน:

my $path = quotemeta shift;

จากนั้นจะสำรวจไดเรกทอรีที่มีช่องว่างในชื่อของพวกเขาเช่นกัน


1

ฉันจะใช้ไวยากรณ์ gnu find สำหรับแฟล็ก -perm ในตัวอย่างนี้:

โดยทั่วไป - หากคุณทิ้งส่วนขยายที่แปลกประหลาดเช่น ACL คุณจะมี 3 chocies - เจ้าของกลุ่มและการเข้าถึงการเขียน "อื่น ๆ " เสียงเหมือนงานสำหรับวง

มีพื้นที่เหลือเฟือให้เพิ่มประสิทธิภาพ แต่ฉันจะปล่อยให้คนอื่น ... นอกจากนี้ฉันไม่สามารถจำรายละเอียดทั้งหมดของการค้นหาและข้ามระบบแฟ้มและเรื่องไร้สาระที่ ตรวจสอบให้แน่ใจว่าผลลัพธ์ของกลุ่มเหมือนกันกับในระบบทดสอบ linux ของฉัน

$ groups snoopy
snoopy : snoopy doghouse linus admin wwI woodstock
$

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

#!/bin/sh

user=snoopy

directory=/

# first files owned by the user and writable
find "$directory" -follow -user "$user" -perm /u+w 2> /dev/null


# now for files that are group writable with the user in that group
for groups in $(groups snoopy 2> /dev/null | cut -f2 -d:)
do
  find "$directory" -follow -group "$user" -perm /g+w 2> /dev/null
done

# now for everything else
find "$directory" -follow -perm /o+w 2> /dev/null

1

คำสั่งนี้ควรค้นหาไดเรกทอรีที่เขียนได้ทั้งหมดคุณสามารถเปลี่ยนการอนุญาตตามที่เห็นสมควร:

find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;

0

ฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดหรือไม่ แต่ควรทำในสิ่งที่คุณถาม:

for file in *
do 
    if [ -w $file ] ; then 
        echo $file
    fi
done

กุญแจเป็นของหลักสูตรในการ-wสลับซึ่งยังสามารถ negated

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


แน่นอนคุณต้องเรียกใช้สคริปต์นี้ในฐานะผู้ใช้รายนั้น
Eddie

ใช่คิด ...
Slartibartfast

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