Як я можу виконати файл без дозволів на виконання?


11

Як я можу виконати файл, не даючи собі на нього дозволу (з chmod u+x)?

Якщо я спробую позначити прапорець "Дозволити виконання файлу як програми", галочка негайно видаляється.



1
Чи не вся суть дозволів на файли, так що цього НЕ трапляється? : D
галуа

Відповіді:


14

Перевірте право власності на файл

Будь ласка, зробіть це ще до чогось іншого (якщо ви не впевнені, що володієте файлом).

Перевірте і переконайтеся, що у вас є файл, який ви намагаєтеся виконати одним із наведених нижче способів.

Графічний

  1. Клацніть файл правою кнопкою миші.
  2. Натисніть "Властивості".
  3. Перейдіть на вкладку "Дозволи".
  4. Переконайтеся, що в полі "Власник" вказано ваше ім'я користувача. Якщо нижче не відображається "Змінити право власності на файл"

Командний рядок

  1. Виконайте цю команду в терміналі

    [ ! -O "/path/to/file" ] && echo "You don't own the file"
    
  2. Якщо він друкує " You don't own the file", див. "Змінення права власності на файл" нижче.

Змінити право власності на файл

Виконайте цю команду в терміналі

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

Виконані файли

Відповідь я знайшов від коментарів по Lekensteyn на відповідь на питання про chmodна розділах NTFS , які я думаю , що заслуговує власний питання і відповідь, повний кредит Lekensteyn.

Використовуйте цю команду для виконуваних файлів (замінивши /path/to/executableправильний шлях):

  • 64-бітні виконувані файли:

    /lib64/ld-linux-x86-64.so.2 /path/to/executable
    
  • 32-бітні виконувані файли:

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

Якщо вищезгадане не працює (або підвищує файл не знайдених помилок), спробуйте скористатися цим перед вищевказаною командою

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

Усі вищезазначені команди не працюватимуть для текстових сценаріїв (Bash, Python, Perl тощо), див. Нижче.

Перевірте, чи програма 64 чи 32-бітна

Використовуйте цю команду, щоб дізнатися, чи є виконуваним файлом 32 ( x86) або 64 ( x86-64) біт

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

Якщо це говорить i386:x86-64, то це 64 біт. Якщо він говорить i386тільки, то це 32 біт.


Сценарії

Для текстових сценаріїв (Bash, Python, Perl тощо) слід використовувати команду, вказану в першому #!рядку у файлі.

Наприклад, якщо перший рядок файлу є

#!/usr/bin/env python3

потім запустіть ці команди в терміналі (замінивши /path/to/fileправильний шлях)

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Файли Java

Для виконуваних jar Java можна просто використовувати ці команди (замінивши /path/to/jarправильний шлях):

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

Коли вам це не потрібно cd "$(dirname /path/to/file)"

Це можливі обставини, коли вам не потрібно використовувати cd "$(dirname /path/to/file)"перед тим, як запустити програму будь-яким методом: Якщо хоча б один правдивий, вам cdспочатку потрібно .

  • Програма не виконує жодних файлових операцій (наприклад: вона використовує лише apt-get)
  • Програма використовує cd(або еквівалент) для зміни абсолютного шляху перед тим, як робити будь-які файлові операції (наприклад cd "$(dirname "$0")":)
  • Програма не посилається на жодні відносні шляхи (шляхи, що починаються з ./або починаються без косої риски)

Якщо ви не впевнені, додайте cd "$(dirname "$0")"(або еквівалент) у верхній частині сценарію (якщо це застосовано) або використовуйте cd "$(dirname /path/to/file)"все одно.


1
Той , хто хоче , щоб сценарій цього і зробити його , щоб охопити всі можливості (якщо ви використовуєте MS файлові системи багато ) вітається в. Я міг би зробити це сам, але не розраховуйте на це. (+1 цей коментар, якщо ви хочете цього, достатньо підтримки, і я можу це зробити)
kiri

0

Якщо це сценарій оболонки, ви можете "джерело" його з іншого сценарію оболонки, тобто:

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

"$ @" Додає параметри командного рядка, якщо потрібно.

Сказавши це, це, мабуть, не найкраще рішення основної проблеми, але ми не знаємо достатньо про цю проблему, щоб запропонувати альтернативи.


Я не бачу, чим це особливо відрізняється відbash script $@
кірі

Це принципово не відрізняється експлуатацією. Швидше за все, я не розумію, яку проблему ви намагаєтеся вирішити - я припустив, що ви хочете виконувати скрипт, який (з будь-якої причини) не виконується. "Зробіть одну, яка є виконуваною, і нехай вона буде джерелом іншої" - це одне рішення цієї проблеми. Якщо це неправильна проблема ... ну :)
Stabledog
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.