Jak mogę wykonać plik, nie dając mu uprawnień (z chmod u+x
) do niego?
Jeśli spróbuję zaznaczyć pole wyboru „Zezwalaj na uruchamianie pliku jako programu”, znacznik ten zostanie natychmiast usunięty.
Jak mogę wykonać plik, nie dając mu uprawnień (z chmod u+x
) do niego?
Jeśli spróbuję zaznaczyć pole wyboru „Zezwalaj na uruchamianie pliku jako programu”, znacznik ten zostanie natychmiast usunięty.
Odpowiedzi:
Zrób to, zanim cokolwiek dalej (chyba że masz pewność, że jesteś właścicielem pliku).
Sprawdź i upewnij się, że jesteś właścicielem pliku, który próbujesz wykonać za pomocą jednej z następujących metod.
Wykonaj to polecenie w terminalu
[ ! -O "/path/to/file" ] && echo "You don't own the file"
You don't own the file
”, zobacz „Zmień własność pliku” poniżej.Wykonaj to polecenie w terminalu
sudo chown $USER:$(id -gn $USER) "/path/to/file"
Odpowiedź znalazłem z komentarzem przez Lekensteyn na odpowiedź na pytanie o chmod
na partycjach NTFS, który moim zdaniem zasługuje na swoje własne pytanie i odpowiedź, pełny kredyt Lekensteyn.
Użyj tego polecenia dla plików wykonywalnych (podstawiając /path/to/executable
poprawną ścieżkę):
64-bitowe pliki wykonywalne:
/lib64/ld-linux-x86-64.so.2 /path/to/executable
32-bitowe pliki wykonywalne:
/lib/ld-linux.so.2 /path/to/executable
Jeśli powyższe nie działa (lub podnosi błędy nie znaleziono pliku), spróbuj użyć tego przed powyższym poleceniem
cd "$(dirname /path/to/executable)"
Wszystkie powyższe polecenia nie będą działać dla skryptów tekstowych (Bash, Python, Perl itp.), Patrz poniżej.
Użyj tego polecenia, aby dowiedzieć się, czy plik wykonywalny ma bit 32 ( x86
) czy 64 ( x86-64
)
objdump -f "$file" | grep '^architecture' | cut -d, -f1 | sed 's/architecture: //'
Jeśli to mówi i386:x86-64
, to jest 64-bitowy. Jeśli mówi i386
tylko, to jest 32-bitowy.
W przypadku skryptów tekstowych (Bash, Python, Perl itp.) Należy użyć polecenia określonego w pierwszym #!
wierszu pliku.
Na przykład, jeśli pierwszy wiersz pliku to
#!/usr/bin/env python3
następnie uruchom te polecenia w terminalu (zastępując /path/to/file
poprawną ścieżką)
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
Pliki JavaW przypadku jar wykonywalnego Java, możesz po prostu użyć tych poleceń (zastępując /path/to/jar
poprawną ścieżkę):
cd "$(dirname /path/to/jar)" # Not strictly necessary, see section below
java -jar /path/to/jar
cd "$(dirname /path/to/file)"
Są to możliwe okoliczności, w których nie będziesz musiał używać cd "$(dirname /path/to/file)"
przed uruchomieniem programu dowolną metodą: Jeśli przynajmniej jedna z nich jest prawdziwa, nie będziesz potrzebować cd
pierwsza.
apt-get
)cd
(lub równoważny), aby przejść do ścieżki bezwzględnej przed wykonaniem jakichkolwiek operacji na plikach (przykład cd "$(dirname "$0")"
:)./
lub rozpoczynające się bez ukośnika)Jeśli nie masz pewności, dodaj cd "$(dirname "$0")"
(lub odpowiednik) na początku skryptu (jeśli dotyczy) lub użyj cd "$(dirname /path/to/file)"
mimo to.
Jeśli jest to skrypt powłoki, możesz go „pobrać” z innego skryptu powłoki, tj .:
#!/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 "$@"
W razie potrzeby „$ @” dołącza parametry wiersza poleceń.
To powiedziawszy, prawdopodobnie nie jest to najlepsze rozwiązanie podstawowego problemu, ale nie wiemy wystarczająco dużo o tym problemie, aby zaoferować alternatywy.
bash script $@