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

11

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

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

kiri
la source
Similaire: Comment chmod sans / usr / bin / chmod? à Unix
kenorb
1
n'est pas tout l'intérêt des autorisations de fichiers pour que cela ne se produise PAS? : D
galois

Réponses:

14

Vérifier la propriété du fichier

Veuillez le faire avant toute autre 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 "Changer la propriété du fichier" ci-dessous

Ligne de commande

  1. Exécutez cette commande dans un terminal

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

Changer la propriété du fichier

Exécutez cette commande dans un terminal

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

Fichiers exécutables

Une réponse que j'ai trouvée à partir d'un commentaire de Lekensteyn sur une réponse à une question sur chmodles partitions NTFS qui, je pense, mérite ses propres questions et réponses, tout à l'honneur de Lekensteyn.

Utilisez cette commande pour les fichiers exécutables (en les remplaçant /path/to/executablepar 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 déclenche des erreurs de fichier introuvable), essayez de l'utiliser 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 64 ou 32 bits

Utilisez cette commande pour savoir si un exécutable est de 32 ( x86) ou 64 ( x86-64) bits

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

Si cela dit i386:x86-64, c'est 64 bits. S'il dit i386seulement, c'est 32 bits.


Scripts

Pour les scripts basés sur du texte (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 les remplaçant /path/to/filepar 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

.jarFichiers Java

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

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

Quand tu n'as pas besoin cd "$(dirname /path/to/file)"

Ce sont des circonstances possibles où vous n'aurez 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'aurez pas besoin en cdpremier.

  • Le programme n'effectue aucune opération de fichier lui-même (exemple: il utilise uniquement apt-get)
  • Les utilisations du programme cd(ou équivalent) pour passer à un chemin absolu avant d' effectuer des opérations de fichiers ( par exemple: cd "$(dirname "$0")")
  • Le programme ne fait référence à aucun chemin relatif (chemins commençant par ./ou commençant sans barre oblique)

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

kiri
la source
1
Quiconque veut écrire un script et le faire couvrir toutes les possibilités (si vous utilisez beaucoup de systèmes de fichiers MS ) est le bienvenu. Je pourrais le faire moi-même, mais ne comptez pas dessus. (+1 ce commentaire si vous le voulez, assez de support et je pourrais le faire)
kiri
0

S'il s'agit d'un script shell, vous pouvez le "source" à 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 pour le problème sous-jacent, mais nous n'en savons pas assez sur ce problème pour proposer des alternatives.

Stabledog
la source
Je ne vois pas en quoi cela est particulièrement différent debash script $@
kiri
Ce n'est pas fondamentalement différent en fonctionnement. Je ne comprends probablement pas quel problème vous essayez de résoudre - je supposais que vous vouliez un moyen de pointer et cliquer pour exécuter un script qui (pour une raison quelconque) n'est pas exécutable. "Faire un qui est exécutable et faire en sorte qu'il source l'autre" est une solution à ce problème. Si c'est le mauvais problème ... eh bien :)
Stabledog