¿Cómo puedo ejecutar un archivo sin permisos de ejecución?

11

¿Cómo puedo ejecutar un archivo sin darme permisos de ejecución (con chmod u+x) para él?

Si trato de marcar la marca de verificación 'Permitir ejecutar archivo como programa', la marca de verificación se elimina inmediatamente.

kiri
fuente
1
¿No es todo el objetivo de los permisos de archivos para que esto NO suceda? : D
galois

Respuestas:

14

Verificar propiedad del archivo

Haga esto antes de cualquier otra cosa (a menos que esté seguro de ser el propietario del archivo).

Compruebe y asegúrese de poseer el archivo que está intentando ejecutar con uno de los siguientes métodos.

Gráfico

  1. Haga clic derecho en el archivo.
  2. Haga clic en 'Propiedades'.
  3. Haga clic en la pestaña 'Permisos'.
  4. Asegúrese de que el campo 'Propietario' indique su nombre de usuario. Si no ve "Cambiar la propiedad del archivo" a continuación

Línea de comando

  1. Ejecute este comando en una terminal

    [ ! -O "/path/to/file" ] && echo "You don't own the file"
    
  2. Si imprime " You don't own the file", consulte "Cambiar la propiedad del archivo" a continuación.

Cambiar la propiedad del archivo

Ejecute este comando en una terminal

sudo chown $USER:$(id -gn $USER) "/path/to/file"

Archivos ejecutables

Una respuesta que encontré de un comentario de Lekensteyn sobre una respuesta a una pregunta sobre las chmodparticiones NTFS que creo que merece su propia pregunta y respuesta, crédito total a Lekensteyn.

Use este comando para archivos ejecutables (sustituyendo /path/to/executablecon la ruta correcta):

  • Archivos ejecutables de 64 bits:

    /lib64/ld-linux-x86-64.so.2 /path/to/executable
    
  • Archivos ejecutables de 32 bits:

    /lib/ld-linux.so.2 /path/to/executable
    

Si lo anterior no funciona (o genera errores de archivo no encontrado), intente usar esto antes del comando anterior

cd "$(dirname /path/to/executable)"

Todos los comandos anteriores no funcionarán para los scripts basados ​​en texto (Bash, Python, Perl, etc.), ver más abajo.

Compruebe si un programa es de 64 o 32 bits

Use este comando para averiguar si un ejecutable es de 32 ( x86) o 64 ( x86-64) bits

objdump -f "$file" | grep '^architecture' | cut -d, -f1 | sed 's/architecture: //'

Si dice i386:x86-64, entonces es de 64 bits. Si solo dice i386, entonces es de 32 bits.


Guiones

Para los guiones basados ​​en texto (Bash, Python, Perl, etc.), debe usar el comando especificado en la primera #!línea del archivo.

Por ejemplo, si la primera línea del archivo es

#!/usr/bin/env python3

luego ejecute estos comandos en una terminal (sustituyendo /path/to/filecon la ruta correcta)

cd "$(dirname /path/to/file)"       # Not strictly necessary, see section below

# Replace '/usr/bin/env python3' with the first line without the front #!
/usr/bin/env python3 /path/to/file  # Use './file' if you want

.jarArchivos Java

Para los jar ejecutables de Java, simplemente puede usar estos comandos (sustituyendo /path/to/jarcon la ruta correcta):

cd "$(dirname /path/to/jar)"   # Not strictly necessary, see section below
java -jar /path/to/jar

Cuando no necesitas cd "$(dirname /path/to/file)"

Estas son posibles circunstancias en las que no necesitará usar cd "$(dirname /path/to/file)"antes de ejecutar el programa con cualquier método: si al menos uno es verdadero, no necesitará cdprimero.

  • El programa no realiza ninguna operación de archivo en sí mismo (ejemplo: solo usa apt-get)
  • Los usos de los programas cd(o equivalente) para cambiar a una ruta absoluta antes de realizar cualquier operación de archivo (ejemplo: cd "$(dirname "$0")")
  • El programa no hace referencia a ninguna ruta relativa (rutas que comienzan con ./o sin barra)

Si no está seguro, agregue cd "$(dirname "$0")"(o equivalente) a la parte superior del script (si corresponde) o use de cd "$(dirname /path/to/file)"todos modos.

kiri
fuente
1
Cualquier persona que quiera escribir esto y hacer que cubra todas las posibilidades (si usa mucho los sistemas de archivos MS ) es bienvenido. Podría hacerlo yo mismo, pero no cuente con eso. (+1 este comentario si quieres esto, suficiente apoyo y podría hacerlo)
kiri
0

Si se trata de un script de shell, puede "obtenerlo" de otro script de shell, es decir:

#!/bin/bash
# This script runs another script indirectly, by sucking in its contents and evaluating inline:

source /path/to/script/which/lost/its/exec/flag "$@"

El "$ @" agrega los parámetros de la línea de comando, si es necesario.

Dicho esto, probablemente esta no sea la mejor solución para el problema subyacente, pero no sabemos lo suficiente sobre ese problema para ofrecer alternativas.

Stabledog
fuente
No veo cómo esto es particularmente diferente debash script $@
kiri
No es fundamentalmente diferente en la operación. Lo más probable es que no entiendo qué problema estás tratando de resolver: supuse que querías una forma de apuntar y hacer clic para ejecutar un script que (por cualquier razón) no sea ejecutable. "Hacer que uno sea ejecutable y que sea el otro" es una solución a ese problema. Si ese es el problema incorrecto ... bueno :)
Stabledog