web-dev-qa-db-fra.com

Comment puis-je exécuter un fichier sans autorisation d'exécution?

Comment puis-je exécuter un fichier sans me donner les autorisations d'exécution (avec chmod u+x)?

Si j'essaie de cocher la case "Autoriser l'exécution du fichier en tant que programme", la coche est immédiatement supprimée.

11
kiri

Vérifier la propriété du fichier

Merci de le faire avant toute chose (sauf si vous êtes sûr de posséder le fichier).

Vérifiez et assurez-vous que vous possédez le fichier que vous essayez d'exécuter avec l'une des méthodes suivantes.

Graphique

  1. Faites un clic droit sur le fichier.
  2. Cliquez sur 'Propriétés'.
  3. Cliquez sur l'onglet 'Autorisations'.
  4. Assurez-vous que le champ 'Propriétaire' indique votre nom d'utilisateur. S'il ne voit pas "Modifier la propriété du fichier" ci-dessous

Ligne de commande

  1. Exécuter cette commande dans un terminal

    [ ! -O "/path/to/file" ] && echo "You don't own the file"
    
  2. Si elle imprime "You don't own the file", voir "Modifier la propriété du fichier" ci-dessous.

Changer la propriété du fichier

Exécuter cette commande dans un terminal

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

Fichiers exécutables

Une réponse trouvée dans un commentaire par Lekensteyn sur un réponse pour un question à propos de chmod sur des partitions NTFS que je think mérite sa propre question et sa propre réponse, tout le mérite de Lekensteyn.

Utilisez cette commande pour les fichiers exécutables (en remplaçant /path/to/executable par le chemin correct):

  • Fichiers exécutables 64 bits:

    /lib64/ld-linux-x86-64.so.2 /path/to/executable
    
  • Fichiers exécutables 32 bits:

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

Si ce qui précède ne fonctionne pas (ou soulève des erreurs de fichier non trouvé), essayez ceci avant la commande ci-dessus.

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

Toutes les commandes ci-dessus ne fonctionneront pas pour les scripts basés sur du texte (Bash, Python, Perl, etc.), voir ci-dessous.

Vérifier si un programme est en 64 ou 32 bits

Utilisez cette commande pour savoir si un exécutable a un bit de 32 (x86) ou de 64 (x86-64).

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

Si le code i386:x86-64 est indiqué, il s'agit du 64 bits. S'il ne dit que i386, c'est 32 bits.


Les scripts

Pour les scripts textuels (Bash, Python, Perl, etc.), vous devez utiliser la commande spécifiée dans la première ligne #! du fichier.

Par exemple, si la première ligne du fichier est

#!/usr/bin/env python3

puis exécutez ces commandes dans un terminal (en remplaçant /path/to/file par le chemin correct)

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

Fichiers Java .jar

Pour les fichiers jar exécutables Java, vous pouvez simplement utiliser ces commandes (en remplaçant /path/to/jar par le chemin correct):

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

Quand vous n'avez pas besoin de cd "$(dirname /path/to/file)"

Il existe des situations dans lesquelles vous n’auriez pas besoin d’utiliser cd "$(dirname /path/to/file)" avant d’exécuter le programme avec n’importe quelle méthode: si au moins une est vraie, vous n’avez pas besoin de cd au préalable.

  • Le programme n'effectue aucune opération sur le fichier lui-même (exemple: il utilise uniquement apt-get)
  • Le programme utilise cd (ou l’équivalent) pour passer à un chemin absolu avant d’effectuer des opérations sur un fichier (exemple: cd "$(dirname "$0")").
  • Le programme ne fait pas référence à des chemins relatifs (chemins commençant par ./ ou commençant par aucun slash)

En cas de doute, ajoutez cd "$(dirname "$0")" (ou l’équivalent) en haut du script (le cas échéant) ou utilisez quand même cd "$(dirname /path/to/file)".

14
kiri

S'il s'agit d'un script Shell, vous pouvez le "rechercher" à partir d'un autre script Shell, c'est-à-dire:

#!/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 "$@"

Le "$ @" ajoute les paramètres de ligne de commande, si nécessaire.

Cela dit, ce n’est probablement pas la meilleure solution au problème sous-jacent, mais nous n’en savons pas assez sur ce problème pour offrir des solutions de remplacement.

0
Stabledog