ターミナルで実行可能ファイルを実行しようとしていますが(Tails Live OSを使用しています)、エラーメッセージが表示され続けます。権限を設定しました。私が書いたコマンドは次のとおりです。
sudo ./home/amnesia/myfile
「コマンドが見つかりません」というメッセージが表示されますか?
sudoを使用したり使用せずに実行してみました。
$ sudo /home/amnesia/myfile
sudo: unable to execute /home/amnesia/myfile: No such file or directory
$ /home/amnesia/myfile
bash: /home/amnesia/myfile: No such file or directory
ファイルに関する情報(スクリプトではなくバイナリ):
$ ls -l /home/amnesia/myfile
-rwxrwxrwx 1 amnesia amnesia 15327 Sep 3 2013 /home/amnesia/myfile
$ file /home/amnesia/myfile
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared lies), for GNU/Linux 2.6.9, not stripped
私のシステムに関する情報:
$ uname -a
Linux amnesia 3.16-3-amd64 #1 SMP Debian 3.16.5-1 (2014-10-10) x86_64 GNU/Linux
$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xd3280633faaabf56a14a26693d2f810a32222e51, stripped
答え1
$ /home/amnesia/myfile
bash: /home/amnesia/myfile: No such file or directory
$ file /home/amnesia/myfile
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared lies), for GNU/Linux 2.6.9, not stripped
存在しますmyfile
が、実行すると、「該当するファイルやディレクトリはありません」というメッセージが表示されます。これは次の場合に発生します。
- このファイルはローダーによって異なります。動的にリンクされた実行可能ファイルであり、動的リンクライブラリをロードするにはローダが必要です。 (ローダはshebang行で指定されたインタプリタかもしれませんが、bashはそれを検出して他のエラーメッセージを表示します。)
- ローダーファイルが存在しません。
「該当するファイルやディレクトリはありません」というメッセージは実際にローダーに関連していますが、シェルはローダーが関連していることを知らないため、元のファイルの名前を報告します。これをより詳細に説明する。Optwareがインストールされているバイナリに、「該当するファイルやディレクトリはありません」と表示されます。。
なぜこのプログラムを実行できないのですか?これは、64ビット実行可能ファイル用の動的ローダーがないためです。
$ uname -a
Linux amnesia 3.16-3-amd64 #1 SMP Debian 3.16.5-1 (2014-10-10) x86_64 GNU/Linux
$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0xd3280633faaabf56a14a26693d2f810a32222e51, stripped
システムには64ビットカーネルがありますが、システムの残りの部分は32ビットです。 Linuxはこの構成をサポートしています(64ビットカーネルは32ビットプログラムだけでなく64ビットプログラムも実行できますが、32ビットカーネルは32ビットプログラムのみを実行できます)。カーネルはプログラムをうまくロードします。静的にリンクされたamd64実行可能ファイルを実行できます。ただし、64ビットローダー()がないか、/lib64/ld-linux-x86-64.so.2
64ビットライブラリがない可能性があります。したがって、動的にリンクされたamd64実行可能ファイルを実行することはできません。
64ビットカーネルと32ビットユーザー領域を実行するのはなぜですか?
- 約3GB以上の物理メモリが使用されます。 (これは唯一の方法ではありません。もう1つの可能性は、PAEをサポートする32ビットカーネルを実行することです。)
- たとえば、ライブOSから起動し、インストールされた64ビットシステムにルートを指定して64ビットバイナリを実行できます。
- 展開のメンテナンスを減らすには、最新のハードウェアにシングルコアを提供し、64ビットにします。
- 64ビット仮想マシンを実行します(一部のVMエンジンでは、64ビットVMを実行するには64ビットカーネルが必要です)。
私はTailsが64ビットシステムを提供していないと思います。 32ビット版の実行可能ファイルをインポートする必要があります。そうでない場合は、別のディストリビューションを使用してください(仮想マシンで利用可能)。
答え2
まだ行っていない場合:chmod
chmod u+x /home/amnesia/myfile
そして最初から「.」を削除してください。ファイルと同じディレクトリにある場合に必要です。
sudo /home/amnesia/myfile
デモは次のとおりです。
答え3
次の点を確認することをお勧めします。
- ランニング
file /home/amnesia/myfile
。これにより、実行するファイルの種類が決まります。 - スクリプトの実行いいえ
sudo
より意味のある情報を入手してください。 - シェルスクリプトのようなものであれば、
set -x
何が起こっているのかを理解するのに役立ちます。sh -x
以下を使用してスクリプトを実行することもできます。 - たぶんShebangスレッドが壊れている可能性があります(例:間違ったソルバー)。貼り付けの出力
head -5 /home/amnesia/myfile
。 - スクリプトに「DOS」改行文字がある可能性があります。もしファイルはDOSの改行を持つスクリプトで簡単または
dos2unix myfile
トリックperl -pi -e 's/\r\n/\n/g' input.file
を実行します。
答え4
私も同じ問題があります。 Debian 7.8 での修正は、次のlsb
パッケージをインストールすることです。
apt-get install lsb
CentOSに同様のパッケージをインストールする必要がありました(どんなパッケージなのか覚えていません)。