سؤال كيف يمكنني حل الخطأ "لا يمكن تنفيذ ملف ثنائي"؟


عندما أسجل باستخدام SSH ، كل ما يمكنني رؤيته هو ...

-bash: /usr/bin/id: cannot execute binary file
-bash: [: : integer expression expected

لم أستطع فعل أي شيء هنا أوامر مثل halt، poweroff، reboot سيعود command not found.

كيف يمكنني اصلاح هذا؟ أنا أستخدم Debian Squeeze Linux


67
2018-06-12 21:26


الأصل


ماذا فعلت بهذا الجهاز؟ - slhck
كان آخر شيء فعلته هو تثبيت logwatch. لا شيء آخر. - superuser
PATH هو متغير بيئة يحتوي على قائمة من المجلدات التي يبحث shell عن البرامج. ls على سبيل المثال ، يشير عادة إلى /bin/lsويتم العثور عليه من خلال الانتقال إلى المجلدات المدرجة في PATH واحدة تلو الأخرى حتى تجدها ، أو إذا لم تجدها في أي منها ، فإنها تستسلم. أفترض أن أفضل نقطة بداية ستكون ، ما هو خرج echo $PATH ؟ (تحرير: export الأمر هو طريقة لتعريف متغير بيئة في bash.) - Darth Android
آه ... لقد حذرتك من إغلاق النظام: P هل يمكنك الوصول إلى وحدة التحكم له (شاشة مادية + لوحة مفاتيح مرفقة)؟ حاول تشغيل النظام في وضع المستخدم المفرد (قد يتم تصنيفه على أنه وضع الاسترداد) ومعرفة ما إذا كان يمكنك الوصول إلى shell root. - Darth Android
David لن ترى أي إخراج بعد الكتابة export PATH=/bin:/user/bin:/sbin:/usr/sbin. إنها قيادة صامتة. - Ben Richards


الأجوبة:


عادةً ما تعني رسالة الخطأ هذه أن Linux لا يتعرف على الملف على أنه نص برمجي shell أو كملف قابل للتنفيذ.

عادة ما يكون السبب في تشغيل ملف قابل للتنفيذ على بنية خاطئة - إذا حاولت تشغيل x86 الملفات التنفيذية على وحدة المعالجة المركزية ARM ، تأتي هذه الرسالة.

فعل /usr/bin/id الحصول على الكتابة ، وربما؟


73
2018-06-13 03:07



"إذا حاولت تشغيل x86 الملفات التنفيذية على وحدة المعالجة المركزية ARM ، تظهر هذه الرسالة." هذا بالضبط ما تسبب في ذلك. شكرا للجميع على المدخلات الخاصة بك! - superuser


حاول تشغيله باستخدام ./executablefilename بدلاً من استخدام sh sheapablefilename. انها ليست نصي شل بعد كل شيء.


22
2018-06-13 01:27



واجهت هذه المشكلة عند محاولة تشغيل kiwix-serve على pi التوت. كان الحل الشامل الذي أراه هو ضبط أذونات الملف (لم يتم تعيينه على أي شخص بشكل افتراضي) ثم تشغيله ./kiwix-serve - cchapman


المشكلة هي تشغيل ثنائي لبنية معالج مختلفة. يمكنك استخدام objdump (من binutils) للتحقق من بنية الثنائيات. يمكنك استخدام uname للتحقق من هندسة الجهاز.

مثلا واجهت هذا الخطأ "لا يمكن تنفيذ ملف ثنائي" عند تثبيت FF.Communicator - وهو مكون Firefox لكروم (حتى أتمكن من تشغيل الصفحات التي تستخدم تطبيقات جافا).

  • objdump يظهر ثنائي 64 بت elf64-إكس86-64
  • uname يظهر الجهاز الخاص بي هو 32 بت i686 

    $ ./FF.Communicator bash: ./FF.Communicator: لا يمكن تنفيذ ملف ثنائي $ uname -mpio i686 i686 i386 GNU / Linux $ objdump -a ./FF.Communicator ./FF.Communicator: تنسيق الملف elf64-x86-64 ./FF.Communicator

  • objdump على ثنائي العمل على جهازي يظهر أنه 32 بت elf32-I386

    $ objdump -a / bin / ls / bin / ls: تنسيق الملف elf32-i386

باستخدام هذه الأدوات ، يمكنك التحقق من معماريات الآلات والثنائيات - وليس فقط معماريات إنتل ولكن أي معالج.


9
2018-06-19 11:55





أقوم ببعض التخمينات البرية هنا ، ولكن يبدو أن ما يلي يحدث:

  1. قمت بتسجيل الدخول عبر SSH ، مما اثار bash لتشغيل الخاص بك ~/.profile أو ~/.bashrc لإعداد البيئة الخاصة بك (وهذا أمر طبيعي).
  2. في مرحلة ما يحاول تنفيذ /bin/id للحصول على uid الخاص بك ، والذي فشل ، مما تسبب في خطأ تعبير صحيح ، وإنهاء البرنامج النصي قبل أن تتمكن من إعداد الخاص بك $PATH.
  3. لان خاصتك $PATH لم يتم تعيين bash إلا على تشغيل الأوامر مع المسار الكامل المحدد.

استعمال export PATH=/bin:/usr/bin:/sbin:/usr/sbin لإصلاح $PATH المشكلة حتى تتمكن من إصلاح السبب الرئيسي لفشل / bin / id.


5
2018-06-12 21:51





يتكون الملف الثنائي من تعليمات الماكينة التي يمكن للمعالج فهمها. لا يعني نظام التشغيل الخاص بك تشغيل نفس الملف التنفيذي. التحرك ذهابا وإيابا بين مجموعة تعليمات المعالج متوافقة مع عادة ما تعمل بشكل جيد ، إذا لم تكن وحدة المعالجة المركزية متوافقة لن تكون قادرة على فهم التعليمات.


0
2018-06-12 22:29





هذا يعني أنك تحاول تنفيذ ملف ثنائي باستخدام سكريبت bash الذي لا يقصد تشغيله وأنت تحاول أن تكون. إنه بالفعل ملف ثنائي وتحاول لديك $ SHELL لتحليله وتشغيله.

في مثال بسيط للغاية ، إذا حاولت تشغيل أمر "w" مثل

$ bash w
/usr/bin/w: /usr/bin/w: cannot execute binary file

وبالمثل ، قد تضرب نفس الطريقة أو كما تبدو من مقتطف الشفرة.

بينما بالنسبة إلى الأوامر المتبقية ، فإن أوامر إيقاف التشغيل والإيقاف وإعادة التشغيل هذه هي الأوامر المملوكة للجذور وتحتاج إلى طليقات فائقة للمستخدم لتشغيل وتنفيذ العملية المطلوبة. لا يمكن للمستخدمين العاديين تشغيلها تفسير آخر هو أن هذه الأوامر توضع في / sbin / و / usr / sbin ، والتي قد لا تكون في المتغير PATH $ (الذي يستخدم للتحقق من صحة الأوامر في عهدتك)


0
2017-10-24 14:01





أنت تشغل إصدارًا خاطئًا من برنامج التثبيت ، على سبيل المثال ، جهاز 64 بت وتحاول تثبيت إصدار 32 بت من برنامج التثبيت.


-1
2017-07-25 08:43