En Chrome OS, Bash no ejecutará mi script. ¿Cómo consigo que Bash ejecute mi script?

16

Tengo un foo.sharchivo en mi directorio actual. Si trato de correr ./foo.sh, obtengo:

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

Pero si corro, /bin/sh ./foo.shentonces corre bien.

¿Cómo puedo solucionar esto para poder ejecutarlo ./foo.shy lo ejecuta automáticamente con / bin / sh?

Editar: De acuerdo, este es Chrome OS y esta carpeta particular está montada con noexec. Aparentemente eso frustra la habilidad de correr ./foo.sh; pero por que ¿Por qué todavía puedo correr sh foo.shpara lograr exactamente lo mismo? ¿Qué seguridad, entonces, noexecda?

Ricket
fuente
1
seguridad a través de la oscuridad
Michael Durrant
¿Intentaste si funciona ". Foo.sh" funciona?
Daniele Testa
@DanieleTesta Esta pregunta es una reliquia antigua de hace mucho tiempo. Estaba usando un Google Cr-48, uno de los primeros Chromebooks, con una versión bastante temprana (pero estable) de ChromeOS. Hemos recorrido un largo camino desde entonces y no creo que esta pregunta se aplique a las últimas versiones de ChromeOS, pero no lo he usado para decirlo con certeza. De todos modos, creo que su variación también habría funcionado, pero uno debería probarla antes de decirlo con certeza. Todavía no estoy claro exactamente cómo noexecfunciona su magia.
Ricket,

Respuestas:

22

La noexecbandera se aplicará adecuadamente a los scripts, ya que ese sería el comportamiento "esperado".

Sin embargo, la configuración noexecsolo detiene a las personas que no saben lo suficiente sobre lo que están haciendo. Cuando ejecuta sh foo.sh, en realidad está ejecutando shdesde su ubicación predeterminada (probablemente /bin) que no está en un sistema de archivos montado con noexec.

Incluso puede obtener noexecarchivos binarios regulares invocando lddirectamente.

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

Esto ejecutará bash, independientemente de si está o no en un sistema de archivos montado con noexec.

bahamat
fuente
55
+1 por mencionar ld.so(inteligente)
anfetamáquina
Probé tus dos comandos; "no se puede abrir el archivo de objeto compartido: No existe tal archivo o directorio", debido a que se está copiando sh pero se está ejecutando bash. Así entonces intenté /lib/ld-2.10.1.so $HOME/shy regresé otro error al cargar bibliotecas compartidas: /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted. No estoy seguro de si lo que dijiste era falso o si algo más está interfiriendo. Por ejemplo, / se monta como de solo lectura.
Ricket
Bueno, no podría decirlo con certeza porque no tengo una copia de ChromeOS para probar. Estoy bastante seguro de que puede funcionar con alguna modificación, pero sin poder probarlo yo mismo, no sé qué podría ser.
bahamat 03 de
Bueno, me gustaría pensar que es porque Chrome OS está bloqueado correctamente. Parece ser bastante seguro, pero supongo que lo veremos con el tiempo.
Ricket
1
Hay una diferencia entre ldy ld.so. ldes un vinculador utilizado para vincular código de objeto para formar un binario al compilar, mientras ld.soque el vinculador en tiempo de ejecución realiza una acción similar al ejecutar un programa. El vinculador al que se hace referencia aquí es el vinculador en tiempo de ejecución.
Kusalananda
5

También puede obtener este error (o un mensaje muy, muy similar) si intenta ejecutar un archivo con terminaciones de línea de 2 bytes (salto de línea de retorno de carro) de MS-DOS.

Vim es tan inteligente en estos días, que no necesariamente muestra los retornos de carro como '^ M'. Por lo tanto, puede dejarse engañar si no verifica qué cree Vim que es el "formato de archivo" y simplemente confía en la apariencia en pantalla.

En este caso, "#! / Bin / sh ^ M" hace que el núcleo intente encontrar "/ bin / sh ^ M", que no puede. Mal intérprete, de hecho.

Bruce Ediger
fuente
2

Si tiene la opción de ejecutar el script o el programa desde una memoria USB (u otro medio extraíble), puede intentar desmontarlo y volver a montarlo manualmente:

  1. Enchufe el dispositivo USB

  2. Encuentra un dispositivo de memoria USB con $ mount

  3. Toma nota de ello; supongamos que es/dev/sdb1

  4. Desmontar la memoria USB:

    $ cd /media/removable
    
    $ sudo umount mountpoint

Finalmente, vuelva a montar la memoria USB:

$ sudo mount /dev/sdb1 mountpoint

Con mountpoint, el nombre de montaje de la memoria USB

Joachim Pfeiffer
fuente
1

Por razones de seguridad del sistema en ChromeOS / ChromiumOS, ciertas carpetas están marcadas noexecy es necesario volver a montarlas con el siguiente comando o usar una ruta alternativa que no se haya noexecconfigurado, como en el segundo ejemplo.

Estos comandos suponen que está al menos en modo desarrollador y tiene acceso a shellwith chronos@localhost / $y no solo crosh>y conoce la contraseña de sudo.

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

El método más sostenible que debería sobrevivir a una actualización porque Google reserva la mayor parte de los /usr/localdesarrolladores:

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

El beneficio adicional de poner las cosas aquí es que ya está en el $PATH(intente echo $PATHconfirmar esto), por lo que no necesita usar la ruta completa para ejecutar scripts o binarios que están /usr/local/biny se han chmod +xejecutado en ellos.

megdimka
fuente
2
Hola, bienvenido en el Unix SE! Tenga en cuenta que las respuestas de un solo comando no se consideran muy HQ aquí. Sugiero explicar, qué estás haciendo y por qué.
peterh - Restablece a Monica el
0

Tenía la misma pregunta. Mi problema fue con la tarjeta SD. Esto funcionó para mí, y es mucho más simple que las otras respuestas aquí. Lo aprendí de Crouton número 928 .

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

Tenga en cuenta que debe usar el punto de montaje, no el dispositivo (/ dev / mmcblk1p1). Lo mismo para USB (/ dev / sdb1) en su caso. Solo el punto de montaje es diferente:

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

Sabrá que tuvo el efecto deseado porque "noexec" desaparecerá de las opciones de montaje cuando realice una consulta.

tbc0
fuente