web-dev-qa-db-ja.com

Bashは、そこにあり、すべての適切な権限を持つプログラムを開始できません

これはgentooサーバーです。実行できないプログラムprogがあります。 (はい、実行権限が設定されています)

ファイルについて

$ ls
prog
$ ./prog
bash: ./prog: No such file or directory
$ file prog
prog: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped
$ pwd
/usr/local/bin
$ /usr/local/bin/prog
bash: /usr/local/bin/prog: No such file or directory
$ less prog | head
ELF Header:
Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
Class:                             ELF32
Data:                              2's complement, little endian
Version:                           1 (current)
OS/ABI:                            UNIX - System V
ABI Version:                       0
Type:                              EXEC (Executable file)
Machine:                           Intel 80386
Version:                           0x1

それが実際の実行可能ファイルであることを示すために、私はあまり凝っていません。ここにいくつかのデータがあります。

$ xxd prog |head
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 0300 0100 0000 c092 0408 3400 0000  ............4...
0000020: 0401 0a00 0000 0000 3400 2000 0700 2800  ........4. ...(.
0000030: 2600 2300 0600 0000 3400 0000 3480 0408  &.#.....4...4...
0000040: 3480 0408 e000 0000 e000 0000 0500 0000  4...............
0000050: 0400 0000 0300 0000 1401 0000 1481 0408  ................
0000060: 1481 0408 1300 0000 1300 0000 0400 0000  ................
0000070: 0100 0000 0100 0000 0000 0000 0080 0408  ................
0000080: 0080 0408 21f1 0500 21f1 0500 0500 0000  ....!...!.......
0000090: 0010 0000 0100 0000 40f1 0500 4081 0a08  ........@...@...

そして

$ ls -l prog
-rwxrwxr-x 1 1000 devs 725706 Aug  6  2007 prog

$ ldd prog
      not a dynamic executable

$ strace ./prog
1249403877.639076 execve("./prog", ["./prog"], [/* 27 vars */]) = -1 ENOENT (No such file or directory)
1249403877.640645 dup(2)                = 3
1249403877.640875 fcntl(3, F_GETFL)     = 0x8002 (flags O_RDWR|O_LARGEFILE)
1249403877.641143 fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
1249403877.641484 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b3b8954a000
1249403877.641747 lseek(3, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
1249403877.642045 write(3, "strace: exec: No such file or dir"..., 40strace: exec: No such file or directory
) = 40
1249403877.642324 close(3)              = 0
1249403877.642531 munmap(0x2b3b8954a000, 4096) = 0
1249403877.642735 exit_group(1)         = ?

サーバーについて

FTRサーバーはxendomUであり、プログラムはクローズドソースのLinuxアプリケーションです。このVMは、同じルートファイルシステム(このプログラムを含む)を持つ別のVMのコピーであり、正常に動作します。

私は上記のすべてを根本的な同じ問題として試しました。

ルートファイルシステムがNFSを介してマウントされていることを述べました。ただし、「defaults、nosuid」がマウントされており、executeが含まれている必要があります。また、マウントされたドライブから他の多くのプログラムを実行することができます

/ proc/cpuinfo:

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 15
model       : 4
model name  :                   Intel(R) Xeon(TM) CPU 3.00GHz
stepping    : 1
cpu MHz     : 2992.692
cache size  : 1024 KB
fpu     : yes
fpu_exception   : yes
cpuid level : 5
wp      : yes
flags       : fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl cid cx16 xtpr
bogmips : 5989.55
clflush size    : 64
cache_alignment : 128
address sizes   : 36 bits physical, 48 bits virtual
power management:

実行できるファイルの例

そのサーバー上のマウントされたファイルシステムで他のプログラムを実行できます。例えば:

$ ls -l ls
-rwxr-xr-x 1 root root 105576 Jul 25 17:14 ls
$ file ls
ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped
$ ./ls
attr        cat    cut        echo        getfacl   ln    more       
... (you get the idea) ...
rmdir       sort       tty
$ less ls | head
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
4
Rory

/proc/cpuinfolmフラグは、サーバーに64ビットCPUがあることを示します。

file progからの情報は、プログラムが32ビットアーキテクチャ用にコンパイルされていることを示しています。 32個のライブラリをインストールしてみてください。私はGentooでこれを行う方法に精通していませんが、多分これ Gentoo wiki記事 が役立つでしょう。

Ubuntuの64ビットインストールでAndroid Debug Bridgeを実行しようとすると、32ビット用にコンパイルされているため、同様の問題が発生しました(bashがファイルが見つからないことを報告します)。

10
Toby Stafford

次のことを試してください。

ldd /usr/local/bin/prog

または、straceで実行します。

strace /usr/local/bin/prog

プログラムは、欠落しているか、間違ったアーキテクチャ用にコンパイルされている共有ライブラリに対してリンクされていると思います。クローズドソースであることを考えると、どちらも可能です。

3

ファイルシステムのマウントにexecフラグを設定するのはどうですか?

mount -o remount,exec server:/path /mntpoint

ファイルシステムにexecフラグが設定されていない場合、そのファイルシステムから実行可能ファイルを実行することはできません。

2
Coops

ファイルの名前は実際には「prog」ではない可能性があります。 Unixでは、バックスペースやスペースなど、ファイル名に任意の文字を使用できます。たとえば、ファイルの名前は「p ^ Hprog」で、表示されるのは「prog」だけです。あなたはbashを持っているので、オートコンプリートを利用することができます:

> ls ./[TAB] # where [TAB] means you hit the tab key

それが何かに一致する場合は、

> mv ./[TAB]

コードを記述している場合は、ディレクトリ内のすべてのファイルを一覧表示し、ファイル名の各文字の16進値を表示する必要があります。

1
atk
$ less prog | head
ELF Header:
Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
Class:                             ELF32
Data:                              2's complement, little endian
Version:                           1 (current)

それは疑わしいです(あなたが高度なLESSPIPEを持っていない限り)...あなたはすることができます

ls -l prog

(サイズ用)

xxd prog | head

(実際の内容)

また、名前をmyprogに変更してから、。/ myprogを実行してみてください。

1
w00t

はい、この質問は2歳です。しかし、考えられる答えは次のとおりです。

execve()は、ELFインタープリターが見つからない場合にENOENTを返します。私の場合、/ lib/ld_lsb.so.3-> ld_linux.so.2からのシンボリックリンクが必要でした。これは、ELFインタープリター用にLinux StandardBaseで指定された場所です。おそらく「lsb」のような名前のこのシンボリックリンクを提供するパッケージがディストリビューションにある可能性があります。

1

の結果を得ることができますか、

  • which prog
  • cat /proc/cpuinfo-/procがあると思います

小さなポインタ、

  1. 32ビットを表示する他の実行可能ファイルを正常に実行できますか?
    • マウントポイント上でも他の実行可能ファイルを実行できますか
      (サーバーマシンにコピーできます。コピー後にマウントの上に表示されます)
1
nik

私はこの一口がPDFの中に埋もれているのを見つけました:

32ビットランタイムサポートをインストールするには、次のコマンドを実行します。

  • $ Sudo apt-get update
  • $ Sudo apt-get install ia32-libs

これにより200を超えるパッケージがインストールされ、完了するまでに数分かかることに注意してください。

これを行うことで、64ビットLinux:lddで実行でき、たとえばNVIDIA nvflashバイナリ...

0
MarkHu