Як я можу вирішити помилку "не вдається виконати бінарний файл"?


80

Коли я входжу за допомогою SSH, все, що я бачу, це це ...

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

Я нічого не міг зробити тут. Такі команди, як halt, poweroff, rebootбуде повертатися command not found.

Як я можу це виправити? Я використовую Debian Squeeze Linux


7
Що ви зробили з цією машиною?
— slhck

1
останнє, що я зробив - це встановити logwatch. Більш нічого.
— суперрусер

3
PATHце змінна середовище, яка містить перелік папок, в яких оболонка шукає програми. lsнаприклад, зазвичай посилається на це /bin/ls, і ваша оболонка знаходить її, переглядаючи папки, перелічені в PATHодній за одною, доки не знайде її, або якщо вона не знайде її в жодній з них, вона відмовляється. Я вважаю, що кращою відправною точкою буде, який результат echo $PATH? (редагувати: exportкоманда - це спосіб визначити змінну середовища в bash.)
— Darth Android

1
Ах ... Я попередив вас не вимикати систему: P Чи можете ви отримати доступ до консолі (фізичний монітор + клавіатура)? Спробуйте завантажувати систему в режимі для одного користувача (може бути позначений як режим відновлення) і подивіться, чи зможете ви потрапити в кореневу оболонку.
— Дарт Android

2
@David, ви не побачите жодного результату після набору тексту export PATH=/bin:/user/bin:/sbin:/usr/sbin. Це безшумна команда.
— Бен Річардс

Відповіді:


84

Зазвичай це повідомлення про помилку означає, що Linux не розпізнає файл як скрипт оболонки або виконуваний файл.

Зазвичай причиною є запущений виконуваний файл у неправильній архітектурі - якщо ви спробуєте запустити виконувані файли x86 на процесорі ARM, з'явиться це повідомлення.

Чи /usr/bin/idперезаписали, можливо?


15
"якщо ви спробуєте запустити виконувані файли x86 на процесорі ARM, з'явиться це повідомлення." Це ТОЧНО було причиною цього. Дякуємо всім за ваші вкладення!
— суперрузер

Виявилося, що мій двійковий файл був файлом EXE для Windows: P
— forzagreen

Як ми можемо це вирішити? Я впевнений, що у мене є те саме питання, але ця відповідь насправді не підказує мені рішення: /
— Newskooler

Щоб вирішити, потрібно використовувати двійковий файл ARM, а не двійковий x86. Якщо джерело доступне, ви можете перекомпілювати / відновити в системі ARM. Якщо джерело недоступне, зверніться до постачальника для наявності бінарного запису ARM. Наприклад, офіційний JRE від Sun має як версії x86, так і "вбудовані" або ARM. Ви повинні використовувати версію ARM.
— LawrenceC

24

Спробуйте запустити його, використовуючи ./executablefilename замість використання виконуваного імені sh. Це не сценарій оболонки.


У мене була ця проблема при спробі запустити kiwix-serve на моєму малиновому пі. Моє загальне рішення, я вважаю, було відрегулювати дозволи файлів (за замовчуванням його ніхто не встановлював для виконання), а потім запустив його як./kiwix-serve
— cchapman

9

Проблема полягає у запуску двійкового файлу для іншої архітектури процесора. Ви можете використовувати objdump (з бінутів), щоб перевірити архітектуру бінарних файлів. Ви можете використовувати unme для перевірки архітектури машини.

Наприклад, я зіткнувся з цією помилкою "не можу виконати бінарний файл" під час встановлення FF.Communicator - плагін Firefox для хромування (тому я можу запускати сторінки, які використовують аплети Java).

  • objdump показує, що двійковий код є 64-розрядним elf64-x86-64
  • Унаме показує, що моя машина - 32-розрядна i686

    $ ./FF.Communicator bash: ./FF.Communicator: не може виконати бінарний файл $ uname -mpio i686 i686 i386 GNU / Linux $ objdump -a ./FF.Communicator ./FF.Communicator: формат файлу elf64-x86-64 ./FF.Комунікатор

  • objdump на робочому бінарному файлі на моїй машині показує, що це 32-бітний elf32-i386

    $ objdump -a / bin / ls / bin / ls: формат файлу elf32-i386

Використовуючи ці інструменти, ви можете перевірити архітектури машин та двійкових файлів - не лише архітектури Intel, але будь-якого процесора.

Для користувачів Mac OSX ви можете дізнатися інформацію про архітектуру певного файлу за допомогою команди "файл":

$ file filename_here

6

Я роблю тут кілька диких здогадок, але, схоже, відбувається таке:

  1. Ви входите через SSH, запускаючи bashзапустити ~/.profileабо ~/.bashrcналаштовуючи для вас своє оточення (це нормально).
  2. У якийсь момент він намагається виконати, /bin/idщоб отримати ваш uid, який виходить з ладу, викликаючи помилку виразу цілого числа та припиняючи сценарій, перш ніж він зможе налаштувати ваш $PATH.
  3. Оскільки ваш $PATHне встановлений, bash може виконувати команди лише з вказаним повним шляхом.

Використовуйте export PATH=/bin:/usr/bin:/sbin:/usr/sbinдля вирішення $PATHпроблеми, поки не зможете виправити першопричину відмови / bin / id.


0

двійковий файл складається з машинних інструкцій, які процесор може зрозуміти. Ваша операційна система не означає, що буде працювати той самий виконуваний файл. переміщення вперед-назад між сумісним із набором інструкцій процесора, як правило, спрацює добре, якщо вони не сумісні.


0

Це означає, що ви намагаєтеся виконати бінарний файл, використовуючи ваш скрипт bash, який не призначений для запуску так, як ви це намагаєтеся. Це вже двійковий файл, і ви намагаєтеся $ SHELL проаналізувати та запустити його.

на дуже простому прикладі, якщо ви спробуєте запустити команду `w 'як

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

аналогічно, ви можете потрапити на той самий метод або як це виглядає з фрагмента коду.

Хоча для решти для ваших команд Al ці команди зупинки, вимкнення, перезавантаження і т. Д. Є командами, що належать до кореня, і для запуску та виконання необхідної операції потрібні додаткові користувачі. звичайні користувачі не можуть запустити їх. Ще одне пояснення полягає в тому, що ці команди розміщуються у / sbin / та / usr / sbin, що може не бути у вашій змінній $ PATH (яка використовується для перевірки команд у вашому зберіганні)


-1

Ви працюєте з неправильною версією інсталятора, наприклад, 64-бітовою машиною та намагаєтесь встановити 32-бітну версію інсталятора.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.