मैं किसी विशिष्ट उपयोगकर्ता द्वारा सभी फ़ाइलों और निर्देशिकाओं को कैसे योग्य पाता हूं?


10

लिनक्स के तहत, मैं उन सभी फ़ाइलों और निर्देशिकाओं को कैसे ढूँढ सकता हूं जो एक विशेष उपयोगकर्ता द्वारा (या वास्तव में, लेखन योग्य नहीं हैं)।

संपादित करें: स्पष्ट करने के लिए, मेरा मतलब एक विशेष उपखंड के तहत था, न कि सिस्टमवाइड। और हां, इसका मतलब है कि उपयोगकर्ता, समूह और विश्व लेखन की सभी क्रमपरिवर्तन और संयोजन जो उस उपयोगकर्ता को लिखने की अनुमति देगा। मुझे पता है कि प्रश्न क्या शब्दार्थ में प्रवेश करता है, मैं इन फ़ाइलों की सूची प्राप्त करने के लिए एक या कुछ-लाइनर निष्पादित करने की उम्मीद कर रहा था।


ठीक है, जवाब के लिए सभी का धन्यवाद। मुझे पहले से ही "खोज" समाधान Google के माध्यम से मिला, लेकिन सोच रहा था कि क्या किसी दिए गए उपयोगकर्ता पर उदारतापूर्वक इसे लागू करने का कोई तरीका है। ऐसा लगता है कि उपयोगकर्ता के रूप में सु के अलावा कोई अन्य तरीका नहीं है, फिर खोज कमांड को चलाएं - जब तक कि किसी और में झंकार न हो? मैं किसी भी बेहतर प्रतिक्रिया को रोकते हुए कल ओफिडियन के जवाब को स्वीकार करूंगा।
पिस्टन

जवाबों:


18

यदि आपके पास 4.3.0 या इससे अधिक स्थापित संस्करण है, तो 'खोज' कमांड का उपयोग करें:

वर्तमान निर्देशिका के अंतर्गत सभी फ़ाइलों के लिए जो वर्तमान उपयोगकर्ता द्वारा लिखित हैं:

find . -writable

वर्तमान निर्देशिका के अंतर्गत सभी फ़ाइलों के लिए जो वर्तमान उपयोगकर्ता द्वारा लिखने योग्य नहीं हैं:

find . ! -writable

मैन पेज के अनुसार:

यह परीक्षण एक्सेस (2) सिस्टम कॉल का उपयोग करता है, और इसलिए इसे NFS सर्वरों द्वारा बेवकूफ बनाया जा सकता है जो UID मैपिंग (या रूट-स्क्वैशिंग) करते हैं, क्योंकि कई सिस्टम क्लाइंट के कर्नेल में एक्सेस (2) लागू करते हैं और इसलिए सामग्री का उपयोग नहीं कर सकते हैं सर्वर पर आयोजित यूआईडी मैपिंग की जानकारी।


4
बस सोचा था कि मैं आगे के संस्करण का उल्लेख करूंगा: मुझे वास्तव में ऐसा उपयोगकर्ता के साथ करना था, जिसके पास लॉगिन शेल (/ sbin / nologie) नहीं था। ऐसा करने के लिए, मैंने sudo का उपयोग किया, इस तरह: sudo -u कोई भी नहीं मिला। ! -लेखक
पिस्तोस

यह प्रश्न का उत्तर नहीं देता है और इसलिए स्वीकृत उत्तर नहीं होना चाहिए। सवाल "किसी विशेष उपयोगकर्ता" के बारे में था, न कि "वर्तमान उपयोगकर्ता" के बारे में।
jlh

और अनुमति को अस्वीकार करने के लिए त्रुटियों को छिपाने के 2>&1 | grep -v "Permission denied"लिएfind . -writable 2>&1 | grep -v "Permission denied"
iolsmit

3

आप 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] सेंटोस 6.2 पर बाश शेल में खाली के रूप में लिया जाता है। यकीन नहीं है कि क्यों। मैंने एक फाइल से पढ़ने के लिए स्क्रिप्ट को संशोधित किया।
दून

1

क्या आप सुनिश्चित हैं कि वास्तव में वह प्रश्न है जो आप पूछना चाहते हैं?

कहने के लिए "मैं उन सभी फ़ाइलों को देखना चाहता हूं जो एक्स खाता लिख ​​सकते हैं" का अर्थ है कि उनके पास प्रत्येक फ़ाइल u + w के पास है, प्रत्येक फ़ाइल जो किसी समूह के स्वामित्व वाली है, जो कि g + w सेट है, और प्रत्येक फ़ाइल विश्व के लिए उपयुक्त है (ओ + डब्ल्यू)।

नहीं लेखन भी कठिन होगा। आप हर फ़ाइल की एक सूची बनाना बेहतर होगा, फिर उन लोगों को बाहर कर दें जिन्हें वे लिख सकते हैं।


3
बेशक यह और भी जटिल है अगर सिस्टम में एसीएल सक्षम है।
ज़ोड़ेचे

2
चैट + मत की गिनती मत करो
मैट सिमन्स

1

एडी के जवाब के लिए अगर आप में फेंक देते हैं:

my $path = quotemeta shift;

फिर यह उनके नाम के साथ ही रिक्त स्थान के साथ निर्देशिकाओं को पार करेगा।


1

मैं इस उदाहरण में -perm फ्लैग के लिए gnu फाइंड सिंटैक्स का उपयोग करूँगा:

मूल रूप से - यदि आप ACLs जैसे निराला एक्सटेंशन को निकालते हैं, तो आपको 3 चॉइस - स्वामी, समूह, और "अन्य" एक्सेस प्राप्त होती है। एक लूप के लिए एक नौकरी की तरह लगता है।

इसे ऑप्टिमाइज़ करने के लिए बहुत जगह है लेकिन मैं इसे किसी और के पास छोड़ दूँगा ... इसके अलावा, मैं फाइलसिस्टम को खोजने और पार करने के सभी विवरणों को कभी भी याद नहीं रख सकता हूं और यह बकवास है। इसके अलावा, यह सुनिश्चित कर लें कि समूहों का आउटपुट मेरे टेस्ट लिनक्स सिस्टम पर समान है

$ 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स्विच में है, जिसे नकारात्मक भी किया जा सकता है

संपादित करें: इसके बारे में अधिक सोचने पर, यह स्क्रिप्ट वर्तमान उपयोगकर्ता द्वारा लिखने योग्य है, यह स्पष्ट रूप से कुछ दिए गए उपयोगकर्ता के लिए काम नहीं करेगा।


बेशक, आपको इस स्क्रिप्ट को उस उपयोगकर्ता के रूप में चलाना होगा।
एडी

हाँ, लगा ...
Slartibartfast

आप इसे पर्ल में कैसे लिखेंगे?
ईलोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.