ไม่สามารถเรียกใช้ไฟล์. out ได้รับการปฏิเสธสิทธิ์


11

ฉันได้เขียนโปรแกรม C ++ และปฏิบัติตามเพื่อสร้างไฟล์ a.out อย่างไรก็ตามเมื่อใดก็ตามที่ฉันพยายามเรียกใช้ฉันได้รับสิทธิ์ถูกปฏิเสธ ฉันอ่านว่าเราสามารถใช้ sudo ได้ แต่ฉันก็ใช้งานไม่ได้ ฉันใช้บางอย่างเช่นsudo "./a.out"แต่นั่นก็ไม่ทำงานเช่นกัน

แก้ไข :

นี่คือข้อความที่ฉันได้รับเมื่อฉันลอง "./a.out"

bash: ./a.out: Permission denied

ผลลัพธ์ของls -l a.outคืออะไร? ผลลัพธ์ของไฟล์ a.outคืออะไร? สามารถใช้งานได้กับ Memory Stick USB หรือไม่?
JRT

มันอยู่ใน Harddisk ไฟล์เดียวกันนี้สร้างขึ้นในไม่ช้าหลังจากกระบวนการรวบรวม ฉันไม่ได้ตั้งค่าพารามิเตอร์อื่น ๆ
Shamim Hafiz

-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 น. เอาท์พุทของ 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++ให้สิทธิ์ในการเรียกใช้ไฟล์ที่สร้างขึ้น หากคุณไม่ได้ผ่านการเลือกไฟล์จะถูกตั้งชื่อ-oa.out

สองสาเหตุที่เป็นไปได้ที่ไฟล์ของคุณไม่มีชุดบิตรันไทม์พร้อมโซลูชัน:

  1. ค่า umaskถูกกำหนดเป็นค่าเช่น 0133 จึงช่วยป้องกันบิตดำเนินการจากการเป็นชุด วิธีแก้ไข: ตั้งค่าการอนุญาตอย่างชัดเจน:

    chmod 755 a.out
    
  2. ระบบไฟล์ที่คุณทำงานไม่รองรับการอนุญาต Linux อาจเป็นกรณีนี้หากคุณวางไฟล์ในแฟลชไดรฟ์ที่ฟอร์แมตด้วย FAT32 วิธีแก้ไข: สำรองไฟล์และฟอร์แมตเป็น ext2 หรือเมานต์ไดรฟ์ด้วยfmask=0022หรือumask=0022(ละเว้นfmask) ดูตัวเลือกเมานท์สำหรับส่วนไขมันบนหน้าคู่มือเมานต์สำหรับรายละเอียดเพิ่มเติม

bash file.shสำหรับสคริปต์ทุบตีซึ่งไม่ได้มีการดำเนินการชุดบิตคุณสามารถเรียกใช้ คุณลักษณะดังกล่าวมีอยู่สำหรับไฟล์ทั้งหมดที่มีเนื้อหาที่ปฏิบัติการได้ (ไฟล์ที่รวบรวมและไฟล์ที่มี#!/path/to/interpreterชุดบรรทัด Shebang ) ในการรันไฟล์โดยไม่ตั้งค่าบิตรันให้ใช้ไฟล์พิเศษ/lib/ld-linux.so.2(หรือ/lib/ld-linux-x86-64.so.2สำหรับแอปพลิเคชัน 64 บิต) เพื่อเรียกใช้โปรแกรมดังกล่าว

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

คำตอบนี้น่าสนใจยิ่งขึ้นเพียงเพิ่มวิธีที่ฉันติดตั้ง Ubuntu ผ่าน Windows และมีการสร้างชื่อโฟลเดอร์บนไดรฟ์ C (ไดรฟ์ติดตั้ง windows) ไดรฟ์นี้ได้รับการฟอร์แมตเป็น FAT32 สิ่งนี้เกี่ยวข้องกับสิ่งนั้นหรือไม่?
Shamim Hafiz

1
คุณทำการติดตั้ง Wubi เสร็จสิ้นแล้ว ( C:\Ubuntuได้ถูกสร้างขึ้นแล้ว) สิ่งนี้ไม่ควรเป็นปัญหาหากคุณไม่ใส่ไฟล์ใน "C:" และไม่ใช่การติดตั้ง Ubuntu ของคุณ หากคุณไม่ได้ใช้ Windows หรือมีเนื้อที่ว่างบนดิสก์มากฉันขอแนะนำให้ติดตั้ง Ubuntu บนพาร์ติชันเฉพาะ และอีกครั้ง, NTFS / FAT32 ไม่สนับสนุนสิทธิ์ของลินุกซ์เพื่อให้คุณสามารถทำงานได้sudo chown user file, chmod 755 fileมันจะไม่ทำงาน คุณต้องการระบบไฟล์ EXT จริงๆ
Lekensteyn

3
เรื่องเดียวกันไม่มีระบบไฟล์ Windows รองรับไฟล์ลินุกซ์ คุณควรวางไฟล์ในระบบไฟล์ที่จัดรูปแบบ EXT
Lekensteyn

1
ดังนั้นเพียงแค่ทำงานกับโฟลเดอร์ที่เป็นของอูบุนตูควรทำตามขั้นตอนใช่ไหม? ฉันหมายความว่าฉันไม่ควรใช้โฟลเดอร์ที่ไม่ได้เป็นส่วนหนึ่งของโครงสร้างระบบไฟล์ของ Ubuntus?
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" ด้วยรหัสผู้ใช้ของคุณ


ขอบคุณสำหรับข้อมูล. ฉันเข้าสู่ระบบในฐานะผู้ใช้คนเดียวและฉันคิดว่าฉันเป็นผู้ใช้หลัก ฉันไม่แน่ใจว่าทำไมฉันจึงต้องใช้การตรวจสอบสิทธิ์ระดับผู้ดูแล ฉันจะลบตัวเลือกนี้ได้อย่างไรเพื่อให้สามารถเรียกใช้ไฟล์ได้ตลอดเวลา
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

ดังนั้นเพียงแค่ติดตั้งไดรฟ์ที่มีรูปแบบ FAT ด้วยตัวเลือกexecดังนี้:

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

(โดยปกติจะต้องทำในฐานะรูทดังนั้น "sudo") และคุณควรจะสามารถรันไบนารีได้โดยตรงจากที่นั่น


-2

ฉันพนันได้เลยว่าโปรแกรมของคุณไม่มีฟังก์ชั่น 'main ()' ราวกับว่าเป็นเช่นนั้นคอมไพเลอร์ของคุณจะทำให้ a.out สามารถทำงานได้ ตอนนี้มันเป็นแค่ไฟล์อ็อบเจ็กต์ที่เต็มไปด้วยโค้ด แต่ไม่มีจุดเข้า main () เป็นชื่อฟังก์ชั่นพิเศษใน C และ C ++ ที่บอกคอมไพเลอร์ในการสร้างโปรแกรมมากกว่าเพียงแค่ไฟล์อ็อบเจ็กต์ที่สามารถเชื่อมโยงกับโปรแกรมหรือไลบรารี

ฉันสนใจที่จะรู้ว่าบรรทัดคำสั่งที่คุณใช้สร้างไฟล์นี้เนื่องจากคอมไพเลอร์ c ++ ของ GNU GCC, 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.