Wie kann ich eine Datei ohne Ausführungsberechtigungen ausführen?

11

Wie kann ich eine Datei ausführen, ohne mir die Ausführungsberechtigung (mit chmod u+x) dafür zu erteilen?

Wenn ich versuche, das Häkchen "Ausführen der Datei als Programm zulassen" zu aktivieren, wird das Häkchen sofort entfernt.

kiri
quelle
Ähnlich: Wie chmod ohne / usr / bin / chmod? bei Unix
Kenorb
1
Ist das nicht der springende Punkt bei Dateiberechtigungen, damit dies NICHT passiert? : D
Galois

Antworten:

14

Überprüfen Sie den Dateibesitz

Bitte tun Sie dies vor allen weiteren Schritten (es sei denn, Sie sind sicher, dass Sie die Datei besitzen).

Überprüfen Sie, ob Sie die Datei besitzen, die Sie mit einer der folgenden Methoden ausführen möchten.

Grafisch

  1. Klicken Sie mit der rechten Maustaste auf die Datei.
  2. Klicken Sie auf "Eigenschaften".
  3. Klicken Sie auf die Registerkarte "Berechtigungen".
  4. Stellen Sie sicher, dass im Feld "Eigentümer" Ihr Benutzername angegeben ist. Wenn unten nicht "Dateibesitz ändern" angezeigt wird

Befehlszeile

  1. Führen Sie diesen Befehl in einem Terminal aus

    [ ! -O "/path/to/file" ] && echo "You don't own the file"
    
  2. Wenn " You don't own the file" gedruckt wird , siehe "Ändern des Dateibesitzes" weiter unten.

Ändern Sie den Dateibesitz

Führen Sie diesen Befehl in einem Terminal aus

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

Ausführbare Dateien

Eine Antwort , die ich von einem gefundenen Kommentar von Lekensteyn auf einer Antwort für eine Frage über chmodauf NTFS - Partitionen , die ich denke , es ist die eigene Frage und Antwort, die volle Punktzahl zu Lekensteyn verdient.

Verwenden Sie diesen Befehl für ausführbare Dateien (ersetzen Sie ihn /path/to/executabledurch den richtigen Pfad):

  • 64-Bit-ausführbare Dateien:

    /lib64/ld-linux-x86-64.so.2 /path/to/executable
    
  • 32-Bit-ausführbare Dateien:

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

Wenn dies nicht funktioniert (oder Fehler bei nicht gefundenen Dateien auslöst), versuchen Sie dies vor dem obigen Befehl

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

Alle oben genannten Befehle funktionieren nicht für textbasierte Skripte (Bash, Python, Perl usw.), siehe unten.

Überprüfen Sie, ob ein Programm 64 oder 32 Bit ist

Verwenden Sie diesen Befehl, um herauszufinden, ob eine ausführbare Datei 32 ( x86) oder 64 ( x86-64) Bit ist

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

Wenn es heißt i386:x86-64, dann ist es 64 Bit. Wenn es i386nur heißt , dann ist es 32 Bit.


Skripte

Für textbasierte Skripte (Bash, Python, Perl usw.) sollten Sie den in der ersten #!Zeile der Datei angegebenen Befehl verwenden.

Zum Beispiel, wenn die erste Zeile der Datei ist

#!/usr/bin/env python3

Führen Sie diese Befehle dann in einem Terminal aus (ersetzen Sie sie /path/to/filedurch den richtigen Pfad).

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

Java- .jarDateien

Für ausführbare Java-JARs können Sie einfach die folgenden Befehle verwenden ( /path/to/jardurch den richtigen Pfad ersetzen ):

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

Wenn du nicht brauchst cd "$(dirname /path/to/file)"

Dies sind mögliche Umstände, die Sie nicht verwenden müssen, cd "$(dirname /path/to/file)"bevor Sie das Programm mit einer Methode ausführen: Wenn mindestens eine wahr ist, müssen Sie diese nicht cdzuerst ausführen .

  • Das Programm führt selbst keine Dateivorgänge aus (Beispiel: Es verwendet nur apt-get)
  • Das Programm verwendet cd(oder gleichwertig) in einen absoluten Pfad zu ändern , bevor sie eine Dateioperationen zu tun (Beispiel: cd "$(dirname "$0")")
  • Das Programm verweist nicht auf relative Pfade (Pfade, die mit ./oder ohne Schrägstrich beginnen)

Wenn Sie sich nicht sicher sind, fügen Sie cd "$(dirname "$0")"(oder ein gleichwertiges Element) oben im Skript hinzu (falls zutreffend) oder verwenden Sie es cd "$(dirname /path/to/file)"trotzdem.

kiri
quelle
1
Jeder, der dieses Skript will und machen es alle Möglichkeiten abzudecken (wenn Sie MS verwenden Dateisysteme viel ) ist willkommen zu. Ich könnte es selbst tun, aber rechne nicht damit. (+1 dieser Kommentar, wenn Sie dies wollen, genug Unterstützung und ich könnte es tun)
Kiri
0

Wenn es sich um ein Shell-Skript handelt, können Sie es aus einem anderen Shell-Skript "beziehen", dh:

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

Das "$ @" hängt bei Bedarf die Befehlszeilenparameter an.

Trotzdem ist dies wahrscheinlich nicht die beste Lösung für das zugrunde liegende Problem, aber wir wissen nicht genug über dieses Problem, um Alternativen anzubieten.

Stallhund
quelle
Ich sehe nicht, wie sich das besonders unterscheidet vonbash script $@
Kiri
Im Betrieb ist es nicht grundlegend anders. Höchstwahrscheinlich verstehe ich nicht, welches Problem Sie lösen möchten. Ich ging davon aus, dass Sie mit einem Mausklick ein Skript ausführen möchten, das (aus irgendeinem Grund) nicht ausführbar ist. "Machen Sie eine ausführbare Datei und lassen Sie die andere Quelle" ist eine Lösung für dieses Problem. Wenn das das falsche Problem ist ...
na ja