Tengo un foo.sh
archivo 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.sh
entonces corre bien.
¿Cómo puedo solucionar esto para poder ejecutarlo ./foo.sh
y 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.sh
para lograr exactamente lo mismo? ¿Qué seguridad, entonces, noexec
da?
noexec
funciona su magia.Respuestas:
La
noexec
bandera se aplicará adecuadamente a los scripts, ya que ese sería el comportamiento "esperado".Sin embargo, la configuración
noexec
solo detiene a las personas que no saben lo suficiente sobre lo que están haciendo. Cuando ejecutash foo.sh
, en realidad está ejecutandosh
desde su ubicación predeterminada (probablemente/bin
) que no está en un sistema de archivos montado connoexec
.Incluso puede obtener
noexec
archivos binarios regulares invocandold
directamente.Esto ejecutará bash, independientemente de si está o no en un sistema de archivos montado con
noexec
.fuente
ld.so
(inteligente)/lib/ld-2.10.1.so $HOME/sh
y 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.ld
yld.so
.ld
es un vinculador utilizado para vincular código de objeto para formar un binario al compilar, mientrasld.so
que 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.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.
fuente
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:
Enchufe el dispositivo USB
Encuentra un dispositivo de memoria USB con
$ mount
Toma nota de ello; supongamos que es
/dev/sdb1
Desmontar la memoria USB:
Finalmente, vuelva a montar la memoria USB:
Con mountpoint, el nombre de montaje de la memoria USB
fuente
Por razones de seguridad del sistema en ChromeOS / ChromiumOS, ciertas carpetas están marcadas
noexec
y es necesario volver a montarlas con el siguiente comando o usar una ruta alternativa que no se hayanoexec
configurado, como en el segundo ejemplo.Estos comandos suponen que está al menos en modo desarrollador y tiene acceso a
shell
withchronos@localhost / $
y no solocrosh>
y conoce la contraseña de sudo.El método más sostenible que debería sobrevivir a una actualización porque Google reserva la mayor parte de los
/usr/local
desarrolladores:El beneficio adicional de poner las cosas aquí es que ya está en el
$PATH
(intenteecho $PATH
confirmar esto), por lo que no necesita usar la ruta completa para ejecutar scripts o binarios que están/usr/local/bin
y se hanchmod +x
ejecutado en ellos.fuente
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 .
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:
Sabrá que tuvo el efecto deseado porque "noexec" desaparecerá de las opciones de montaje cuando realice una consulta.
fuente