In Chrome OS, Bash non eseguirà il mio script. Come faccio a far eseguire a Bash il mio script?


16

Ho un foo.shfile nella mia directory corrente. Se provo a correre ./foo.sh, ottengo:

-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied

Ma se corro, /bin/sh ./foo.shallora funziona bene.

Come posso risolvere questo problema in modo da poterlo eseguire ./foo.she lo esegue automaticamente con / bin / sh?

Modifica: Okay, questo è Chrome OS e questa particolare cartella è montata con noexec. Apparentemente questo sventa la capacità di correre ./foo.sh; ma perchè? Perché posso ancora correre sh foo.shper ottenere la stessa identica cosa? Quale sicurezza offre allora noexec?


1
sicurezza attraverso l'oscurità
Michael Durrant,

Hai provato se l'esecuzione di ". Foo.sh" funziona?
Daniele Testa,

@DanieleTesta Questa domanda è un'antica reliquia di un tempo lontano. Stavo usando un Google Cr-48, uno dei primi Chromebook, con una versione piuttosto anticipata (ma stabile) di ChromeOS. Abbiamo fatto molta strada da allora e non credo che questa domanda si applicherebbe alle ultime versioni di ChromeOS, ma non l'ho usato per dirlo con certezza. Comunque penso che anche la tua variazione avrebbe funzionato, ma si dovrebbe testarla prima di dirlo con certezza. Non sono ancora chiaro esattamente come noexecfunziona la sua magia.
Ricket,

Risposte:


22

La noexecbandiera si applicherà in modo appropriato agli script, perché sarebbe il comportamento "previsto".

Tuttavia, l'impostazione noexecblocca solo le persone che non sanno abbastanza di ciò che stanno facendo. Quando corri sh foo.sh, stai effettivamente correndo shdalla sua posizione predefinita (probabilmente /bin) che non si trova su un filesystem con noexec.

Puoi persino noexeccercare i normali file binari invocando lddirettamente.

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

Questo funzionerà bash, indipendentemente dal fatto che si trovi o meno su un filesystem con noexec.


5
+1 per menzionare ld.so(intelligente)
anfetamachina

Ho provato i tuoi due comandi; "impossibile aprire il file oggetto condiviso: nessun file o directory" - a causa della copia di sh ma dell'esecuzione di bash. Allora ho provato /lib/ld-2.10.1.so $HOME/shed è tornato un altro errore durante il caricamento librerie condivise: /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted. Non sono sicuro se ciò che hai detto fosse falso o se qualcos'altro sta interferendo. Ad esempio, / è montato in sola lettura.
Ricket,

Beh, non potrei dirlo con certezza perché non ho una copia di ChromeOS da provare. Sono abbastanza fiducioso che possa funzionare con alcune modifiche, ma senza essere in grado di provarlo da solo non so quale potrebbe essere.
bahamat,

Vabbè, mi piacerebbe pensare che sia perché Chrome OS è correttamente bloccato. Sembra essere abbastanza sicuro ma immagino che vedremo nel tempo!
Ricket,

1
C'è una differenza tra lde ld.so. ldè un linker utilizzato nel collegamento del codice oggetto per formare un file binario durante la compilazione, mentre ld.soil linker di runtime esegue un'azione simile durante l'esecuzione di un programma. Il linker indicato qui è il linker di runtime.
Kusalananda

5

È inoltre possibile ottenere questo errore (o un messaggio molto simile) se si tenta di eseguire un file con terminazioni di riga a 2 byte (trasporto di ritorno a capo) MS-DOS.

Vim è così intelligente in questi giorni, che non ti mostra necessariamente i ritorni della carrozza come '^ M'. Quindi puoi farti ingannare se non controlli cosa pensa Vim del "formato di file" e fai affidamento sull'aspetto sullo schermo.

In questo caso "#! / Bin / sh ^ M" fa sì che il kernel cerchi di trovare "/ bin / sh ^ M", cosa che non può. Cattivo interprete, davvero.


2

Se hai la possibilità di eseguire lo script o il programma da una chiavetta USB (o altri supporti rimovibili), puoi provare a smontare e rimontarlo manualmente:

  1. Collegare la chiavetta USB

  2. Trova il dispositivo USB stick con $ mount

  3. Prendine nota; supponiamo che lo sia/dev/sdb1

  4. Smonta chiavetta USB:

    $ cd /media/removable
    
    $ sudo umount mountpoint

Infine, reinstallare la chiavetta USB:

$ sudo mount /dev/sdb1 mountpoint

Con mountpoint il nome di montaggio della chiavetta USB


1

Per motivi di sicurezza del sistema su ChromeOS / ChromiumOS, alcune cartelle sono contrassegnate noexece devi rimontare con il comando seguente o utilizzare un percorso alternativo che non è stato noexecimpostato, come nel secondo esempio.

Questi comandi presuppongono che tu sia almeno in modalità sviluppatore e che abbia accesso a shellcon chronos@localhost / $e non solo crosh>e conosca la password di sudo.

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

Il metodo più sostenibile che dovrebbe sopravvivere a un aggiornamento perché Google riserva la maggior parte degli /usr/localsviluppatori:

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

Il vantaggio aggiuntivo di mettere le cose qui è che è $PATHgià presente (provare echo $PATHa confermare), quindi non è necessario utilizzare il percorso completo per eseguire script o binari che sono presenti /usr/local/bine che sono stati chmod +xeseguiti su di essi.


2
Ciao, benvenuto su Unix SE! Nota, le risposte a comando singolo non sono considerate molto HQ qui. Suggerisco di spiegare, cosa stai facendo e perché.
Peter - Ripristina Monica il

0

Ho avuto la stessa domanda. Il mio problema era con la scheda SD. Questo ha funzionato per me ed è molto più semplice delle altre risposte qui. L'ho imparato dal numero 928 di Crouton .

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

Nota che devi usare il punto di montaggio, non il dispositivo (/ dev / mmcblk1p1). Stessa cosa per USB (/ dev / sdb1) nel tuo caso. Solo il punto di montaggio è diverso:

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

Saprai che ha avuto l'effetto desiderato perché "noexec" scomparirà dalle opzioni di mount quando esegui una query.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.