Eu tenho um foo.sh
arquivo no meu diretório atual. Se eu tentar executar ./foo.sh
, recebo:
-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied
Mas se eu correr /bin/sh ./foo.sh
, tudo corre bem.
Como posso corrigir isso para que eu possa executar ./foo.sh
e o execute automaticamente com / bin / sh?
Edit: Ok, este é o Chrome OS e esta pasta específica é montada noexec
. Aparentemente, isso frustra a capacidade de apenas correr ./foo.sh
; mas porque Por que ainda posso correr sh foo.sh
para conseguir exatamente a mesma coisa? Que segurança, então, noexec
dá?
noexec
funciona sua mágica.Respostas:
O
noexec
sinalizador será aplicado adequadamente aos scripts, porque esse seria o comportamento "esperado".No entanto, a configuração
noexec
apenas interrompe as pessoas que não sabem o suficiente sobre o que estão fazendo. Quando você executa,sh foo.sh
na verdade, está executando ash
partir do local padrão (provavelmente/bin
) que não está em um sistema de arquivos montadonoexec
.Você pode até
noexec
procurar arquivos binários regulares invocandold
diretamente.Isso executará o bash, independentemente de estar ou não em um sistema de arquivos montado
noexec
.fonte
ld.so
(inteligente)/lib/ld-2.10.1.so $HOME/sh
e ele retornou outro erro ao carregar bibliotecas compartilhadas:/home/chronos/user/sh: failed to map segment from shared object: Operation not permitted
. Não sei se o que você disse foi falso ou se algo está interferindo. Por exemplo, / é montado como somente leitura.ld
eld.so
.ld
é um vinculador usado para vincular o código de objeto para formar um binário durante a compilação, enquantold.so
o vinculador em tempo de execução está executando uma ação semelhante ao executar um programa. O vinculador referido aqui é o vinculador em tempo de execução.Você também pode receber esse erro (ou uma mensagem muito, muito semelhante) se tentar executar um arquivo com finais de linha do MS-DOS de 2 bytes (avanço de linha de retorno de carro).
Atualmente, o Vim é tão inteligente que nem sempre mostra que o carro retorna como '^ M'. Assim, você pode se deixar enganar se não verificar o que o Vim acha que é o "formato de arquivo" e apenas confiar na aparência na tela.
Nesse caso, o "#! / Bin / sh ^ M" faz com que o kernel tente encontrar "/ bin / sh ^ M", o que não pode. Mau intérprete, de fato.
fonte
Se você tiver a opção de executar o script ou programa a partir de um pendrive (ou outra mídia removível), tente desmontar e montá-lo manualmente:
Conecte o pendrive
Encontre um dispositivo USB com
$ mount
Tome nota disso; vamos assumir que é
/dev/sdb1
Desmonte o dispositivo USB:
Por fim, monte novamente o pendrive:
Com o ponto de montagem, o nome de montagem do stick USB
fonte
Por motivos de segurança do sistema no ChromeOS / ChromiumOS, determinadas pastas estão marcadas
noexec
e você precisa remontar com o comando abaixo ou usar um caminho alternativo que não tenha sidonoexec
definido, como no segundo exemplo.Esses comandos assumem que você está pelo menos no modo de desenvolvedor e tem acesso ao
shell
withchronos@localhost / $
e não apenascrosh>
e sabe a senha do sudo.O método mais sustentável que deve sobreviver a uma atualização porque o Google reserva a maior parte
/usr/local
para os desenvolvedores:O benefício adicional de colocar as coisas aqui é que elas
$PATH
já estão no (tenteecho $PATH
confirmar isso) para que você não precise usar o caminho completo para executar scripts ou binários que estão dentro/usr/local/bin
e que já foramchmod +x
executados.fonte
Eu tive a mesma pergunta. Meu problema foi com o cartão SD. Isso funcionou para mim e é muito mais simples do que as outras respostas aqui. Aprendi com a edição nº 928 de Crouton .
Observe que você precisa usar o ponto de montagem, não o dispositivo (/ dev / mmcblk1p1). A mesma coisa para USB (/ dev / sdb1) no seu caso. Somente o ponto de montagem é diferente:
Você saberá que teve o efeito desejado porque "noexec" desaparecerá das opções de montagem quando você consultar.
fonte