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


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.