سؤال كيف يمكنني العثور على الملفات القابلة للتنفيذ فقط ضمن دليل معين في Linux؟


كيف يمكنني العثور على الملفات القابلة للتنفيذ فقط ضمن دليل معين في Linux؟


129
2017-09-10 11:56


الأصل


هنا هو نوع من السيناريو BASH ، فإنه ليس سيئًا هو ما يمكنني قوله :) stackoverflow.com/a/20209457/2067125 - AjayKumarBasuthkar
ماذا عن استخدام المعيار file أمر؟ - Breakthrough
لأي شخص يريد القيام بذلك على ماك (تم اختباره على OS X 10.9.5): ls -l | egrep '^[^d]..x..x..x.*$'  أعلاه سوف يسرد جميع الملفات التنفيذية (لجميع / المستخدم والمجموعة) في الدليل الحالي. ملحوظة: ال -executable لا يعمل الخيار على نظام التشغيل Mac وبالتالي الحل أعلاه. - techfoobar
ذات الصلة أيضا: البحث يونكس: البحث عن الملفات القابلة للتنفيذ - Slothworks
techfoobar: السؤال غامض: هل يعني ذلك ملفات تحتوي على تعليمات برمجية قابلة للتنفيذ أم أنها تعني ملفات لها إذن تنفيذي؟ ولكن حتى لو افترضنا أن الإذن القابل للتنفيذ هو المطلوب (كما يبدو أن غالبية الردود) ، فإن السؤال لا يقول العالم قابل للتنفيذ. سيعثر الحل الخاص بك على ملفات (وأيضاً fifos ، مآخذ توصيل ، symlinks ، إلخ.) التي لديها إذن تنفيذ عالمي ، ولكن ليس 750 (-rwxr-x---) ، والتي لا تزال قابلة للتنفيذ لبعض المستخدمين. - G-Man


الأجوبة:


التحقق من الملفات القابلة للتنفيذ يمكن القيام به -perm (غير مستحسن) أو -executable (موصى به ، لأنه يأخذ ACL في الاعتبار). لاستخدام ال -executable اختيار:

find <dir> -executable

إذا كنت ترغب في العثور على الملفات القابلة للتنفيذ فقط وليس الدلائل التي يمكن البحث فيها ، قم بدمجها مع -type f:

find <dir> -executable -type f

133
2017-09-10 11:59



لا يعني shebang أنها قابلة للتنفيذ. يخبرنا فقط بالمترجم الذي يجب استخدامه. ومن خلال تعريف linux "الملفات القابلة للتنفيذ" هي ملفات مع مجموعة البت القابلة للتنفيذ (x) - knittl
ما هو إصدار البحث الذي يدعم هذا النوع من أجل -type؟ رجل يجد القوائم ب ، ج ، د ، ف ، و ، ل ، ق و د على نظام بلدي. - innaM
نفس هنا ، اجد لا تملك -type x إما. - davr
إذا كان لديك إصدار قديم من البحث (ربما قبل 4.3.8) التي تفتقر إلى -executable استخدام البحث. -perme / u = x، g = x، o = x. - Ludwig Weinzierl
find: invalid predicate -executable' على RHEL - SSH This


استخدم البحث -perm اختيار. سيؤدي هذا إلى العثور على ملفات في الدليل الحالي قابلة للتنفيذ بواسطة مالكها ، أو بواسطة أعضاء المجموعة أو بواسطة الآخرين:

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

تصحيح:

أنا فقط وجدت خيار آخر موجود على الأقل في GNU العثور على 4.4.0:

find . -executable

هذا يجب أن يعمل بشكل أفضل لأن ACLs تعتبر أيضا.


29
2017-09-10 15:55



هذا يعمل فقط على إصدار أحدث من البحث. الذي يأتي بشكل افتراضي مع CentOS يعطي الخطأ find: invalid mode / ش = س، ز = س، س = x'` - davr
ثم يجب عليك تجربة "-perm +" الإصدار الذي تم إيقافه الآن في GNU find: find. -prem +111 " - innaM
يبدو مثل -perm /111 قد يكون الإصدار الأكثر المحمولة. - Scott


أعلم أن السؤال يشير تحديدًا إلى Linux ، ولكن نظرًا لأن هذه هي النتيجة الأولى على Google ، أردت فقط إضافة الإجابة التي كنت أبحث عنها (على سبيل المثال إذا كنت - مثلي في الوقت الحالي - أجبره صاحب العمل على استخدام غير جنو / نظام لينكس).

اختبارها على ماك 10.12.5

find . -perm +111 -type f

8
2018-06-01 06:59



يعمل في RHEL 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 الأمر ، أكثر كفاءة الذاكرة سيكون الأمر الخاص بك.

على أية حال ، تقدم فقط مقاربة أخرى ، حيث أن * nix هي أرض بليون مقاربة.


3
2018-04-24 02:38



(0) ما الذي تفضله ، غامض وصحيح أم بديهي ومعيب؟ أنا أفضل الصحيح. (1)إجابة innaM، تتميز find -perm، يجد الملفات التي لديها أي تنفيذ مجموعة بت إذن. (2) على النقيض من ذلك ، تعثر هذه الإجابة فقط على الملفات التي قام المستخدم الحالي بتنفيذ الإذن بها. من المؤكد أن هذا قد يكون ما يريده البروتوكول الاختياري ، لكنه غير واضح. ... (تابع) - Scott
(تابع) ... (3) من أجل الوضوح ، قد ترغب في التغيير `…` إلى $(…) - نرى هذه، هذهو هذه. (4) لكن don’tdo for i in $(find …); do …. فشل في أسماء الملفات التي تحتوي على space (s). بدلا من ذلك ، افعل find … -exec …. (5) وعندما تتعامل مع متغيرات shell ، اقتبسها دائمًا (في علامات اقتباس مزدوجة) ما لم يكن لديك سبب وجيه لعدم ذلك ، وأنت على يقين من أنك تعرف ما تفعله. - 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' لأخذ الإخراج من الأمر find (باستخدام print0 لضمان أسماء الملفات باستخدام المسافات بشكل صحيح). لدينا الآن قائمة بالملفات القابلة للتنفيذ ونحن نوفرها ، واحدة تلو الأخرى ، كمعلمة للأمر 'file'. ثم grep لمصطلح ASCII لتجاهل الثنائيات. يرجى استبدال -executable في العثور على الأمر مع النمط الذي تفضله (انظر الإجابات السابقة) أو ما يعمل على نظام التشغيل الخاص بك NIX

طلبت من المذكور أعلاه العثور على ملفات مع 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تقارير الترميز ، بحيث يمكن الإبلاغ عن البرنامج النصي python باسم a /usr/bin/python script, UTF-8 Unicode text executable. find ... | xargs file -b | grep -v '^ELF' يمكن أن تعمل بشكل أفضل لاكتشاف غير الثنائيات. - xenoid