मैं लिनक्स में एक निश्चित निर्देशिका के तहत केवल निष्पादन योग्य फाइलें कैसे पा सकता हूं?


156

मैं लिनक्स में एक निश्चित निर्देशिका के तहत केवल निष्पादन योग्य फाइलें कैसे पा सकता हूं?


यहाँ BASH स्क्रिप्ट का एक प्रकार है, यह बुरा नहीं है कि मैं क्या कह सकता हूं :) stackoverflow.com/a/20209457/2067125
AjayKumarBasuthkar

मानक fileकमांड का उपयोग करने के बारे में क्या ?
निर्णायक

4
मैक पर ऐसा करने के इच्छुक किसी भी व्यक्ति के लिए (OS X 10.9.5 पर परीक्षण किया गया): ls -l | egrep '^[^d]..x..x..x.*$' उपरोक्त वर्तमान निर्देशिका में सभी निष्पादक (सभी / उपयोगकर्ता और समूह के लिए) को सूचीबद्ध करेगा। नोट : -executableविकल्प मैक पर काम नहीं करता है इसलिए उपरोक्त वर्कअराउंड।
टेकफोबार


1
@techfoobar: प्रश्न अस्पष्ट है: क्या इसका मतलब उन फ़ाइलों से है जिनमें निष्पादन योग्य कोड है, या क्या इसका अर्थ उन फ़ाइलों से है जिनमें निष्पादन योग्य अनुमति है? लेकिन भले ही हम यह मान लें कि निष्पादन योग्य अनुमति वह है जो चाहता है (जैसा कि अधिकांश प्रतिक्रियाएं लगती हैं), सवाल दुनिया-निष्पादन योग्य नहीं कहता है । आपके समाधान में फ़ाइलें मिलेंगी (और साथ ही फ़ॉरो, सॉकेट्स, सिमलिंक, आदि) जिनके पास दुनिया की अनुमति है, लेकिन 750 ( -rwxr-x---) नहीं है, जो अभी भी कुछ उपयोगकर्ताओं के लिए निष्पादन योग्य है।
जी-मैन

जवाबों:


157

निष्पादन योग्य फ़ाइलों के लिए जाँच की जा सकती है -perm(अनुशंसित नहीं) या -executable(अनुशंसित, क्योंकि यह ACL को ध्यान में रखता है)। -executableविकल्प का उपयोग करने के लिए :

find <dir> -executable

यदि आप केवल निष्पादन योग्य फ़ाइलों को खोजना चाहते हैं और खोज योग्य निर्देशिकाओं को नहीं चाहते हैं, तो उनके साथ गठबंधन करें -type f:

find <dir> -executable -type f

23
शेबबैंग का मतलब यह नहीं है कि वे निष्पादन योग्य हैं। यह केवल हमें बताता है कि किस दुभाषिया का उपयोग करना है। और Linux परिभाषा द्वारा "निष्पादन योग्य फाइलें" निष्पादन योग्य (x) बिट सेट के साथ फाइल होती हैं
knittl

2
खोज का कौन सा संस्करण उस प्रकार का समर्थन करता है-प्रकार? आदमी मेरे सिस्टम पर बी, सी, डी, पी, एफ, एल, एस और डी की सूची पाता है।
इन्नाएम

2
यहाँ भी, मेरे खोज में -type xया तो नहीं है ।
davr

7
यदि आपके पास खोज का पुराना संस्करण है (शायद 4.3.8 से पहले) जिसमें अनुपयोगी उपयोग का अभाव है। -स्पर्म / यू = एक्स, जी = एक्स, ओ = एक्स।
लुडविग वेन्ज़िएल

8
find: invalid predicate -executable'आरएचईएल पर
एसएसएच यह

33

खोज के -permविकल्प का उपयोग करें । यह वर्तमान निर्देशिका में ऐसी फ़ाइलें पाएँगे जो या तो उनके स्वामी द्वारा, समूह के सदस्यों द्वारा या दूसरों द्वारा निष्पादित की जाती हैं:

find . -perm /u=x,g=x,o=x

संपादित करें:

मुझे अभी एक और विकल्प मिला है जो कम से कम जीएनयू में मौजूद है 4.4.0 खोजें:

find . -executable

यह और भी बेहतर काम करना चाहिए क्योंकि ACL को भी माना जाता है।


2
यह केवल खोज के नए संस्करण पर काम करता है। जो CentOS के साथ डिफ़ॉल्ट रूप से आता है वह त्रुटि देता है find: invalid mode / u = x, g = x, o = x'`
davr

12
फिर आपको "-perm +" संस्करण का प्रयास करना चाहिए जो अब GNU खोज में पदावनत हो गया है: खोजें। -स्पर्म +111 "
innaM

लगता -perm /111है कि सबसे पोर्टेबल संस्करण हो सकता है।
स्कॉट

12

मुझे पता है कि प्रश्न में विशेष रूप से लिनक्स का उल्लेख है, लेकिन चूंकि यह Google पर पहला परिणाम है, मैं सिर्फ उस उत्तर को जोड़ना चाहता था जो मैं देख रहा था (उदाहरण के लिए यदि आप हैं - इस समय मेरे जैसे - आपके नियोक्ता द्वारा गैर-जीएनयू का उपयोग करने के लिए मजबूर किया गया। / लिनक्स सिस्टम)।

MacOS 10.12.5 पर परीक्षण किया गया

find . -perm +111 -type f

1
RHEL 5 में भी काम करता है।
जोस टॉमस टोचीनो

यह एकमात्र संस्करण है जिसे मैं OS X 10.14, thx
जस्टिन

3

मेरे पास एक और दृष्टिकोण है, इस मामले में कि आप वास्तव में क्या चाहते हैं, बस निष्पादन योग्य फाइलों के साथ कुछ करना है - और जरूरी नहीं कि वास्तव में खुद को फ़िल्टर करने के लिए मजबूर करें:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

मुझे यह पसंद है क्योंकि यह इस बात पर निर्भर नहीं करता है कि -executableकौन सा प्लेटफ़ॉर्म विशिष्ट है; और यह निर्भर नहीं करता है कि -permकौन सा बिटकॉइन है, एक बिट प्लेटफॉर्म विशिष्ट है, और जैसा कि ऊपर लिखा गया है फ़ाइल को सभी के लिए निष्पादन योग्य होना चाहिए (न केवल आप)।

यह -type fमहत्वपूर्ण है क्योंकि * निक्स निर्देशिकाओं को ट्रैवर्सेबल होने के लिए निष्पादन योग्य होना चाहिए, और क्वेरी में findजितना अधिक कमांड होगा, आपकी मेमोरी उतनी ही अधिक कुशल होगी।

किसी भी तरह, बस एक और दृष्टिकोण की पेशकश, क्योंकि * निक्स एक अरब दृष्टिकोण की भूमि है।


(०) आप किसे पसंद करते हैं, रहस्यमय और सही या सहज और त्रुटिपूर्ण? मैं सही पसंद करता हूं। (1)  innaM का उत्तर , विशेषता find -perm, उन फ़ाइलों को ढूंढता है जिनके पास किसी भी निष्पादित अनुमति बिट सेट है। (२) इसके विपरीत, यह उत्तर केवल उन्हीं फाइलों को खोजता है जिनके लिए वर्तमान उपयोगकर्ता ने अनुमति दी है। दी, जो ओपी चाहता है वह हो सकता है, लेकिन यह अस्पष्ट है। … (Cont'd)
स्कॉट

(जारी) ... (3) स्पष्टता के लिए, आप बदलना चाहते हो सकता है `…`के लिए $(…)- देखना यह , यह , और यह । (४) लेकिन मत करो for i in $(find …); do …; यह उन फ़ाइलनामों पर विफल होता है जिनमें स्थान होते हैं। इसके बजाय, करो find … -exec …। (५) और, जब आप शेल चरों के साथ काम करते हैं, तो हमेशा उन्हें (दोहरे कोट्स में) तब तक उद्धृत करें जब तक आपके पास कोई अच्छा कारण न हो, और आपको यकीन है कि आप जानते हैं कि आप क्या कर रहे हैं।
स्कॉट

@ ठीक है, मैं सही खड़ा हूं :) मैंने -permतर्क को तीनों की आवश्यकता के रूप में पढ़ा , उनमें से एक नहीं। इसके अलावा, शेल तर्कों की सुरक्षा के लिए इनपुट के लिए धन्यवाद, यह वह सब सामान है जिसकी मुझे जानकारी नहीं थी।
मार्क मैककेना

@MarkMcKenna आपके पास एक टाइपो है: for i in खोजें। -प्रकार f ; do [ -x $i ] && echo "$i is executable"; done; आपको <dir> भाग याद आ रहा है, जिसे मैं
Devy

2

निष्पादन योग्य की आवश्यकता वाली एक फ़ाइल निष्पादन योग्य या लोड करने योग्य फ़ाइल या ऑब्जेक्ट नहीं होनी चाहिए।

यहाँ मेरा उपयोग है:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

2
यह क्या करता है?
डेरामाइक

@DerMike, यह वर्तमान निर्देशिका में निष्पादन योग्य खोजने के तरीकों में से एक है, जिसमें .so फाइलें भी शामिल हैं, भले ही कोई फ़ाइल निष्पादन योग्य चिह्नित न हो, वह खोज सकता है।
अजयकुमारबसुथकर

खैर, मेरा मतलब है, यह कैसे करता है?
डेरिकाइक

यह खोज करने के लिए फ़ाइल के हेडर से पढ़ता है, प्रत्येक बाइनरी फ़ाइल या स्क्रिप्ट फ़ाइल में हेडर होता है।
अजयकुमारबसुथकर

जहां तक ​​मुझे पता है, -name "*"इसका कोई प्रभाव नहीं है find- यह आम तौर पर उन सभी फाइलों को ढूंढता है जिन्हें परीक्षणों द्वारा समाप्त नहीं किया गया है।
जी-मैन

1

एक लाइनर के एक प्रशंसक के रूप में ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

खोज कमांड से आउटपुट लेने के लिए 'xargs' का उपयोग करना (प्रिंट0 का उपयोग करके यह सुनिश्चित करने के लिए कि रिक्त स्थान के साथ फ़ाइल नाम सही तरीके से संभाला जाता है)। अब हमारे पास फ़ाइलों की एक सूची है जो निष्पादन योग्य हैं और हम उन्हें 'फाइल' कमांड के पैरामीटर के रूप में एक-एक करके प्रदान करते हैं। तब बायनेरिज़ की उपेक्षा करने के लिए ASCII शब्द के लिए grep। कृपया यह पायें कि आप किस शैली को पसंद करते हैं (पहले के उत्तर देखें) या आपके OS NIX OS ’पर क्या काम करता है, इसके साथ कमांड-विकल्प उपलब्ध करें

मुझे उपर्युक्त आवश्यक है कि रूट के स्वामित्व वाली लिपियों में eval के साथ फाइलें मिलें, इसलिए निजी वृद्धि कमजोरियों को खोजने में मदद करने के लिए निम्नलिखित बनाया, जहां रूट उपयोगकर्ता असुरक्षित मापदंडों के साथ स्क्रिप्ट चलाता है ...

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &

यदि स्क्रिप्ट में गैर-ASCII वर्ण हैं, तो यह काम नहीं करेगा। fileएन्कोडिंग की रिपोर्ट करता है, इसलिए एक अजगर स्क्रिप्ट को रिपोर्ट किया जा सकता है a /usr/bin/python script, UTF-8 Unicode text executablefind ... | xargs file -b | grep -v '^ELF'गैर-बायनेरिज़ को हाजिर करने के लिए बेहतर काम कर सकता है।
ज़ेनॉइड

0

मैंने ~/.bashrcसिस्टम पथ में नहीं निष्पादन योग्य फ़ाइलों को खोजने के लिए आज रात में एक समारोह बनाया और निर्देशिका नहीं:

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
        &&  echo "executable: $1"'  _  {}
} # xlocate ()

इसका फायदा यह है कि तीन लिनक्स डिस्ट्रोस और एक सेकंड के तहत विंडोज इंस्टॉलेशन खोजा जाएगा जहां findकमांड में 15 मिनट लगते हैं।

उदाहरण के लिए:

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real    0m0.504s
user    0m0.487s
sys     0m0.018s

या एक पूरी निर्देशिका के लिए और यह सब है:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real    0m0.741s
user    0m0.705s
sys     0m0.032s
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.