No Chrome OS, o Bash não executa meu script. Como faço para o Bash executar meu script?

16

Eu tenho um foo.sharquivo 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.she 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.shpara conseguir exatamente a mesma coisa? Que segurança, então, noexecdá?

Ricket
fonte
11
segurança através da obscuridade
Michael Durrant
Você tentou se executar ". Foo.sh" funcionasse?
Daniele Testa
@DanieleTesta Esta pergunta é uma relíquia antiga de um tempo passado. Eu estava usando um Google Cr-48, um dos primeiros chromebooks, executando uma versão bastante antiga (mas estável) do ChromeOS. Percorremos um longo caminho desde então e acho que essa pergunta não se aplicaria às versões mais recentes do ChromeOS, mas não usei isso com certeza. Enfim, acho que sua variação também teria funcionado, mas é preciso testá-la antes de dizer com certeza. Ainda não estou claro exatamente como noexecfunciona sua mágica.
Ricket

Respostas:

22

O noexecsinalizador será aplicado adequadamente aos scripts, porque esse seria o comportamento "esperado".

No entanto, a configuração noexecapenas interrompe as pessoas que não sabem o suficiente sobre o que estão fazendo. Quando você executa, sh foo.shna verdade, está executando a shpartir do local padrão (provavelmente /bin) que não está em um sistema de arquivos montado noexec.

Você pode até noexecprocurar arquivos binários regulares invocando lddiretamente.

cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash

Isso executará o bash, independentemente de estar ou não em um sistema de arquivos montado noexec.

bahamat
fonte
5
1 para mencionar ld.so(inteligente)
amphetamachine
Eu tentei seus dois comandos; "não é possível abrir o arquivo de objeto compartilhado: não existe esse arquivo ou diretório" - devido à cópia de sh, mas à execução do bash. Então eu tentei /lib/ld-2.10.1.so $HOME/she 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.
Ricket
Bem, eu não poderia ter certeza, porque não tenho uma cópia do ChromeOS para testar. Estou bastante confiante de que ele pode funcionar com algumas modificações, mas sem poder tentar sozinho, não sei o que pode ser.
bahamat 03/02
Bem, gostaria de pensar que é porque o Chrome OS está devidamente bloqueado. Parece ser bastante seguro, mas acho que veremos com o tempo!
Ricket
11
Há uma diferença entre lde ld.so. ldé um vinculador usado para vincular o código de objeto para formar um binário durante a compilação, enquanto ld.soo 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.
Kusalananda
5

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.

Bruce Ediger
fonte
2

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:

  1. Conecte o pendrive

  2. Encontre um dispositivo USB com $ mount

  3. Tome nota disso; vamos assumir que é/dev/sdb1

  4. Desmonte o dispositivo USB:

    $ cd /media/removable
    
    $ sudo umount mountpoint

Por fim, monte novamente o pendrive:

$ sudo mount /dev/sdb1 mountpoint

Com o ponto de montagem, o nome de montagem do stick USB

Joachim Pfeiffer
fonte
1

Por motivos de segurança do sistema no ChromeOS / ChromiumOS, determinadas pastas estão marcadas noexece você precisa remontar com o comando abaixo ou usar um caminho alternativo que não tenha sido noexecdefinido, como no segundo exemplo.

Esses comandos assumem que você está pelo menos no modo de desenvolvedor e tem acesso ao shellwith chronos@localhost / $e não apenas crosh>e sabe a senha do sudo.

sudo mount -i -o remount,exec /home/chronos/user/

O método mais sustentável que deve sobreviver a uma atualização porque o Google reserva a maior parte /usr/localpara os desenvolvedores:

sudo mkdir -p /usr/local/bin/ && sudo chown -R chronos: /usr/local/bin/
cp ${HOME}/Downloads/foo.sh /usr/local/bin/

O benefício adicional de colocar as coisas aqui é que elas $PATHjá estão no (tente echo $PATHconfirmar isso) para que você não precise usar o caminho completo para executar scripts ou binários que estão dentro /usr/local/bine que já foram chmod +xexecutados.

megdimka
fonte
2
Olá, seja bem-vindo ao Unix SE! Observe que as respostas de comando único não são consideradas muito HQ aqui. Sugiro explicar, o que você está fazendo e por quê.
peterh - Restabelece Monica
0

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 .

$ sudo mount -o remount,exec /media/removable/SD\ Card

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:

$ sudo mount -o remount,exec /media/removable/USB\ Drive

Você saberá que teve o efeito desejado porque "noexec" desaparecerá das opções de montagem quando você consultar.

tbc0
fonte