Как я могу выполнить файл без разрешения на выполнение?

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 этот комментарий, если вы хотите этого, достаточно поддержки, и я мог бы это сделать)
Кири
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 "$@"

"$ @" Добавляет параметры командной строки, если это необходимо.

Сказав это, это, вероятно, не лучшее решение для основной проблемы, но мы недостаточно знаем об этой проблеме, чтобы предложить альтернативы.

Stabledog
источник
Я не вижу, как это особенно отличается отbash script $@
Кири
Это не принципиально отличается в эксплуатации. Скорее всего, я не понимаю, какую проблему вы пытаетесь решить - я предполагал, что вам нужен способ щелчка и щелчка для выполнения сценария, который (по какой-либо причине) не исполняется. «Создайте один исполняемый файл и сделайте его источником другого» - одно из решений этой проблемы. Если это не та проблема ... хорошо :)
Stabledog