In this brief tutorial, we will learn how to restore or recover deleted commands in Linux using coreutils and busybox.
Table of Contents
Introduction
We usually use rm command to remove stuffs in Linux, right? Yes. What if we use rm to rm rm? In other words, what if we remove /bin/rm file using rm command? I always wondered what would happen if I actually do this in a Linux machine. So I quickly spin up a Ubuntu VM and deleted the /bin/rm file by running the following command:
$ sudo rm /bin/rm
I thought I could easily recover the deleted rm command by reinstalling the Gnu coreutils package, because rm command is part of coreutils package, isn't?
So I tried to reinstall coreutils package using apt package manager like below:
$ sudo apt install --reinstall coreutils
Oh man, I was wrong! The apt package manager requires rm, so it can't reinstall the coreutils package.
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 0 not upgraded.
Need to get 1249 kB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 http://in.archive.ubuntu.com/ubuntu focal/main amd64 coreutils amd64 8.30-3ubuntu2 [1249 kB]
Fetched 1249 kB in 2s (747 kB/s)
dpkg: warning: 'rm' not found in PATH or not executable
dpkg: error: 1 expected program not found in PATH or not executable
Note: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin
E: Sub-process /usr/bin/dpkg returned an error code (2)I also tried to compile it from source, but it doesn't work either, because the Makefile uses rm. Up until now, I didn't know that the reinstallation is not possible without rm command.
I thought restoring deleted commands is trivial. However, in this particular case I couldn't restore the rm command. Eventually I found the solution after couple web searches. If you've ever accidentally removed rm command (I hope you won't), you could use any one of the following methods to recover it. Not just rm command, you could use this procedure to recover almost all deleted core commands provided by the coreutils package.
Disclaimer:
You MUST NOT DO THIS ON A PRODUCTION SYSTEM. It is strictly for education purpose only!.
Recover deleted commands in Linux using coreutils
For those who don't know, the Gnu coreutils package provides essential core commands such as cat, ls, rm, mkdir, rmdir, touch, and many more. It comes pre-installed with most GNU/Linux distributions.
To recover the deleted rm command, first create an empty binary file with name "rm" under /bin/ location:
$ sudo touch /bin/rm
Make it executable:
$ sudo chmod +x /bin/rm
Download the coreutils package using command:
$ apt download coreutils
Please note that we can't reinstall coreutils but download it. Also, we don't need to use sudo privileges to download a package.
Unpack the downloaded package with the following dpkg command:
$ sudo dpkg --unpack coreutils_8.30-3ubuntu2_amd64.deb
The above command simply unpacks the coreutils package, but will not configure it.
Done! Now, you can start using the rm command. To verify if the functionality of the rm command is restored, simply delete any unwanted file. For example, I deleted coreutils package which I downloaded earlier:
$ rm coreutils_8.30-3ubuntu2_amd64.deb
Great! It works!
And, please don't ever do this on a production system!!
Restore deleted commands using busybox in Linux
BusyBox is software suite that provides many common UNIX utilities into a single small executable. It provides replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc. It is available by default in Debian and its derivatives like Ubuntu and many other Linux distributions.
You can view the list of core commandline utilities provided by busybox using command:
$ busybox --list
Sample output:
[ [[ acpid adjtimex ar arch arp arping ash awk basename bc blkdiscard blockdev brctl bunzip2 busybox bzcat bzip2 cal cat [..]
In my Ubuntu 20.04 LTS desktop, busybox provides around 263 command line utilities.
Now let us restore the deleted rm command by temporarily creating a symlink to it. Run the following command to temporarily symlink /bin/rm to /bin/busybox:
$ ln -s busybox /bin/rm
Then reinstall coreutils package using command:
$ sudo apt install --reinstall coreutils
That's it. The above command will restore the rm command.
As stated earlier, this procedure is not just for recovering rm command. I guess we can recover almost all Linux commands using these methods. Check it yourself on a VM and see it it works! Again, don't do this in a production system. You have been warned!





2 comments
If the only problem was a missing rm command, you could simply create a new rm executable which would only need the system function call unlink, assuming you have a working toolchain. Alternatively create a shell script called /bin/rm which just renames the “file_name” parameters to “file_name.DELETED” and clean them up later when rm has been reinstalled.
Where you are really messed up is if you have deleted the perl executable because apt will not work without perl.
The best way to solve major crises with missing system files is to have a bootable rescue CD or USB stick of the same distribution version which can then be used to do repairs.
The greatest single point of failure is in fact the /lib/your_archiitecture/libc*.so library file since nothing will work without that.
Thanks. Today I learned Apt requires Perl to work.