Não é possível executar arquivos .out, obtendo permissão negada

11

Eu escrevi um programa em C ++ e o cumpri para produzir um arquivo .out. No entanto, sempre que tento executá-lo, recebo Permissão Negada. Eu li que podemos usar o sudo, mas não consigo fazê-lo funcionar. Eu uso algo como, sudo "./a.out", mas isso também não funciona.

Editar :

Aqui está a mensagem que recebo quando tento "./a.out".

bash: ./a.out: Permission denied
Shamim Hafiz
fonte
Qual é a saída de ls -l a.out ? Qual é a saída do arquivo a.out ? O executável está em um cartão de memória USB / disco rígido?
JRT
Está no disco rígido. É o mesmo arquivo criado logo após o processo de compilação. Eu não defini nenhum outro parâmetro.
Shamim Hafiz
-rw ------- 1 shamimhafiz shamimhafiz 7721 2011-05-22 23:30 a.out é a saída de ls -l a.out
Shamim Hafiz
Portanto, com base na saída de ls -l a.out , é um problema de permissões. Se você executar chmod + x a.out , tente ./a.out será executado? Qual é a saída de umask ?
JRT
@JRT: Não é executado. Fazer "chmod + x a.out" não dá nenhuma mensagem, mas parece que não tem efeito. Tentar "ls -l a.out" novamente mostra a mesma coisa.
Shamim Hafiz

Respostas:

18

Geralmente, g++concede permissões de execução ao arquivo criado. Se você não passar a -oopção, o arquivo será nomeado a.out.

Duas possíveis razões pelas quais seu arquivo não possui o bit de execução definido, com suas soluções:

  1. O valor umask é definido como um valor como 0133, impedindo que o bit de execução seja definido. Solução: defina as permissões explicitamente:

    chmod 755 a.out
    
  2. O sistema de arquivos no qual você está trabalhando não suporta permissões do Linux. Pode ser esse o caso se você estiver colocando arquivos em uma unidade flash formatada em FAT32. Solução: faça backup dos arquivos e formate-os para ext2 ou monte a unidade com fmask=0022ou umask=0022(omitindo fmask). Consulte a seção Opções de montagem para gordura na página manual de montagem para obter mais detalhes.

Para scripts bash que não possuem o bit de execução definido, você pode executar bash file.sh. Esse recurso existe para todos os arquivos com conteúdo executável (arquivos compilados e arquivos com um #!/path/to/interpreterconjunto de linhas shebang ). Para executar arquivos sem o conjunto de bits de execução, use o arquivo especial /lib/ld-linux.so.2(ou /lib/ld-linux-x86-64.so.2para aplicativos de 64 bits) para executar um programa:

/lib/ld-linux-x86-64.so.2 a.out
Lekensteyn
fonte
Esta resposta é mais interessante, apenas para adicionar, a maneira como eu instalei o Ubuntu é sobre o Windows e uma pasta chamada foi criada na unidade C (unidade de instalação do Windows). Esta unidade está formatada como FAT32. Isso poderia ter algo a ver com isso?
Shamim Hafiz
1
Você fez uma instalação do Wubi ( C:\Ubuntufoi criada). Isso não deve ser um problema, a menos que você esteja colocando os arquivos em "C:" e não a instalação do Ubuntu. Se você não estiver usando o Windows ou tiver bastante espaço em disco, sugiro instalar o Ubuntu em uma partição dedicada. E, novamente, o NTFS / FAT32 NÃO suporta permissões do Linux; portanto, você pode executar sudo chown user file, chmod 755 filenão funcionará. Você realmente precisa de um sistema de arquivos EXT para isso.
Lekensteyn
3
A mesma história, nenhum dos sistemas de arquivos do Windows suporta permissões de arquivo do Linux. Você deve colocar os arquivos em um sistema de arquivos EXT formatado.
Lekensteyn
1
Então, simplesmente trabalhar em uma pasta que pertence ao Ubuntu deve fazer o truque, certo? Quero dizer, não devo usar pastas que não fazem parte da estrutura do sistema de arquivos Ubuntus?
Shamim Hafiz
3
Exatamente, apenas fique lá ~, eu crio ~/projectse coloquei todos os meus projetos nele, você poderia fazer a mesma coisa.
Lekensteyn
5

.out é uma extensão incomum. Normalmente, isso normalmente significa um arquivo de "saída de rastreamento".

Verifique sua sintaxe que você está usando para compilar

por exemplo

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

ou talvez

g++ myfile.cpp -lm -o outputfilename

Você pode examinar para ver se o bit executável está definido no arquivo

ls -l a.out

ou você pode apenas forçar o bit executável

chmod +x a.out

então você pode executar seu arquivo

./a.out

ou simplesmente

a.out

Você também deve verificar se o arquivo de saída foi gravado corretamente como um arquivo binário.

ie

file a.out

Isso informará qual o formato do arquivo - um script ou um binário

Você raramente precisa executar como root, a menos que tenha restringido quem deve executar o executável.

Se você compilou como root (por exemplo, sudo make) ou possui um Makefile que instalou o executável como root, posso sugerir que você recupere a permissão à medida que o usuário efetuou login

ie

sudo chown fred:fred a.out

ou seja, substitua "fred" pelo seu ID de usuário.

liberdade de expressão
fonte
Obrigado pela informação. Na verdade, estou logado como o único usuário e presumo que sou o usuário principal. Não sei ao certo por que preciso usar a autenticação administrativa. Como eu poderia remover essa opção para que eu possa sempre executar os arquivos.
Shamim Hafiz
atualizado - esperamos esclarecer e responder sua pergunta.
fossfreedom
o a.out é um recurso herdado do compilador, portanto produz um nome de arquivo previsível se você não solicitou um. Este não é um problema de permissões, mas um mal-entendido de como os compiladores e o C ++ funcionam.
SpamapS
O Linux / Unix não depende de extensões de arquivo para determinar o tipo de arquivo. Arquivos normalmente executáveis ​​não têm extensão alguma. Além disso, o formato para arquivo executável não difere geralmente entre os shells. Todas as conchas devem funcionar com ./a.out, a menos que seja uma concha exótica.
JRT
1
Artilheiro - copie e cole a saída completa no terminal começando com o seu comando compile, seguido pelo ls -l, chmod + x e, finalmente, a execução. Por favor, confirme seu nome digitando "whoami"
fossfreedom
4

basta copiar a pasta para sua pasta pessoal e ela funcionará. Você provavelmente está tentando executá-lo em uma unidade externa ou algo assim.

user65868
fonte
0

A solução alternativa para sistemas de arquivos FAT na primeira resposta

"Este pode ser o caso se você estiver colocando arquivos em uma unidade flash formatada em FAT32. Solução: (...) monte a unidade com fmask = 0022 ou umask = 0022 (omitindo o fmask)."

normalmente não funciona - o padrão para umask geralmente é 0022 de qualquer maneira, portanto, isso não altera nada.

O padrão de outro parâmetro de montagem, no entanto, desabilita efetivamente a execução de binários, especialmente se o sistema de arquivos FAT estiver montado como usuário não raiz: noexec

Portanto, basta montar unidades formatadas em FAT com a opção da seguinte execforma:

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

(isso normalmente deve ser feito como root, daí o "sudo") e você deve poder executar binários diretamente a partir daí.

lobo
fonte
-2

Aposto que seu programa não possui uma função 'main ()', como se tivesse, seu compilador tornaria a.out executável. No momento, é apenas um arquivo de objeto cheio de código, mas não há ponto de entrada. main () é um nome de função especial em C e C ++ que informa ao compilador para criar um programa em vez de apenas arquivos de objetos que podem ser vinculados a um programa ou biblioteca.

Eu estaria interessado em saber qual linha de comando você usou para produzir este arquivo, pois o compilador c ++ do GNU GCC, g ++, não me permite criar um programa simples sem uma função 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

No entanto, se eu fizer a alteração 'void no_main' para 'int main', funcionará:

$ g++ hello.cc
$ ./a.out
Hello World
SpamapS
fonte
5
Se ele não tivesse uma função principal , ele não seria vinculado e, portanto, não produziria um arquivo a.out .
JRT