Linux下如何避免误操作执行 rm

转载自 Linux下如何避免误操作执行 rm


最近IT圈子流行着一个段子:


某个蠢萌的程序员,不小心在公司的服务器上输入了 rm -rf/ 指令,结果......现在还没出狱呢。



当然,绝大部分程序员不可能犯下如此低级的错误,更何况也没有执行权限。


但是,Linux下有些指令非常重要,或者说非常危险,rm就是其中之一,无论跟什么参数,需要的是谨慎的操作,以下就是个真实的教训:


1.vi编辑文件的时候,需要执行":w"退出,但是w和~的键位非常近,输入":w ~"指令,于是当前路径,创建了一个名称"~"文件。

-rw-r--r--. 1 oracle oinstall    2 Feb  1 01:10 ~


2. 删除文件,执行rm指令,

$ rm ~

回车下来,一直hang,以为出现问题了,于是执行ctrl+c。


3.一会在看用户家目录,发现原来存储的文件,怎么找不着了?开始以为有人误删除了,于是使用last,查看历史登录的用户信息,发现只有自己。


4.使用history看下历史执行的指令,

...

210 rm ~

211 ls -rlht

212 rm -rf ~

...


5. 此时恍然大悟,忘记了"~"的含义,

$ echo ~
/home/user


其实"~"代表了用户的家目录,之所以(2)出现了hang,因为家目录下有文件,删除需要时间,如果文件较小,执行rm可以立即看见提示,

$ rm ~
rm: cannot remove `/home/user': Is a directory


由于~代表家目录,因此是一个文件夹不是文件,所以直接使用rm提示错误,需要-rf参数,此时用户家目录下未被删除,

$ rm -rf ~
rm: cannot remove `/home/user': Permission denied


此时虽然会提示错误,但当前用户家目录下,所有的文件均已被删除,只是因为权限不能删除/home/user,如果此时用的root,我猜就可以执行。


因此可以任意执行指令rm,是非常危险的一件事情,极有可能让你误操作,甚至未反应过来,有什么方法可以避免?


一个是要建立这种意识,就是执行这种特殊指令前,不要急于回车,静下来一两秒,再做操作,但说起来容易,做起来难,不是一朝一夕,就能建立。


另一个是可以通过技术手段,降低执行rm的误操作程度,网上有不少方法,其中一种方法,就是建立类似回收站机制:


1. 用户家目录下,建立隐藏文件夹.trash,

$ mkdir .trash


2. 创建remove.sh脚本,实现逻辑简单,

$ vi remove.sh


//定义文件夹目录.trash

TRASH_DIR="/home/user/.trash"
for i in $*; do

    //定义秒时间戳

    STAMP=`date +%s`

    //得到文件名称(非文件夹),参考man basename

    fileName=`basename $i`

    //将输入的参数,对应文件mv至.trash目录,文件后缀,为当前的时间戳

    mv $i $TRASH_DIR/$fileName.$STAMP
done


3. 修改.bashrc,增加一行,

# User specific aliases and functions
alias rm="sh /home/user/tool/remove.sh"

即设置一个rm同名alias。


4. 此时执行rm,

$ rm 1


进入隐藏文件夹,

$ cd .trash


检索当前路径,

$ ls

1.1517500702


其实执行rm 1,只是将文件1执行mv,存储于隐藏目录.trash,并用时间戳改名,需要的时候可以直接恢复,实现回收站机制。


5. 当然目录.trash,需要控制容量,一种方法,是可以写个定时任务,要是智能一些,就可以判断文件夹的容量,超过阈值,就执行清理操作,要是粗暴一些,可以每日定时执行清理,例如,

0 0 * * * rm -rf /home/user/.trash/*

每日00:00定时执行,清空隐藏目录.trash。


对于Linux下的一些重要指令,首先要有敬畏,意识上建立起谨慎的态度,其次可以使用一些技术手段,限制这些误操作,方法可能不少,重要的是,找到符合自己的需求,达到避免误操作的目的,这是需要积累的经验。



最近IT圈子流行着一个段子:


某个蠢萌的程序员,不小心在公司的服务器上输入了 rm -rf/ 指令,结果......现在还没出狱呢。



当然,绝大部分程序员不可能犯下如此低级的错误,更何况也没有执行权限。


但是,Linux下有些指令非常重要,或者说非常危险,rm就是其中之一,无论跟什么参数,需要的是谨慎的操作,以下就是个真实的教训:


1.vi编辑文件的时候,需要执行":w"退出,但是w和~的键位非常近,输入":w ~"指令,于是当前路径,创建了一个名称"~"文件。

-rw-r--r--. 1 oracle oinstall    2 Feb  1 01:10 ~


2. 删除文件,执行rm指令,

$ rm ~

回车下来,一直hang,以为出现问题了,于是执行ctrl+c。


3.一会在看用户家目录,发现原来存储的文件,怎么找不着了?开始以为有人误删除了,于是使用last,查看历史登录的用户信息,发现只有自己。


4.使用history看下历史执行的指令,

...

210 rm ~

211 ls -rlht

212 rm -rf ~

...


5. 此时恍然大悟,忘记了"~"的含义,

$ echo ~
/home/user


其实"~"代表了用户的家目录,之所以(2)出现了hang,因为家目录下有文件,删除需要时间,如果文件较小,执行rm可以立即看见提示,

$ rm ~
rm: cannot remove `/home/user': Is a directory


由于~代表家目录,因此是一个文件夹不是文件,所以直接使用rm提示错误,需要-rf参数,此时用户家目录下未被删除,

$ rm -rf ~
rm: cannot remove `/home/user': Permission denied


此时虽然会提示错误,但当前用户家目录下,所有的文件均已被删除,只是因为权限不能删除/home/user,如果此时用的root,我猜就可以执行。


因此可以任意执行指令rm,是非常危险的一件事情,极有可能让你误操作,甚至未反应过来,有什么方法可以避免?


一个是要建立这种意识,就是执行这种特殊指令前,不要急于回车,静下来一两秒,再做操作,但说起来容易,做起来难,不是一朝一夕,就能建立。


另一个是可以通过技术手段,降低执行rm的误操作程度,网上有不少方法,其中一种方法,就是建立类似回收站机制:


1. 用户家目录下,建立隐藏文件夹.trash,

$ mkdir .trash


2. 创建remove.sh脚本,实现逻辑简单,

$ vi remove.sh


//定义文件夹目录.trash

TRASH_DIR="/home/user/.trash"
for i in $*; do

    //定义秒时间戳

    STAMP=`date +%s`

    //得到文件名称(非文件夹),参考man basename

    fileName=`basename $i`

    //将输入的参数,对应文件mv至.trash目录,文件后缀,为当前的时间戳

    mv $i $TRASH_DIR/$fileName.$STAMP
done


3. 修改.bashrc,增加一行,

# User specific aliases and functions
alias rm="sh /home/user/tool/remove.sh"

即设置一个rm同名alias。


4. 此时执行rm,

$ rm 1


进入隐藏文件夹,

$ cd .trash


检索当前路径,

$ ls

1.1517500702


其实执行rm 1,只是将文件1执行mv,存储于隐藏目录.trash,并用时间戳改名,需要的时候可以直接恢复,实现回收站机制。


5. 当然目录.trash,需要控制容量,一种方法,是可以写个定时任务,要是智能一些,就可以判断文件夹的容量,超过阈值,就执行清理操作,要是粗暴一些,可以每日定时执行清理,例如,

0 0 * * * rm -rf /home/user/.trash/*

每日00:00定时执行,清空隐藏目录.trash。


对于Linux下的一些重要指令,首先要有敬畏,意识上建立起谨慎的态度,其次可以使用一些技术手段,限制这些误操作,方法可能不少,重要的是,找到符合自己的需求,达到避免误操作的目的,这是需要积累的经验。


猜你喜欢

转载自blog.csdn.net/moakun/article/details/80391855