就在几个小时前,我头脑发热把 /usr/bin/ 目录删掉了。
当初只是有个软件装错路径了打算删掉,删的时候被提示这是个目录,当时第一反应是“这个东西居然是个目录?”,于是就加了 -rf ,后来提示 “command not found”的时候才发现这个目录,不对劲啊?
因为 /usr/bin/ 存放的是大部分程序的可执行文件,被删掉的话意味着很多命令都不能用了,比较严重的有:
1. sudo命令没了,意味着不能通过sudo来获取管理员权限。
2. 一些登录相关的命令没了,登录时会一直在输入用户名和密码之间循环,也就是说这时候不能让电脑关机,不然就别想再登录进去了。
3. 一些图形界面相关的程序没了,表现在设置和终端之类的窗口打不开,Tilix不能分屏,也就是说图形界面的文件管理器不能用了,终端也不能再打开了(只能靠当初rm的那个终端苟活- -)
在 linux 中使用 rm 命令删除文件/文件夹是不会把文件放进回收站的,也就是说被删的文件是不能被轻易恢复的。网上找了下方法,其中有一部分是要装软件的,因为apt被我删了,所以这类方法都不能用?。后来灵机一动:bin 里面的文件都是编译好的二进制文件,这样的话在另一台环境相似的电脑上复制一下目录不就可以了!
首先要解决的第一个问题是root权限的问题,还好有另一个获取权限的命令 su 是不在 /usr/bin/ 的,于是便用 su 获取 root 权限。(Ps:用 su 切换到 root 是要输入 root 的密码的,这里我能用 su 是因为我当初有改过 root 的密码,不然 root 的密码会是一个随机的密码,也就是一个谁都不知道的密码。)
由于 zsh 被删,而且之前自己手贱把 root 的默认 shell 设置成了 zsh ,所以在 su 的时候要指定一下 shell ,用 -s 参数:
su root -s /bin/bash
然后从另一台电脑上复制一份 /usr/bin/ ,ubuntu 的 U盘默认挂载在 /media/ 里的一个用户名同名的文件夹里,所以可以直接访问,不然的话需要用 mount 挂载。
复制后还要解决两个问题:
1. 权限的设置。
2. 软链接的设置。
首先U盘中复制过来的文件是没有执行权限的,喵了一下另一台电脑里对应文件的权限,发现全是 755 权限,所以可以一键设置(#表示管理员身份执行):
# chmod 755 /usr/bin/*
除了执行权限外还要设置所属执行者的权限,/usr/bin/ 中的执行者权限大多是 root:root 的,但其中也会出现一些叛徒:
因为不是 root:root 权限的并不多,所以可以手动一个个设置:
# chown root:[对应用户] [对应文件]
另一个要解决的问题就是软链接的问题了,首先找出原来那些文件是软链接过去的:
ls -l | grep \>
把命令的输出重定向到文件中,然后用 vim 整理一下(因为是在没有删 /usr/bin/ 的电脑里,所以有 vim ),去除没用信息,方便一会写脚本。处理完后只剩下文件名和源头,长这样子:
因为 ls -l 出来的文件名和源文件跟我一会要用的 ln -s 命令的是反过来的,所以要写个程序调一下:
/** reverse.cpp **/
#include <iostream>
using namespace std;
int main(){
string str1;
string str2;
while(cin>>str1 && cin>>str2){
cout<<"ln -s "<<str2<<" "<<str1<<endl;
}
return 0;
}
把刚才 vim 整理后的文件作为重定向输入,然后把结果重定向输出到脚本文件中,再整理一下:
## myLn.sh ##
#!/bin/bash
cd /usr/bin/
ln -s /etc/alternatives/aclocal aclocal
ln -s x86_64-linux-gnu-addr2line addr2line
... (省略) ...
ln -s ../lib/llvm-6.0/bin/yaml-bench yaml-bench-6.0
ln -s /bin/zsh zsh
echo done!
直接执行脚本就搞定软链接问题了,虽然有一些没有的文件也链进去了,不过只是占少数,而且应该影响不大:
这时候有很多命令都可以用了,但也还有一些问题:
查了一下原来 sudo 需要比 x 更高级的 s 权限,首先看一下原先哪一些文件是需要 s 权限的:
ls -l | grep -e "[w|-]sr"
发现有两类,一类是 s 在前(拥有者的),一类是 s 在中间(群组的),都设置一下权限:
chmod u+s [文件名] #对于s在前的
chmod g+s [文件名] #对于s在后的
弄完这个后就基本上修复完毕了!(?)
最后这个一定要看!
千万不要在马原课上搞 Linux 的东西!?