27

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

2

10 Answers 10

43

In Linux:

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

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

7
  • 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 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.) 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
18

Use python:

# python
Python> import os
Python> os.chmod("/bin/chmod",0755)
2
  • 4
    And, as a one-liner: python -c "import os; os.chmod('/bin/chmod', 0755)"
    – Thanatos
    Nov 5 '10 at 16:35
  • @Thanatos python -c '__import__("os").chmod("/bin/chmod", 0755)' does the same without using any semicolons. Oct 23 '20 at 3: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
3
  • I think your first cp needs to have the -p flag on
    – Riking
    Mar 9 '13 at 21:33
  • @Riking: It's not necessary for this purpose. Mar 9 '13 at 23:16
  • This was similar to the solution I came up with, but after cping the executable, I just cat'd the contents of chmod into the temp file.
    – SpellingD
    Jul 21 '13 at 16:42
10

Using Perl:

% perl -e 'chmod 0755, qw[/bin/chmod]'
7

setfacl -m u::rx /bin/chmod

... will grant the owner execute permissions.

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

5

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

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

3
  • 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. 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
4

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.

2

/rescue/chmod 555 /bin/chmod

I think you could also use mtree.

1
  • This would my favorite solution. It doesn't work with linux unfortunately.
    – user130370
    Aug 7 '12 at 18:01
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
1

create a new chmod and use that for the original

umask 000
cat chmod > ~/my-chmod
~/my-chmod a+x chmod
2
  • 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. 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. Oct 12 '10 at 1:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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