.out 파일을 실행할 수 없어 권한이 거부되었습니다.


11

C ++ 프로그램을 작성하고이를 준수하여 a.out 파일을 생성했습니다. 그러나 실행할 때마다 권한이 거부됩니다. 우리가 sudo를 사용할 수 있다는 것을 읽었지만 제대로 작동하지는 않습니다. sudo "./a.out" 과 같은 것을 사용 하지만 작동하지 않습니다.

편집 :

다음은 "./a.out"을 시도 할 때 나타나는 메시지입니다.

bash: ./a.out: Permission denied

ls -l a.out 의 출력은 무엇입니까 ? 파일 a.out 의 출력은 무엇입니까 ? 실행 파일이 USB 메모리 스틱 / 하드 디스크에 있습니까?
JRT

하드 디스크에 있습니다. 컴파일 프로세스 직후에 생성 된 것과 동일한 파일입니다. 다른 매개 변수를 설정하지 않았습니다.
Shamim Hafiz

-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out ls -l a.out
Shamim Hafiz

따라서 ls -l a.out 의 출력을 기반으로 권한 문제입니다. 당신이 할 경우 chmod를 + X의 a.out 다음 시도 ./a.out 이 실행 하는가? umask 의 출력은 무엇입니까 ?
JRT

@ JRT : 실행되지 않습니다. "chmod + x a.out"을 수행해도 메시지가 나타나지 않지만 효과가없는 것 같습니다. "ls -l a.out"을 다시 시도해도 여전히 같은 내용이 표시됩니다.
Shamim Hafiz

답변:


19

일반적으로 g++작성된 파일 실행 권한을 제공합니다. -o옵션을 전달하지 않으면 파일 이름이으로 지정 a.out됩니다.

솔루션에 파일에 실행 비트 세트가없는 두 가지 이유는 다음과 같습니다.

  1. 의 umask 값 함으로써 집합으로서의에서 실행 비트 방지 0133과 같은 값으로 설정된다. 솔루션 : 권한을 명시 적으로 설정하십시오.

    chmod 755 a.out
    
  2. 작업중인 파일 시스템이 Linux 권한을 지원하지 않습니다. FAT32 형식의 플래시 드라이브에 파일을 넣는 경우가 이에 해당합니다. 해결 방법 : 파일을 백업하고 외부 2로 포맷하거나 함께 드라이브를 탑재하거나 fmask=0022또는 umask=0022(생략 fmask). 자세한 내용은 마운트 매뉴얼 페이지의 지방 장착 옵션 섹션 을 참조하십시오.

실행 비트가 설정되지 않은 bash 스크립트의 경우을 실행할 수 있습니다 bash file.sh. 이러한 기능은 실행 가능 컨텐츠가있는 모든 파일 (컴파일 된 파일 및 shebang 라인 #!/path/to/interpreter세트 가있는 파일 )에 존재합니다. 실행 비트 세트없이 파일을 실행하려면 특수 파일 /lib/ld-linux.so.2(또는 /lib/ld-linux-x86-64.so.264 비트 응용 프로그램)을 사용하여 이러한 프로그램을 실행하십시오.

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

이 답변은 Ubuntu를 설치 한 방식이 Windows를 통해 수행되고 C 드라이브 (Windows 설치 드라이브)에 폴더가 생성 된 것보다 더 흥미 롭습니다. 이 드라이브는 FAT32로 포맷되어 있습니다. 이것과 관련이있을 수 있습니까?
Shamim Hafiz

1
Wubi 설치를 완료했습니다 ( C:\Ubuntu작성되었습니다). 우분투 설치가 아닌 "C :"에 파일을 넣지 않으면 문제가되지 않습니다. Windows를 사용하지 않거나 디스크 공간이 충분한 경우 전용 파티션에 Ubuntu를 설치하는 것이 좋습니다. 그리고 다시, NTFS / FAT32는 실행할 수 있도록, 리눅스 권한을 지원하지 않습니다 sudo chown user file, chmod 755 file그것은 작동하지 않습니다. 이를 위해서는 EXT 파일 시스템이 필요합니다.
Lekensteyn

3
같은 이야기로, 리눅스 파일 권한을 지원하는 Windows 파일 시스템은 없습니다. 파일은 EXT 형식의 파일 시스템에 배치해야합니다.
Lekensteyn

1
따라서 우분투에 속한 폴더에서 작업하는 것만으로도 트릭을 수행해야합니까? 우분투 파일 시스템 구조의 일부가 아닌 폴더를 사용해서는 안됩니까?
Shamim Hafiz

3
정확히,에 머물러 있으면 모든 프로젝트를 ~만들고 ~/projects그 안에 넣습니다. 같은 일을 할 수 있습니다.
Lekensteyn

5

.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

파일 형식이 무엇인지보고합니다 (스크립트 또는 이진).

실행 파일을 실행할 수있는 사람을 제한하지 않으면 루트로 실행할 필요가 거의 없습니다.

루트로 컴파일했거나 (예 : sudo make) 실행 파일을 루트로 설치 한 Makefile이있는 경우 사용자가 로그인 할 때 권한을 다시 얻는 것이 좋습니다

sudo chown fred:fred a.out

즉 "fred"를 사용자 ID로 바꿉니다.


정보 주셔서 감사합니다. 실제로 유일한 사용자로 로그인했으며 기본 사용자라고 가정합니다. 어쨌든 관리 인증을 사용해야하는 이유가 확실하지 않습니다. 항상 파일을 실행할 수 있도록이 옵션을 어떻게 제거 할 수 있습니까?
Shamim Hafiz

업데이트-귀하의 질문을 명확히하고 답변하기를 바랍니다.
fossfreedom

a.out은 컴파일러의 레거시 기능이므로 요청하지 않은 경우 예측 가능한 파일 이름을 생성합니다. 이것은 권한 문제가 아니라 컴파일러와 C ++의 작동 방식에 대한 오해입니다.
SpamapS

Linux / Unix는 파일 확장자를 사용하여 파일 유형을 결정하지 않습니다. 일반적으로 실행 파일은 확장자가 없습니다. 또한 파일을 실행하는 형식은 일반적으로 셸마다 다르지 않습니다. 이국적인 쉘이 아닌 한 모든 쉘은 ./a.out으로 작동해야합니다 .
JRT

1
Gunner-컴파일 명령으로 시작하여 ls -l, chmod + x 및 마지막으로 실행으로 터미널에 완전한 출력을 복사하여 붙여 넣으십시오. "whoami"
fossfreedom

4

폴더를 홈 폴더에 복사하면 작동합니다. 외부 드라이브 나 다른 장치에서 실행하려고 시도했을 수 있습니다.


0

첫 번째 답변에서 FAT 파일 시스템에 대한 해결 방법

"파일을 FAT32 형식의 플래시 드라이브에 저장하는 경우에 해당 될 수 있습니다. 해결책 : (...) fmask = 0022 또는 umask = 0022 (fmask 생략)로 드라이브를 마운트하십시오."

일반적으로 작동하지 않습니다. umask의 기본값은 대부분 0022이므로 아무 것도 변경하지 않습니다.

그러나 다른 마운트 매개 변수의 기본값은 특히 FAT 파일 시스템이 루트가 아닌 사용자로 마운트 된 경우 바이너리 실행을 효과적으로 허용하지 않습니다. noexec

따라서 exec다음과 같은 옵션으로 FAT 형식의 드라이브를 마운트하십시오 .

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

(이는 일반적으로 루트로 수행되므로 "스도") 바이너리를 직접 실행할 수 있어야합니다.


-2

마치 프로그램이 'main ()'함수를 가지고 있지 않은 것처럼 컴파일러가 .out을 실행 가능하게 만들었습니다. 지금은 코드로 가득 찬 객체 파일이지만 진입 점이 없습니다. main ()은 C 또는 C ++의 특수 함수 이름으로, 컴파일러는 프로그램이나 라이브러리에 링크 될 수있는 객체 파일이 아닌 프로그램을 작성하도록 지시합니다.

GNU GCC의 c ++ 컴파일러 인 g ++가 주 함수를 사용하지 않고 간단한 프로그램을 만들 수 없기 때문에이 파일을 생성하는 데 사용한 명령 줄을 알고 싶습니다.

#include <iostream>

using namespace std;

void no_main()
{
  cout << "Hello World" << endl;
}

$ g++ hello.cc
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 21
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

그러나 'void no_main'을 'int main'으로 변경하면 작동합니다.

$ g++ hello.cc
$ ./a.out
Hello World

5
그는 더 없었다 경우 주요 기능, 그것은 연결하지 것이며 따라서는 생산하지 않을 의 a.out 파일을.
JRT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.