Pertanyaan Tidak dapat mengeksekusi file .out, meminta izin ditolak


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

Edit:

Inilah pesan yang saya dapatkan ketika saya mencoba "./a.out".

bash: ./a.out: Permission denied

10
2018-05-23 12:24


asal


Apa output dari ls-l a.out? Apa output dari file a.out? Apakah bisa dieksekusi pada memory stick USB / Harddisk? - JRT
Yang ada di Harddisk. File yang sama dibuat segera setelah proses kompilasi. Saya tidak mengatur parameter lain. - Shamim Hafiz
-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out Apakah output dari ls-l a.out - Shamim Hafiz
Jadi berdasarkan output dari ls-l a.out itu masalah perizinan. Jika kamu melakukan chmod + x a.out lalu coba ./a.out apakah itu dijalankan? Apa output dari umask? - JRT
@JRT: Itu tidak mengeksekusi. Melakukan "chmod + x a.out" tidak memberikan pesan apa pun, tetapi sepertinya tidak memiliki efek apa pun. Mencoba "ls-l a.out" lagi masih menunjukkan hal yang sama. - Shamim Hafiz


Jawaban:


Biasanya, g++ memberikan izin mengeksekusi file yang dibuat. Jika Anda tidak lulus -o pilihan, file akan diberi nama a.out.

Dua kemungkinan alasan mengapa file Anda tidak memiliki bit set eksekusi, dengan solusinya:

  1. Itu nilai umask diatur ke nilai seperti 0133, sehingga mencegah bit eksekusi tidak diatur. Solusi: atur izin secara eksplisit:

    chmod 755 a.out

  2. Filesystem yang Anda kerjakan tidak mendukung perizinan Linux. Ini bisa terjadi jika Anda meletakkan file pada drive flash berformat FAT32. Solusi: backup file dan format ke ext2 atau mount drive dengan fmask=0022 atau umask=0022 (Menghilangkan fmask). Lihat Pasang opsi untuk lemak bagian pada halaman manual dari mount untuk lebih jelasnya.

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

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

15
2018-05-23 18:06



Jawaban ini lebih menarik, hanya untuk menambahkan, cara saya menginstal Ubuntu adalah melalui Windows dan folder bernama dibuat pada drive C (drive instalasi windows). Drive ini diformat sebagai FAT32. Mungkinkah ini ada hubungannya dengan itu? - Shamim Hafiz
Anda telah melakukan instalasi Wubi (C:\Ubuntu telah dibuat). Ini seharusnya tidak menjadi masalah kecuali Anda meletakkan file di "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 menjalankannya sudo chown user file, chmod 755 file, itu tidak akan berhasil. Anda benar-benar membutuhkan filesystem EXT untuk itu. - Lekensteyn
Cerita yang sama, tidak ada sistem file Windows yang mendukung hak akses file Linux. Anda harus meletakkan file pada sistem file yang diformat EXT. - Lekensteyn
Jadi hanya bekerja pada folder yang dimiliki oleh Ubuntu harus melakukan trik, kan? Maksud saya, saya tidak boleh menggunakan folder yang bukan bagian dari Struktur Sistem File Ubuntus? - Shamim Hafiz
Persis, tetaplah di sini ~, Saya buat ~/projects dan meletakkan semua proyek saya di dalamnya, Anda bisa melakukan hal yang sama. - Lekensteyn


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

Periksa sintaks Anda yang Anda gunakan untuk mengkompilasi

misalnya

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

atau mungkin

g++ myfile.cpp -lm -o outputfilename

Anda dapat memeriksa untuk melihat apakah bit executable diatur pada file

ls -l a.out

atau Anda bisa memaksakan bit yang dapat dieksekusi

chmod +x a.out

maka Anda dapat menjalankan file Anda

./a.out

atau sederhananya

a.out

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

yaitu

file a.out

Ini akan melaporkan apa format file - baik skrip atau biner

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

Jika Anda telah mengkompilasi sebagai root (mis. Sudo make), atau memiliki Makefile yang menginstal executable sebagai root maka dapatkah saya menyarankan Anda mendapatkan kembali izin saat pengguna login

yaitu

sudo chown fred:fred a.out

yaitu ganti "fred" dengan id pengguna Anda.


5
2018-05-23 12:29



Terima kasih untuk informasi. Saya sebenarnya login sebagai satu-satunya pengguna, dan saya menganggap saya pengguna utama. Saya tidak yakin, mengapa saya harus 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 legacy dari compiler sehingga menghasilkan nama file yang dapat diprediksi jika Anda tidak memintanya. Ini bukan masalah perizinan, tetapi kesalahpahaman tentang cara kerja kompiler dan C ++. - SpamapS
Linux / Unix tidak bergantung pada ekstensi file untuk menentukan jenis file. Biasanya file yang dapat dieksekusi tidak memiliki ekstensi sama sekali. Juga, format untuk mengeksekusi file tidak berbeda antara shell umumnya. Semua cangkang harus bekerja dengan ./a.out kecuali beberapa cangkang eksotis. - JRT
Gunner - silakan salin dan tempel output lengkap di terminal dimulai dengan perintah kompilasi Anda, diikuti oleh ls-l, chmod + x dan akhirnya eksekusi. Tolong konfirmasi nama Anda dengan mengetik "whoami" - fossfreedom♦


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


4
2018-05-24 15:36





Solusi untuk FAT-filesystem di jawaban pertama

"Ini bisa terjadi jika Anda meletakkan file pada flash drive berformat 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.

Parameter standar mount lain, bagaimanapun, secara efektif melarang eksekusi binari, terutama jika FAT-filesystem di-mount sebagai non-root-user: noexec

Jadi, pasang saja drive yang diformat FAT dengan opsi exec seperti ini:

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

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


0
2018-05-29 01:24





Saya berani bertaruh bahwa program Anda tidak memiliki fungsi 'utama ()', seolah-olah itu, kompiler Anda akan membuat a.out dieksekusi. Sekarang ini hanya file objek penuh kode, tetapi tidak ada entry point. main () adalah nama fungsi khusus di C dan C ++ yang memberi tahu kompilator untuk membuat program, bukan hanya file objek yang dapat dikaitkan dengan program atau pustaka.

Saya akan tertarik untuk mengetahui apa baris perintah yang Anda gunakan untuk menghasilkan file ini, seperti kompiler GNU GCC c ++, 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 membuat perubahan 'void no_main' menjadi 'int main', ini berfungsi:

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

-1
2018-05-23 12:52



Jika dia tidak utama fungsi, itu tidak akan menghubungkan dan oleh karena itu tidak akan menghasilkan a.out mengajukan. - JRT