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


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


129
2017-09-10 11:56


मूल


यहां एक प्रकार की बाश लिपि है, यह बुरा नहीं है जो मैं कह सकता हूं :) stackoverflow.com/a/20209457/2067125 - AjayKumarBasuthkar
मानक का उपयोग करने के बारे में क्या file आदेश? - Breakthrough
किसी को भी ऐसा करने के लिए चाहते हैं मैक (ओएस एक्स 10.9.5 पर परीक्षण): ls -l | egrep '^[^d]..x..x..x.*$'  उपर्युक्त वर्तमान निर्देशिका में सभी निष्पादन योग्य (सभी / उपयोगकर्ता और समूह के लिए) सूचीबद्ध करेगा। ध्यान दें: द -executable विकल्प मैक पर काम नहीं करता है इसलिए उपर्युक्त कामकाज। - techfoobar
यह भी प्रासंगिक है: यूनिक्स ढूंढें: निष्पादन योग्य फ़ाइलों की खोज करें - Slothworks
@techfoobar: प्रश्न संदिग्ध है: क्या इसका अर्थ यह है कि निष्पादन योग्य कोड वाली फाइलें हैं, या क्या इसका अर्थ यह है कि निष्पादन योग्य अनुमति है? लेकिन अगर हम मानते हैं कि निष्पादन योग्य अनुमति वांछित है (जैसा कि अधिकांश प्रतिक्रियाएं प्रतीत होती हैं), सवाल यह नहीं कहता है विश्व निष्पादन। आपके समाधान में फाइलें मिलेंगी (और फीफो, सॉकेट, सिम्लिंक इत्यादि) जिनके पास विश्व निष्पादन अनुमति है, लेकिन 750 नहीं (-rwxr-x---), जो अभी भी कुछ उपयोगकर्ताओं के लिए निष्पादन योग्य है। - G-Man


जवाब:


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

find <dir> -executable

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

find <dir> -executable -type f

133
2017-09-10 11:59



एक शेबांग का मतलब यह नहीं है कि वे निष्पादन योग्य हैं। यह हमें केवल दुभाषिया का उपयोग करने के लिए बताता है। और लिनक्स परिभाषा "निष्पादन योग्य फाइल" निष्पादन योग्य (एक्स) बिट सेट के साथ फाइलें हैं - knittl
खोज का कौन सा संस्करण टाइप प्रकार के लिए उस प्रकार का समर्थन करता है? आदमी को मेरे सिस्टम पर बी, सी, डी, पी, एफ, एल, एस और डी सूचियां मिलती हैं। - innaM
यहां वही है, मेरे खोज में कोई नहीं है -type x या तो। - davr
यदि आपके पास खोजने का पुराना संस्करण है (शायद 4.3.8 से पहले) जिसमें अनावश्यक उपयोग नहीं है। -पर्म / यू = एक्स, जी = एक्स, ओ = एक्स। - Ludwig Weinzierl
find: invalid predicate -executable' आरएचईएल पर - SSH This


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

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

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

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

find . -executable

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


29
2017-09-10 15:55



यह केवल खोज के एक नए संस्करण पर काम करता है। सेंटोस के साथ डिफ़ॉल्ट रूप से आता है जो त्रुटि देता है find: invalid mode / U = एक्स, जी = एक्स, o = x'` - davr
फिर आपको "-ermerm +" संस्करण का प्रयास करना चाहिए जिसे अब जीएनयू में हटा दिया गया है: ढूंढें। -पर्म +111 " - innaM
लगता है -perm /111 सबसे पोर्टेबल संस्करण हो सकता है। - Scott


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

पर परीक्षण किया मैक ओ एस 10.12.5

find . -perm +111 -type f

8
2018-06-01 06:59



आरएचईएल 5 में भी काम करता है। - José Tomás Tocino


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

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

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

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

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


3
2018-04-24 02:38



(0) आप कौन सा पसंद करते हैं, आर्केन और सही या सहज और दोषपूर्ण? मैं सही पसंद करता हूँ। (1)innaM का जवाब, विशेषता है find -perm, फाइलें मिलती है कोई भी अनुमति बिट सेट निष्पादित करें। (2) इसके विपरीत, यह उत्तर केवल उन फाइलों को पाता है जिनके लिए वर्तमान उपयोगकर्ता को निष्पादन अनुमति है। अनुमोदित, ओपी चाहता है कि हो सकता है, लेकिन यह अस्पष्ट है। ... (Cont'd) - Scott
(Cont'd) ... (3) स्पष्टता के लिए, आप बदलना चाहते हैं `…` सेवा मेरे $(…) - देख इस, इस, तथा इस। (4) लेकिन don'tdo for i in $(find …); do …; यह उन फाइलनामों में विफल रहता है जिनमें अंतरिक्ष (ओं) होते हैं। इसके बजाए, करो find … -exec …। (5) और, जब आप शैल चर के साथ काम करते हैं, तो हमेशा उन्हें उद्धृत करें (डबल कोट्स में) जब तक कि आपके पास कोई अच्छा कारण न हो, और आप सुनिश्चित हैं कि आप जानते हैं कि आप क्या कर रहे हैं। - Scott
@ स्कॉट ठीक है, मैं सही खड़ा हूँ :) मैंने पढ़ा -perm तीनों की आवश्यकता के रूप में तर्क, उनमें से एक नहीं। इसके अलावा, खोल तर्कों की सुरक्षा के लिए इनपुट के लिए धन्यवाद, यह वह सब चीजें है जिनके बारे में मुझे पता नहीं था। - Mark McKenna
@MarkMcKenna आपके पास एक टाइपो है: for i in ढूंढो - प्रकार एफ; do [ -x $i ] && echo "$i is executable"; done; आप <dir> भाग खो रहे हैं, जिसे मैं एक डॉट (।) का उपयोग करता हूं - Devy


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

यहां मैं उपयोग करता हूं:

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
2018-03-26 07:52



यह क्या करता है - DerMike
@DerMike, यह .so फ़ाइलों सहित वर्तमान निर्देशिका में निष्पादन योग्य खोजने के तरीकों में से एक है, भले ही फ़ाइल निष्पादन योग्य चिह्नित न हो, यह खोज सके। - AjayKumarBasuthkar
खैर, मेरा मतलब है, किस तरह क्या ऐसा करता है? - DerMike
यह फ़ाइल के शीर्षलेख से खोजने के लिए पढ़ता है, प्रत्येक बाइनरी फ़ाइल या स्क्रिप्ट फ़ाइल में हेडर है। - AjayKumarBasuthkar
जहाँ तक मुझे पता है, -name "*" पर कोई प्रभाव नहीं पड़ता है find - यह आमतौर पर उन सभी फ़ाइलों को पाता है जो परीक्षणों से समाप्त नहीं होते हैं। - G-Man


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

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

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

मुझे ऊपर की आवश्यकता है कि रूट के स्वामित्व वाली स्क्रिप्ट में 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 &

1
2017-07-09 12:31



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