No se pueden ejecutar archivos .out, obteniendo permiso denegado

11

He escrito un programa C ++ y lo he cumplido para producir un archivo .out. Sin embargo, cada vez que intento ejecutarlo, obtengo permiso denegado. Leí que podemos usar sudo, pero no puedo hacer que funcione. Yo uso algo como, sudo "./a.out" pero eso tampoco funciona.

Editar :

Aquí está el mensaje que recibo cuando intento "./a.out".

bash: ./a.out: Permission denied
Shamim Hafiz
fuente
¿Cuál es la salida de ls -l a.out ? ¿Cuál es la salida del archivo a.out ? ¿El ejecutable está en una memoria USB / disco duro?
JRT
Está en el disco duro. Es el mismo archivo creado poco después del proceso de compilación. No configuré ningún otro parámetro.
Shamim Hafiz
-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out Es la salida de ls -l a.out
Shamim Hafiz
Entonces, según el resultado de ls -l a.out , es un problema de permisos. Si haces chmod + x a.out , prueba ./a.out ¿se ejecuta? ¿Cuál es el resultado de umask ?
JRT
@JRT: no se ejecuta. Hacer "chmod + x a.out" no da ningún mensaje, pero parece que no tiene ningún efecto. Intentar "ls -l a.out" nuevamente muestra lo mismo.
Shamim Hafiz

Respuestas:

19

Por lo general, g++otorga permisos de ejecución al archivo creado. Si no pasa la -oopción, se nombrará el archivo a.out.

Dos posibles razones por las que su archivo no tiene el bit de ejecución establecido, con sus soluciones:

  1. El valor de umask se establece en un valor como 0133, evitando así que se establezca el bit de ejecución. Solución: establezca los permisos explícitamente:

    chmod 755 a.out
    
  2. El sistema de archivos en el que está trabajando no admite permisos de Linux. Este podría ser el caso si coloca archivos en una unidad flash con formato FAT32. Solución: haga una copia de seguridad de los archivos y formatee en ext2 o monte la unidad con fmask=0022u umask=0022(omitiendo fmask). Consulte la sección Opciones de montaje para grasa en la página del manual de montaje para obtener más detalles.

Para las secuencias de comandos bash que no tienen el bit de ejecución establecido, puede ejecutar bash file.sh. Dicha característica existe para todos los archivos con contenido ejecutable (archivos compilados y archivos con un #!/path/to/interpreterconjunto de líneas shebang ). Para ejecutar archivos sin el conjunto de bits de ejecución, use el archivo especial /lib/ld-linux.so.2(o /lib/ld-linux-x86-64.so.2para aplicaciones de 64 bits) para ejecutar dicho programa:

/lib/ld-linux-x86-64.so.2 a.out
Lekensteyn
fuente
Esta respuesta es más interesante, solo para agregar, la forma en que instalé Ubuntu es sobre Windows y se creó una carpeta llamada en la unidad C (unidad de instalación de Windows). Esta unidad está formateada como FAT32. ¿Podría esto tener algo que ver con eso?
Shamim Hafiz
1
Has realizado una instalación de Wubi ( C:\Ubuntuse ha creado). Esto no debería ser un problema a menos que esté poniendo archivos en "C:" y no en su instalación de Ubuntu. Si no está utilizando Windows, o tiene mucho espacio en disco, le sugiero que instale Ubuntu en una partición dedicada. Y nuevamente, NTFS / FAT32 NO admite permisos de Linux, por lo que puede ejecutarlo sudo chown user file, chmod 755 fileno funcionará. Realmente necesitas un sistema de archivos EXT para eso.
Lekensteyn
3
La misma historia, ninguno de los sistemas de archivos de Windows admite permisos de archivos de Linux. Debe colocar los archivos en un sistema de archivos con formato EXT.
Lekensteyn
1
Entonces, simplemente trabajar en una carpeta que pertenece a Ubuntu debería hacer el truco, ¿verdad? Quiero decir, ¿no debería usar carpetas que no sean parte de la Estructura del sistema de archivos de Ubuntus?
Shamim Hafiz
3
Exactamente, solo quédate ~, creo ~/projectsy pongo todos mis proyectos en él, podrías hacer lo mismo.
Lekensteyn
5

.out es una extensión inusual. Por lo general, esto normalmente significaría un archivo de "salida de rastreo".

Verifique la sintaxis que está utilizando para compilar

p.ej

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

o tal vez

g++ myfile.cpp -lm -o outputfilename

Puede examinar para ver si el bit ejecutable está establecido en el archivo

ls -l a.out

o simplemente puedes forzar el bit ejecutable

chmod +x a.out

entonces puedes ejecutar tu archivo

./a.out

o simplemente

a.out

Quizás también deba verificar que el archivo de salida se haya escrito correctamente como binario

es decir

file a.out

Esto informará de qué formato es el archivo, ya sea un script o un binario

Rara vez necesita ejecutar como root a menos que haya restringido quién debería poder ejecutar el ejecutable.

Si compiló como root (por ejemplo, sudo make), o tiene un Makefile que instaló el ejecutable como root, ¿puedo sugerirle que recupere el permiso cuando el usuario inició sesión?

es decir

sudo chown fred:fred a.out

es decir, reemplace "fred" con su identificación de usuario.

fossfreedom
fuente
Gracias por la información. De hecho, he iniciado sesión como el único usuario y supongo que soy el usuario principal. No estoy muy seguro de por qué necesito usar autenticación administrativa de todos modos. ¿Cómo podría eliminar esta opción para poder ejecutar siempre los archivos?
Shamim Hafiz
actualizado - con suerte para aclarar y responder a su pregunta.
fossfreedom
a.out es una característica heredada del compilador, por lo que produce un nombre de archivo predecible si no solicitó uno. Este no es un problema de permisos, sino un malentendido de cómo funcionan los compiladores y C ++.
SpamapS
Linux / Unix no se basa en extensiones de archivo para determinar el tipo de archivo. Normalmente los archivos ejecutables no tienen extensión alguna. Además, el formato para ejecutar un archivo no difiere entre shells en general. Todas las conchas deberían funcionar para encontrar con ./a.out a menos que sea una concha exótica.
JRT
1
Artillero: copie y pegue la salida completa en el terminal comenzando con su comando de compilación, seguido de ls -l, chmod + x y finalmente la ejecución. Confirme su nombre escribiendo "whoami"
fossfreedom
4

simplemente copie la carpeta a su carpeta de inicio y funcionará. Probablemente esté intentando ejecutarlo en una unidad externa o algo así.

usuario65868
fuente
0

La solución para los sistemas de archivos FAT en la primera respuesta

"Este podría ser el caso si coloca archivos en una unidad flash con formato FAT32. Solución: (...) monte la unidad con fmask = 0022 o umask = 0022 (omitiendo fmask)".

normalmente no funciona: el valor predeterminado para umask es principalmente 0022 de todos modos, por lo que esto no cambia nada.

Sin embargo, el valor predeterminado de otro parámetro de montaje no permite la ejecución de archivos binarios, especialmente si el sistema de archivos FAT está montado como usuario no root: noexec

Así que simplemente monte unidades con formato FAT con la opción de esta execmanera:

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

(esto normalmente debe hacerse como root, de ahí el "sudo") y debería poder ejecutar binarios directamente desde allí.

lobuno
fuente
-2

Apostaría a que su programa no tiene una función 'main ()', como si lo tuviera, su compilador habría hecho un ejecutable. En este momento es solo un archivo objeto lleno de código, pero no hay un punto de entrada. main () es un nombre de función especial en C y C ++ que le dice al compilador que cree un programa en lugar de solo archivos de objetos que pueden vincularse a un programa o biblioteca.

Me interesaría saber qué línea de comando usó para producir este archivo, ya que el compilador c ++ de GNU GCC, g ++, no me permitirá crear un programa simple sin una función principal:

#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

Sin embargo, si hago el cambio 'void no_main' a 'int main' funciona:

$ g++ hello.cc
$ ./a.out
Hello World
SpamapS
fuente
55
Si no tuviera una función principal , no se vincularía y, por lo tanto, no produciría un archivo a.out .
JRT