Как я могу выполнить файл, не предоставляя себе разрешения на выполнение (с chmod u+x
) для него?
Если я попытаюсь установить флажок «Разрешить выполнение файла как программы», этот флажок будет немедленно удален.
Сделайте это перед чем-либо далее (если Вы не уверены, что владеете файлом).
Проверьте и удостоверьтесь, что Вы владеете файлом, который Вы пытаетесь выполнить с одним из следующих методов.
Выполните эту команду в терминале
[ ! -O "/path/to/file" ] && echo "You don't own the file"
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, и т.д.), видеть ниже.
Используйте эту команду, чтобы узнать, равняется ли исполняемый файл 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 можно просто использовать эти команды (замена /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)"
так или иначе.
Если это сценарий оболочки, вы можете «взять» его из другого сценария оболочки, например:
#!/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 "$@"
«$ @» добавляет параметры командной строки, если это необходимо. ]
Сказав это, это, вероятно, не лучшее решение для основной проблемы, но мы недостаточно знаем об этой проблеме, чтобы предложить альтернативы.