web-dev-qa-db-ja.com

.outファイルを実行できず、アクセス許可が拒否されました

C++プログラムを作成し、コンパイルしてa.outファイルを作成しました。ただし、実行しようとすると、許可が拒否されます。 Sudoを使用できることを読みましたが、Sudoを動作させることはできません。 Sudo "./a.out"のようなものを使用しますが、それも機能しません。

編集

「./a.out」を試すと表示されるメッセージを次に示します。

bash: ./a.out: Permission denied
11
Shamim Hafiz

通常、g++は作成されたファイルに実行許可を与えます。 -oオプションを渡さない場合、ファイルの名前はa.outになります。

ファイルに実行ビットが設定されていない2つの理由とその解決策:

  1. mask value は0133のような値に設定され、実行ビットが設定されないようにします。解決策:許可を明示的に設定します。

    chmod 755 a.out
    
  2. 作業中のファイルシステムはLinuxの許可をサポートしていません。これは、FAT32形式のフラッシュドライブにファイルを配置する場合に該当する可能性があります。解決策:ファイルをバックアップしてext2にフォーマットするか、fmask=0022またはumask=0022fmaskを省略)でドライブをマウントします。詳細については、 マウントのマニュアルページfatのマウントオプションセクションを参照してください。

実行ビットが設定されていないbashスクリプトの場合、bash file.shを実行できます。このような機能は、実行可能コンテンツを含むすべてのファイル(コンパイル済みファイルおよびShebang行#!/path/to/interpreterセットを持つファイル)に存在します。実行ビットを設定せずにファイルを実行するには、特殊ファイル/lib/ld-linux.so.2(または64ビットアプリケーションの場合は/lib/ld-linux-x86-64.so.2)を使用して、このようなプログラムを実行します。

/lib/ld-linux-x86-64.so.2 a.out
18
Lekensteyn

.outは異常な拡張子です。通常、これは通常「トレース出力」ファイルを意味します。

コンパイルに使用している構文を確認してください

例えば.

gcc myfile.c /usr/lib/libsomelibrary.a -o outputfilename

または多分

g++ myfile.cpp -lm -o outputfilename

ファイルに実行可能ビットが設定されているかどうかを確認する必要があります

ls -l a.out

または、単に実行可能ビットを強制することができます

chmod +x a.out

その後、ファイルを実行できます

./a.out

または単に

a.out

また、おそらく出力ファイルがバイナリとして正しく書き込まれていることを確認する必要があります

つまり.

file a.out

これにより、ファイルの形式(スクリプトまたはバイナリ)が報告されます。

実行可能ファイルを実行できるユーザーを制限していない限り、rootとして実行する必要はほとんどありません。

ルートとしてコンパイルした場合(例:Sudo make)、または実行ファイルをルートとしてインストールしたMakefileがある場合、ログインしているユーザーとして許可を取り戻すことをお勧めします

つまり.

Sudo chown fred:fred a.out

つまり、「fred」をユーザーIDに置き換えます。

5
fossfreedom

フォルダーをホームフォルダーにコピーするだけで機能します。外付けドライブなどで実行しようとしている可能性があります。

4
user65868

最初の答えのFATファイルシステムの回避策

「これは、FAT32フォーマットのフラッシュドライブにファイルを配置する場合に該当する可能性があります。解決策:(...)fmask = 0022またはumask = 0022(fmaskを省略)でドライブをマウントします。

通常は機能しません-umaskのデフォルトはほとんどが0022な​​ので、これは何も変更しません。

ただし、別のマウントパラメータのデフォルトは、特にFATファイルシステムが非ルートユーザーとしてマウントされている場合、バイナリの実行を事実上禁止します:noexec

そのため、オプションexecを指定してFAT形式のドライブをマウントするだけです。

Sudo mount -o exec /dev/sd.. /mountpoint

(これは通常、root、つまり「Sudo」として実行する必要があります)、そこからバイナリを直接実行できるはずです。

0
wolfy