Jak mogę wykonać plik bez uprawnień wykonywania?


11

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.



1
nie jest cały punkt uprawnień do plików, aby tak się nie stało? : D
galois

Odpowiedzi:


14

Sprawdź własność pliku

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.

Graficzny

  1. Kliknij plik prawym przyciskiem myszy.
  2. Kliknij „Właściwości”.
  3. Kliknij kartę „Uprawnienia”.
  4. Upewnij się, że pole „Właściciel” zawiera Twoją nazwę użytkownika. Jeśli nie wyświetla się poniżej „Zmień własność pliku”

Wiersz poleceń

  1. Wykonaj to polecenie w terminalu

    [ ! -O "/path/to/file" ] && echo "You don't own the file"
    
  2. Jeśli wyświetla się „ You don't own the file”, zobacz „Zmień własność pliku” poniżej.

Zmień własność pliku

Wykonaj to polecenie w terminalu

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

Pliki wykonywalne

Odpowiedź znalazłem z komentarzem przez Lekensteyn na odpowiedź na pytanie o chmodna 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/executablepoprawną ś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.

Sprawdź, czy program ma 64 lub 32 bity

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 i386tylko, to jest 32-bitowy.


Skrypty

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/filepoprawną ś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

.jarPliki Java

W przypadku jar wykonywalnego Java, możesz po prostu użyć tych poleceń (zastępując /path/to/jarpoprawną ścieżkę):

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

Kiedy nie potrzebujesz 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ć cdpierwsza.

  • Program sam nie wykonuje żadnych operacji na plikach (przykład: używa tylko apt-get)
  • Program wykorzystuje cd(lub równoważny), aby przejść do ścieżki bezwzględnej przed wykonaniem jakichkolwiek operacji na plikach (przykład cd "$(dirname "$0")":)
  • Program nie odwołuje się do żadnych ścieżek względnych (ścieżki zaczynające się ./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.


1
Każdy, kto chce napisać skrypt i sprawić, by obejmował wszystkie możliwości (jeśli często używasz systemów plików MS ), jest mile widziany. Mogę to zrobić sam, ale nie licz na to. (+1 ten komentarz, jeśli chcesz, wystarczające wsparcie, a ja mogę to zrobić)
kiri

0

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.


Nie rozumiem, jak to się szczególnie różni odbash script $@
kiri 15'13

Nie różni się zasadniczo działaniem. Najprawdopodobniej nie rozumiem, jaki problem próbujesz rozwiązać - założyłem, że potrzebujesz metody „wskaż i kliknij”, aby wykonać skrypt, który (z jakiegokolwiek powodu) nie jest wykonywalny. „Zrób jeden, który będzie wykonywalny, a źródło innego” - to jedno z rozwiązań tego problemu. Jeśli to zły problem ... no cóż :)
Stabledog
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.