Tidak dapat menjalankan file .out, mendapatkan izin ditolak

11

Saya telah menulis program C ++ dan memenuhinya untuk menghasilkan file a.out. Namun, setiap kali saya mencoba menjalankannya, saya mendapatkan Izin yang Ditolak. Saya membaca bahwa kita dapat menggunakan sudo, tetapi saya tidak bisa membuatnya bekerja. Saya menggunakan sesuatu seperti, sudo "./a.out" tapi itu juga tidak berhasil.

Edit :

Ini pesan yang saya dapat ketika saya mencoba "./a.out".

bash: ./a.out: Permission denied
Shamim Hafiz
sumber
Apa output dari ls-l a.out ? Apa output file a.out ? Apakah executable pada USB memory stick / Harddisk?
JRT
Ada di Harddisk. File yang sama dibuat segera setelah proses kompilasi. Saya tidak menetapkan parameter lain.
Shamim Hafiz
-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out Adalah output dari ls -l a.out
Shamim Hafiz
Jadi berdasarkan pada output dari ls-l a.out itu masalah izin. Jika Anda melakukan chmod + x a.out lalu coba ./a.out apakah itu menjalankan? Apa output dari umask ?
JRT
@ JRT: Itu tidak mengeksekusi. Melakukan "chmod + x a.out" tidak memberikan pesan apa pun, tetapi sepertinya itu tidak berpengaruh. Mencoba "ls-l a.out" sekali lagi masih menunjukkan hal yang sama.
Shamim Hafiz

Jawaban:

18

Biasanya, g++memberikan file yang dibuat mengeksekusi izin. Jika Anda tidak lulus -oopsi, file akan dinamai a.out.

Dua kemungkinan alasan mengapa file Anda tidak memiliki bit eksekusi, dengan solusi mereka:

  1. Nilai umask diatur ke nilai seperti 0133, sehingga mencegah bit eksekusi dari yang ditetapkan. Solusi: atur izin secara eksplisit:

    chmod 755 a.out
    
  2. Sistem file yang sedang Anda kerjakan tidak mendukung izin Linux. Ini bisa terjadi jika Anda meletakkan file pada flash drive yang diformat FAT32. Solusi: baik buat cadangan file dan format untuk ext2 atau pasang drive dengan fmask=0022atau umask=0022(menghilangkan fmask). Lihat opsi Mount untuk bagian lemak di halaman manual mount untuk detail lebih lanjut.

Untuk skrip bash yang tidak memiliki set bit eksekusi, Anda bisa menjalankan bash file.sh. Fitur seperti itu ada untuk semua file dengan konten yang dapat dieksekusi (file yang dikompilasi dan file dengan #!/path/to/interpreterset baris shebang ). Untuk mengeksekusi file tanpa set bit eksekusi, gunakan file khusus /lib/ld-linux.so.2(atau /lib/ld-linux-x86-64.so.2untuk aplikasi 64-bit) untuk menjalankan program seperti itu:

/lib/ld-linux-x86-64.so.2 a.out
Lekensteyn
sumber
Jawaban ini lebih menarik, hanya untuk menambahkan, cara saya menginstal Ubuntu adalah melalui Windows dan folder bernama dibuat di drive C (drive instalasi windows). Drive ini diformat sebagai FAT32. Mungkinkah ini ada hubungannya dengan itu?
Shamim Hafiz
1
Anda telah melakukan instalasi Wubi ( C:\Ubuntutelah dibuat). Ini seharusnya tidak menjadi masalah kecuali Anda meletakkan file pada "C:" dan bukan instalasi Ubuntu Anda. Jika Anda tidak menggunakan Windows, atau memiliki banyak ruang disk, saya sarankan menginstal Ubuntu pada partisi khusus. Dan lagi, NTFS / FAT32 TIDAK mendukung perizinan Linux, sehingga Anda dapat menjalankan sudo chown user file, chmod 755 fileitu tidak akan bekerja. Anda benar-benar membutuhkan sistem file EXT untuk itu.
Lekensteyn
3
Kisah yang sama, tidak ada sistem file Windows yang mendukung izin file Linux. Anda harus meletakkan file-file itu pada sistem file yang diformat EXT.
Lekensteyn
1
Jadi hanya bekerja pada folder milik Ubuntu harus melakukan trik, bukan? Maksud saya, saya tidak boleh menggunakan folder yang bukan bagian dari Struktur Sistem File Ubuntus?
Shamim Hafiz
3
Tepat, tetap di sini ~, saya membuat ~/projectsdan meletakkan semua proyek saya di dalamnya, Anda bisa melakukan hal yang sama.
Lekensteyn
5

.out adalah ekstensi yang tidak biasa. Biasanya ini biasanya menandakan file "jejak keluaran".

Periksa sintaks yang Anda gunakan untuk kompilasi

misalnya

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

atau mungkin

g++ myfile.cpp -lm -o outputfilename

Anda harus memeriksa untuk melihat apakah bit yang dapat dieksekusi diatur pada file

ls -l a.out

atau Anda bisa memaksa bit yang dapat dieksekusi

chmod +x a.out

maka Anda dapat menjalankan file Anda

./a.out

atau sederhana

a.out

Anda mungkin juga harus memeriksa apakah file output telah ditulis dengan benar sebagai biner

yaitu

file a.out

Ini akan melaporkan format file itu - skrip atau biner

Anda jarang perlu mengeksekusi sebagai root kecuali Anda telah membatasi siapa yang harus dapat menjalankan executable.

Jika Anda telah dikompilasi sebagai root (misalnya sudo make), atau memiliki Makefile yang menginstal executable sebagai root maka dapatkah saya menyarankan Anda mendapatkan kembali izin sebagai pengguna login

yaitu

sudo chown fred:fred a.out

yaitu ganti "fred" dengan id pengguna Anda.

kebebasan fosil
sumber
Terima kasih untuk informasi. Saya sebenarnya login sebagai satu-satunya pengguna, dan saya kira saya adalah pengguna utama. Saya tidak begitu yakin, mengapa saya perlu menggunakan otentikasi administratif. Bagaimana saya bisa menghapus opsi ini sehingga saya selalu dapat menjalankan file.
Shamim Hafiz
diperbarui - semoga untuk memperjelas dan menjawab pertanyaan Anda.
fossfreedom
a.out adalah fitur warisan kompiler sehingga menghasilkan nama file yang dapat diprediksi jika Anda tidak memintanya. Ini bukan masalah izin, tetapi kesalahpahaman tentang cara kerja kompiler dan C ++.
SpamapS
Linux / Unix tidak bergantung pada ekstensi file untuk menentukan tipe file. Biasanya file yang dapat dieksekusi tidak memiliki ekstensi sama sekali. Juga, format file yang dapat dieksekusi tidak berbeda antara shell secara umum. Semua cangkang seharusnya berfungsi dengan ./a.out kecuali cangkang eksotis.
JRT
1
Gunner - silakan salin dan tempel output lengkap di terminal dimulai dengan perintah kompilasi Anda, diikuti oleh ls -l, chmod + x dan akhirnya eksekusi. Harap konfirmasikan nama Anda dengan mengetik "whoami"
fossfreedom
4

cukup salin folder ke folder rumah Anda dan itu akan berfungsi. Anda mungkin mencoba menjalankannya di drive eksternal atau sesuatu.

pengguna65868
sumber
0

Solusi untuk sistem file FAT dalam jawaban pertama

"Ini bisa terjadi jika Anda meletakkan file pada flash drive yang diformat FAT32. Solusi: (...) pasang drive dengan fmask = 0022 atau umask = 0022 (menghilangkan fmask)."

biasanya tidak berfungsi - default untuk umask sebagian besar adalah 0022, jadi ini tidak mengubah apa pun.

Default mount parameter lainnya, bagaimanapun, secara efektif melarang eksekusi binari, terutama jika sistem file FAT di-mount sebagai non-root-user: noexec

Jadi cukup pasang drive yang diformat FAT dengan opsi execseperti ini:

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

(ini biasanya harus dilakukan sebagai root, maka "sudo") dan Anda harus dapat mengeksekusi binari langsung dari sana.

serigala
sumber
-2

Saya berani bertaruh bahwa program Anda tidak memiliki fungsi 'main ()', seolah-olah itu benar, kompiler Anda akan membuat a.out dapat dieksekusi. Sekarang ini hanya file objek yang penuh kode, tetapi tidak ada titik masuk. main () adalah nama fungsi khusus dalam C dan C ++ yang memberitahu kompiler untuk membuat program, bukan hanya file objek yang dapat ditautkan ke program atau pustaka.

Saya tertarik untuk mengetahui baris perintah apa yang Anda gunakan untuk menghasilkan file ini, karena kompiler c ++ GNU GCC, g ++, tidak akan membiarkan saya membuat program sederhana tanpa fungsi utama:

#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

Namun jika saya melakukan perubahan 'void no_main' menjadi 'int main' itu berfungsi:

$ g++ hello.cc
$ ./a.out
Hello World
SpamapS
sumber
5
Jika dia tidak memiliki fungsi utama , itu tidak akan terhubung dan karenanya tidak akan menghasilkan file a.out .
JRT