Jak rozwiązać problem „nie można uruchomić pliku binarnego”?

80

Kiedy loguję się przy użyciu SSH, widzę tylko ...

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

Nie mogłem tu nic zrobić. Polecenia takie jak halt, poweroff, rebootpowróci command not found.

Jak mogę to naprawić? Używam Debian Squeeze Linux

superużytkownik
źródło
7
Co zrobiłeś z tą maszyną?
slhck
1
ostatnią rzeczą, którą zrobiłem, była instalacja logwatch. Nic więcej.
superużytkownik
3
PATHjest zmienną środowiskową, która zawiera listę folderów, które powłoka szuka programów. lsna przykład zwykle odnosi się do /bin/ls, a twoja powłoka znajduje go, przeglądając foldery wymienione PATHjeden po drugim, aż go znajdzie, lub jeśli nie znajdzie go w żadnym z nich, poddaje się. Przypuszczam, że lepszym punktem wyjścia byłoby, z czego jest wynik echo $PATH? (edycja: exportpolecenie jest sposobem na zdefiniowanie zmiennej środowiskowej w bash.)
Darth Android
1
Ach ... Ostrzegałem cię, żebyś nie wyłączał systemu: P Czy możesz uzyskać dostęp do konsoli (podłączony monitor fizyczny + klawiatura)? Spróbuj uruchomić system w trybie pojedynczego użytkownika (może być oznaczony jako tryb odzyskiwania) i sprawdź, czy możesz dostać się do powłoki roota.
Darth Android
2
@ David nie zobaczysz żadnych wyników po wpisaniu export PATH=/bin:/user/bin:/sbin:/usr/sbin. To ciche polecenie.
Ben Richards

Odpowiedzi:

84

Zwykle ten komunikat o błędzie oznacza, że ​​Linux nie rozpoznaje pliku jako skryptu powłoki ani pliku wykonywalnego.

Zazwyczaj przyczyną jest uruchomienie pliku wykonywalnego na niewłaściwej architekturze - jeśli spróbujesz uruchomić pliki wykonywalne x86 na procesorze ARM, pojawia się ten komunikat.

Czy /usr/bin/idnadpisywane, ewentualnie?

LawrenceC
źródło
15
„jeśli spróbujesz uruchomić pliki wykonywalne x86 na procesorze ARM, pojawi się ten komunikat.” Dokładnie to spowodowało. Dziękujemy wszystkim za wkład!
superużytkownik
Okazało się, że mój plik binarny to plik exe systemu Windows: P
forzagreen,
Jak możemy to rozwiązać? Jestem pewien, że dostaję ten sam problem, ale ta odpowiedź tak naprawdę nie mówi mi rozwiązania: /
Newskooler
Aby rozwiązać problem, musisz użyć pliku binarnego ARM, a nie pliku binarnego x86. Jeśli źródło jest dostępne, możesz ponownie skompilować / przebudować w systemie ARM. Jeśli źródło nie jest dostępne, sprawdź u dostawcy binarne ARM. Na przykład oficjalne środowisko JRE firmy Sun zawiera wersje x86 i „embedded” lub ARM. Musisz użyć wersji ARM.
LawrenceC
24

Spróbuj uruchomić go, używając ./executablefilename zamiast sh pliku wykonywalnego sh. W końcu to nie jest skrypt powłoki.

RidDeBakTiYar
źródło
Miałem ten problem, gdy próbowałem uruchomić kiwix-serwery na mojej malinowej pi. Moim ogólnym rozwiązaniem, moim zdaniem, było dostosowanie uprawnień do plików (domyślnie nie było ustawione na wykonywalność przez nikogo), a następnie uruchomiłem go jako./kiwix-serve
cchapman
9

Problemem jest uruchomienie pliku binarnego dla innej architektury procesora. Możesz użyć objdump (z binutils), aby sprawdzić architekturę plików binarnych. Możesz użyć uname, aby sprawdzić architekturę komputera.

np. napotkałem ten błąd „nie można uruchomić pliku binarnego” podczas instalowania FF.Communicator - wtyczki Firefox dla Chrome (dzięki czemu mogę uruchamiać strony korzystające z apletów Java).

  • objdump pokazuje, że plik binarny to 64-bitowy elf64-x86-64
  • uname pokazuje, że mój komputer to 32-bitowy i686

    $ ./FF.Communicator bash: ./FF.Communicator: nie można wykonać pliku binarnego $ uname -mpio i686 i686 i386 GNU / Linux $ objdump -a ./FF.Communicator ./FF.Communicator: format pliku elf64-x86-64 ./FF.Communicator

  • objdump na działającym pliku binarnym na moim komputerze pokazuje, że jest to 32-bitowy elf32-i386

    $ objdump -a / bin / ls / bin / ls: format pliku elf32-i386

Za pomocą tych narzędzi możesz sprawdzić architektury maszyn i plików binarnych - nie tylko architektury Intel, ale dowolnego procesora.

Użytkownicy systemu Mac OSX mogą uzyskać informacje o architekturze określonego pliku za pomocą polecenia „file”:

$ file filename_here
gaoithe
źródło
6

Zgaduję tutaj trochę dzikich przypuszczeń, ale wygląda na to, że dzieje się tak:

  1. Logujesz się przez SSH, co powoduje bashuruchomienie ~/.profilelub ~/.bashrcskonfigurowanie środowiska dla ciebie (jest to normalne).
  2. W pewnym momencie próbuje wykonać, /bin/idaby uzyskać identyfikator użytkownika, co kończy się niepowodzeniem, powodując błąd wyrażenia liczb całkowitych i kończąc skrypt, zanim będzie mógł go skonfigurować $PATH.
  3. Ponieważ twój $PATHnie jest ustawiony, bash może uruchamiać polecenia tylko z pełną ścieżką.

Użyj, export PATH=/bin:/usr/bin:/sbin:/usr/sbinaby rozwiązać $PATHproblem, dopóki nie możesz naprawić głównej przyczyny niepowodzenia / bin / id.

Darth Android
źródło
0

plik binarny składa się z instrukcji komputera, które procesor może zrozumieć. Twój system operacyjny nie oznacza, że ​​uruchomi się ten sam plik wykonywalny. poruszanie się w przód i w tył między zgodnymi zestawami instrukcji procesora zwykle będzie działać dobrze, jeśli nie są one kompatybilne Procesor nie będzie w stanie zrozumieć instrukcji.

acoh Facha
źródło
0

Oznacza to, że próbujesz uruchomić plik binarny za pomocą skryptu bash, który nie jest przeznaczony do uruchamiania tak, jak chcesz. Jest to już plik binarny i próbujesz $ SHELL sparsować i uruchomić go.

w bardzo prostym przykładzie, jeśli spróbujesz uruchomić polecenie `w 'jak

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

podobnie możesz uderzać w tę samą metodę lub tak, jak to wygląda z fragmentu kodu.

Podczas gdy dla pozostałych poleceń, wszystkie te polecenia zatrzymania, zamknięcia, ponownego uruchomienia itp. Są poleceniami należącymi do roota i wymagają uprawnień administratora do uruchomienia i wykonania wymaganej operacji. normalni użytkownicy nie mogą ich uruchomić, innym wyjaśnieniem jest to, że te polecenia są umieszczone w / sbin / i / usr / sbin, co może nie znajdować się w zmiennej $ PATH (która służy do sprawdzania poprawności poleceń w areszcie)

Nasir Mahmood
źródło
-1

Używasz niewłaściwej wersji instalatora, na przykład komputera 64-bitowego i próbujesz zainstalować 32-bitową wersję instalatora.

kwai
źródło