So I did a chmod -x chmod
. How I can fix this problem? How do I give execute rights back to chmod?
Asked
Active
Viewed 1.3k times
29
Rook
- 2,615
- 5
- 26
- 34
-
11You accidentally the whole `chmod`! – Thanatos Nov 05 '10 at 16:43
-
1See also the [question on Unix & Linux SE](http://unix.stackexchange.com/q/83862/21962). – unor Jul 27 '13 at 11:51
10 Answers
45
bindbn
- 5,153
- 2
- 26
- 23
-
bindbn, I was about to post the same link :-) but I was reading myself as I am new to unix / linux stuff !!! – Mutahir Oct 11 '10 at 07:43
-
2On a 64-bit distro, you may have to use `/lib64/ld-linux-x86-64.so.2` instead. `ldd /bin/chmod` should list exactly which linker to run. – goldPseudo Oct 11 '10 at 07:52
-
-
Could someone explain why that works, for the uninitiated? I think I get it, but some documentation would be great. – Stefan Lasiewski Oct 11 '10 at 22:12
-
1@Stefan: From `man ld-linux.so`: "ld.so [and ld-linux.so] loads the shared libraries needed by a program, prepares the program to run, and then runs it." (`ld.so` is for `a.out` format executables and `ld-linux.so` is for ELF format.) – Dennis Williamson Oct 12 '10 at 00:58
-
1@Stefan: The kernel doesn't really know how to load and execute dynamically-linked executables, because it is highly complex and follows the glibc, not the kernel. `ld-linux.so` is sort-of executable/library hybrid, sort-of statically linked, runs in userspace, and is responsible of loading dynamically-linked executables and all their dependencies, then running them. – Juliano Nov 05 '10 at 17:09
-
/lib/ld-linux.so.2: symbolic link to `/lib32/ld-linux.so.2' What if I'm on 64bit machine? – confiq Jul 24 '11 at 15:14
18
Use python:
# python
Python> import os
Python> os.chmod("/bin/chmod",0755)
Douglas Leeder
- 2,725
- 18
- 15
-
4And, as a one-liner: `python -c "import os; os.chmod('/bin/chmod', 0755)"` – Thanatos Nov 05 '10 at 16:35
-
@Thanatos `python -c '__import__("os").chmod("/bin/chmod", 0755)'` does the same without using any semicolons. – Sapphire_Brick Oct 23 '20 at 03:14
18
This relies on the fact that permissions of a destination file are preserved rather than the source file when it is being copied over. We're "borrowing" the permissions of ls
:
cp /bin/ls /tmp/chmod.tmp
cp /bin/chmod /tmp/chmod.tmp
mv /tmp/chmod.tmp /bin/chmod
Dennis Williamson
- 60,515
- 14
- 113
- 148
-
-
-
This was similar to the solution I came up with, but after `cp`ing the executable, I just `cat`'d the contents of `chmod` into the temp file. – SpellingD Jul 21 '13 at 16:42
7
setfacl -m u::rx /bin/chmod
... will grant the owner execute permissions.
But, the /lib/ld-linux.so.2
trick is neat. :)
Kyle Brantley
- 1,321
- 1
- 11
- 14
5
This is weird... I saw something like this a few days ago via someone's tweet...
ThatGraemeGuy
- 15,314
- 12
- 51
- 78
-
Links to other sites are not helpful as the link will become broken at some point. This is like telling someone to google the answer. – Phil Hannent Oct 11 '10 at 13:19
-
@Phil Hannent: I've seen that slideshow too, just three days ago, so it was my first thought, if the OP was one of the applicants there. – Boldewyn Oct 11 '10 at 14:04
-
5
Should you be on a system where /bin/chmod
can't be loaded by the dynamic linker:
# /bin/mv /bin/chmod /bin/chmod.tmp
# install -p -m 755 /bin/chmod.tmp /bin/chmod
This works on my MacOS X system.
Alnitak
- 20,901
- 3
- 48
- 81
2
I suspect this is not a real question: http://www.slideshare.net/cog/chmod-x-chmod
- Reinstall chown: sudo apt-get install --reinstall coreutils
- perl -e 'chmod 0755, "chmod"'
- more examples in the slides
Julien
- 1,028
- 1
- 12
- 24
1
create a new chmod and use that for the original
umask 000
cat chmod > ~/my-chmod
~/my-chmod a+x chmod
Kevin M
- 2,302
- 1
- 16
- 21
-
Setting a umask of 000 won't give a file execute permission when it's created. It will, at best, get rw-rw-rw- permissions. – Barry Brown Oct 11 '10 at 15:25
-
2@Barry: It actually depends on the mode passed to creat(2)/open(2)/mkdir(2)/etc. If umask == 0 and the syscall that creates the file is given 0777 for the mode, then the file will have the execute bits turned on. For example, linkers/compilers pass 0777 when writing out an “executable file” (e.g. `(umask 000;gcc -o foo foo.c)` will produce a `foo` with mode 777). However, many (most?) shells pass 0666 when they open/create files for redirection, which means that this answer is not going to work under many shells. – Chris Johnsen Oct 12 '10 at 01:52