How can I execute a file without execute permissions?
Solution 1:
Check file ownership
Please do this before anything further (unless you are sure you own the file).
Check and make sure that you own the file which you are trying to execute with one of the following methods.
Graphical
- Right click the file.
- Click 'Properties'.
- Click the 'Permissions' tab.
- Ensure that the 'Owner' field says your username. If it doesn't see "Change file ownership" below
Command Line
-
Execute this command in a terminal
[ ! -O "/path/to/file" ] && echo "You don't own the file"
-
If it prints "
You don't own the file
", see "Change file ownership" below.
Change file ownership
Execute this command in a terminal
sudo chown $USER:$(id -gn $USER) "/path/to/file"
Executable Files
An answer I found from a comment by Lekensteyn on an answer for a question about chmod
on NTFS partitions which I think deserves it's own question and answer, full credit to Lekensteyn.
Use this command for executable files (substituting /path/to/executable
with the correct path):
-
64 bit executable files:
/lib64/ld-linux-x86-64.so.2 /path/to/executable
-
32 bit executable files:
/lib/ld-linux.so.2 /path/to/executable
If the above doesn't work (or raises file not found errors), try using this before the above command
cd "$(dirname /path/to/executable)"
All the above commands will not work for text based scripts (Bash, Python, Perl, etc.), see below.
Check if a program is 64 or 32 bit
Use this command to find out if a executable is 32 (x86
) or 64 (x86-64
) bit
objdump -f "$file" | grep '^architecture' | cut -d, -f1 | sed 's/architecture: //'
If it says i386:x86-64
, then it's 64 bit. If it says i386
only, then it's 32 bit.
Scripts
For text based scripts (Bash, Python, Perl, etc.), you should use the command specified in the first #!
line in the file.
For example, if the first line of the file is
#!/usr/bin/env python3
then run these commands in a terminal (substituting /path/to/file
with the correct path)
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
Java .jar
files
For Java executable jar's, you can simply use these commands (substituting /path/to/jar
with the correct path):
cd "$(dirname /path/to/jar)" # Not strictly necessary, see section below
java -jar /path/to/jar
When you don't need cd "$(dirname /path/to/file)"
These are possible circumstances where you wont need to use cd "$(dirname /path/to/file)"
before running the program with any method: If at least one is true, you wont need cd
first.
- The program doesn't perform any file operations itself (example: it only uses
apt-get
) - The program uses
cd
(or equivalent) to change to an absolute path before doing any file operations (example:cd "$(dirname "$0")"
) - The program doesn't reference any relative paths (paths starting with
./
or starting with no slash)
If unsure, add cd "$(dirname "$0")"
(or equivalent) to the top of the script (if applicable) or use cd "$(dirname /path/to/file)"
anyway.