So I did a chmod -x chmod. How I can fix this problem? How do I give execute rights back to chmod?

link|improve this question

7  
You accidentally the whole chmod! – Thanatos Nov 5 '10 at 16:43
feedback

10 Answers

up vote 32 down vote accepted

In Linux:

/lib/ld-linux.so.2 /bin/chmod +x /bin/chmod

http://www.slideshare.net/cog/chmod-x-chmod

link|improve this answer
bindbn, I was about to post the same link :-) but I was reading myself as I am new to unix / linux stuff !!! – rihatum Oct 11 '10 at 7:43
2  
On 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 7:52
I would write a minimal program that uses chmod(2), but this is cooler – adamo Oct 11 '10 at 7:57
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 0: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 5 '10 at 17:09
show 2 more comments
feedback

Use python:

# python
Python> import os
Python> os.chmod("/bin/chmod",0755)
link|improve this answer
3  
And, as a one-liner: python -c "import os; os.chmod('/bin/chmod', 0755)" – Thanatos Nov 5 '10 at 16:35
feedback

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
link|improve this answer
feedback

This is weird... I saw something like this a few days ago via someone's tweet...

http://www.slideshare.net/cog/chmod-x-chmod

link|improve this answer
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
Same, just saw this on Reddit a few days back... – Dentrasi Oct 11 '10 at 22:31
feedback

Using Perl:

% perl -e 'chmod 0755, qw[/bin/chmod]'
link|improve this answer
feedback

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.

link|improve this answer
feedback

setfacl -m u::rx /bin/chmod

... will grant the owner execute permissions.

But, the /lib/ld-linux.so.2 trick is neat. :)

link|improve this answer
feedback

create a new chmod and use that for the original

umask 000
cat chmod > ~/my-chmod
~/my-chmod a+x chmod
link|improve this answer
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 1:52
feedback

/rescue/chmod 555 /bin/chmod

I think you could also use mtree.

link|improve this answer
feedback

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
link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.