Как устранить ошибку «невозможно выполнить двоичный файл»?

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? (edit: exportкоманда - это способ определить переменную окружения в bash.)
Darth Android,
1
Ах ... Я предупредил вас не выключать систему: P Можете ли вы получить к ней консольный доступ (физический монитор + клавиатура подключены)? Попробуйте загрузить систему в однопользовательском режиме (может быть помечен как режим восстановления) и посмотрите, сможете ли вы добраться до корневой оболочки.
Дарт Андроид
2
@ Давид вы не увидите ничего после ввода export PATH=/bin:/user/bin:/sbin:/usr/sbin. Это тихая команда.
Бен Ричардс

Ответы:

84

Обычно это сообщение об ошибке означает, что Linux не распознает файл как сценарий оболочки или как исполняемый файл.

Обычно причиной является запуск исполняемого файла в неправильной архитектуре - если вы попытаетесь запустить исполняемые файлы x86 на процессоре ARM, появится это сообщение.

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

LawrenceC
источник
15
«если вы попытаетесь запустить исполняемые файлы x86 на процессоре ARM, появится это сообщение». Это было именно то, что вызвало это. Спасибо всем за ваш вклад!
суперпользователь
Оказалось, что мой бинарный файл был исполняемым файлом Windows: P
forzagreen
Как мы можем решить это? Я уверен, что я получаю ту же проблему, но этот ответ не говорит мне о решении: /
Newskooler
Чтобы решить, вам нужно использовать двоичный файл ARM, а не двоичный файл x86. Если источник доступен, вы можете перекомпилировать / перестроить в системе ARM. Если источник недоступен, свяжитесь с поставщиком для двоичного файла ARM. Например, официальная JRE от Sun имеет как x86, так и «встроенную» или ARM-версию. Вы должны использовать версию ARM.
LawrenceC
24

Попробуйте запустить его, используя ./executablefilename вместо использования sh executetablefilename. В конце концов, это не скрипт оболочки.

RidDeBakTiYar
источник
У меня была эта проблема при попытке запустить kiwix-serve на моем Raspberry Pi. Мое общее решение, которое я считаю, состояло в том, чтобы отрегулировать права доступа к файлу (по умолчанию он не был назначен исполняемым пользователем), а затем ./kiwix-serve
запустить
9

Проблема заключается в запуске двоичного файла для другой архитектуры процессора. Вы можете использовать objdump (из binutils) для проверки архитектуры двоичных файлов. Вы можете использовать uname для проверки архитектуры машины.

Например, я столкнулся с этой ошибкой «невозможно выполнить двоичный файл» при установке FF.Communicator - плагина Firefox для Chrome (поэтому я могу запускать страницы, которые используют Java-апплеты).

  • objdump показывает, что двоичный файл является 64-битным elf64-x86-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

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

Для пользователей Mac OSX вы можете узнать информацию об архитектуре определенного файла, используя команду «file»:

$ file filename_here
gaoithe
источник
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

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

acoh Facha
источник
0

Это означает, что вы пытаетесь выполнить двоичный файл, используя ваш bash-скрипт, который не предназначен для запуска так, как вы пытаетесь. Это уже бинарный файл, и вы пытаетесь проанализировать и запустить его $ SHELL.

в очень простом примере, если вы попытаетесь запустить команду `w ', как

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

Точно так же вы можете использовать тот же метод или как он выглядит из вашего фрагмента кода.

В то время как для остальных команд все эти команды останова, выключения, перезагрузки и т. Д. Являются командами, принадлежащими корню, и для выполнения и выполнения требуемой операции требуются привилегированные привилегированные права пользователя. обычные пользователи не могут запустить их, другое объяснение состоит в том, что эти команды размещены в / sbin / и / usr / sbin, которых может не быть в вашей переменной $ PATH (которая используется для проверки команд в вашем распоряжении)

Насир Махмуд
источник
-1

Вы используете неверную версию установщика, например, 64-разрядную машину и пытаетесь установить 32-разрядную версию установщика.

Квай
источник