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.
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.
Antworten:
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.
Führen Sie diesen Befehl in einem Terminal aus
[ ! -O "/path/to/file" ] && echo "You don't own the file"
You don't own the file
" gedruckt wird , siehe "Ändern des Dateibesitzes" weiter unten.Führen Sie diesen Befehl in einem Terminal aus
sudo chown $USER:$(id -gn $USER) "/path/to/file"
Eine Antwort , die ich von einem gefundenen Kommentar von Lekensteyn auf einer Antwort für eine Frage über chmod
auf 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/executable
durch 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.
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 i386
nur heißt , dann ist es 32 Bit.
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/file
durch 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
.jar
DateienFür ausführbare Java-JARs können Sie einfach die folgenden Befehle verwenden ( /path/to/jar
durch den richtigen Pfad ersetzen ):
cd "$(dirname /path/to/jar)" # Not strictly necessary, see section below
java -jar /path/to/jar
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 cd
zuerst ausführen .
apt-get
)cd
(oder gleichwertig) in einen absoluten Pfad zu ändern , bevor sie eine Dateioperationen zu tun (Beispiel: cd "$(dirname "$0")"
)./
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.
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.
bash script $@