29

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

46

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, 2010 at 7:43
  • 3
    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, 2010 at 7:52
  • I would write a minimal program that uses chmod(2), but this is cooler
    – adamo
    Oct 11, 2010 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, 2010 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, 2010 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, 2010 at 16:35
  • @Thanatos python -c '__import__("os").chmod("/bin/chmod", 0755)' does the same without using any semicolons. Oct 23, 2020 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, 2013 at 21:33
  • @Riking: It's not necessary for this purpose. Mar 9, 2013 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, 2013 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, 2010 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, 2010 at 14:04
  • Same, just saw this on Reddit a few days back...
    – Dentrasi
    Oct 11, 2010 at 22:31
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.

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, 2012 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, 2010 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, 2010 at 1:52

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .