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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Consul入门

简介 为什么要用consul,这里就不详细介绍了,本文重点是Consul的搭建和使用过程。 Consul搭建 参考文献:http://tonybai.com/2015/07/06/implement-distributed-services-registery-and-discovery-by-consul/ 下载consul和consul UI 官方地址&…

Java Socket编程----通信是这样炼成的

转载自 Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的…

mysql级联复制转换成一主两从_一主两从转级联复制

一主两从 转 级联复制 示意图如下M ---> S1\ > M ---> S1 ---> S2\ --> S2如果有开启GTID操作起来方便多,GTID是唯一的,直接操作即可。如果使用file_name、position可以使用如下办法(现在还没开启gtid真的是无力吐槽)# 步骤1、# 现将S2的…

细说ASP.NET Core与OWIN的关系

前言 最近这段时间除了工作,所有的时间都是在移植我以前实现的一个Owin框架,相当移植到到Core的话肯定会有很多坑,这个大家都懂,以后几篇文章可能会围绕这个说下,暂时就叫《Dotnet Core踩坑记》吧,呵呵。 接…

mysql 外键和事务_Mysql (五)事务和外键

一、 什么是事务:简单说,所谓事务就是一组操作,这组操作要么都成功执行,要么都不执行。二、 事务的使用流程1. 第一步:开启事务,start transaction;2. 第二步:正常操作SQL语句&#…

微软发布正式版SQL Server 2016

微软于6.2 在SQL 官方博客上宣布 SQL Server 数据库软件的正式发布版本(GA),历时一年多,微软为该软件发布了多个公共预览版和候选版本,而今天最终版本终于上线了。在博客中,微软数据集团的企业副总裁 Josep…

怎样用bootsrapcol-md来实现四分屏_用会议平板提升会议效率,做好这两点

图片:皓丽编辑:好哩据相关科学研究显示,百分之 90% 的会议,完全可以在低于 30 分钟的时间内完成,而人的注意力集中的时间差不多也是在 40-45 分钟,所以提升会议效率,保持会议节奏的连续性和抓住…

JAVA 通过 Socket 实现 TCP 编程

转载自 JAVA 通过 Socket 实现 TCP 编程简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层…

Asp.net core与golang web简单对比测试

最近因为工作需要接触了go语言,又恰好asp.net core发布RC2,就想简单做个对比测试。 下面是测试环境: CPU:E3-1230 v2 内存:16G 电脑有点不给力 操作系统:Centos7.0(虚拟机单核2G内存) asp.net core rc2 golang v1.7beta1 下面是各…

mfc定义了变量仍提示未定义标识符_JavaScript-变量

好好学习,天天向上本章主要内容是:变量声明、命名规则、赋值变量变量(variables) 是计算机内存中存储数据的标识符,根据变量名称可以获取到内存中存 储的数据变量相当于一个容器,内部可以存储任意类型的数据…

Java基于socket服务实现UDP协议的方法

转载自 Java基于socket服务实现UDP协议的方法这篇文章主要介绍了Java基于socket服务实现UDP协议的方法,通过两个简单实例分析了java通过socket实现UDP发送与接收的技巧,需要的朋友可以参考下本文实例讲述了Java基于socket服务实现UDP协议的方法。分享给大家供大家参考。具体如下…

EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因

今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不多说,我们开始 环境和相关技术 本文采用的环境与技术 系统:WIN7 数据库:SQL Server2008 相关技术:MVC5 EF6.0 简单的记录 …

日期相减 python_如果将excel的数字转化为日期(高级教程)

不知道大家有没有这样的体会,明明我们在单元格里输入的是一个日期,但是excel却提示我们输入的是一个数字,这个东西就很奇怪了,43471怎么就成了日期了那?实际上这和计算机的底层设置有关系,计算机是无法直接…

JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser

转载自 JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser关于爬虫,之前一直用做第一个站的时候,记得那时候写的 爬虫 是爬sina 的数据,用的就是 htmlparser 可能是由于好奇和满足我当时的需求,那开始就各…

3到6年的.NETer应该掌握哪些知识

我们组的开发人力一直比较紧张,今年春节后,高层终于给了几个headcount,我们可以开始招人了。从三月初我们就开始找简历,渠道有拉钩,内推,我司自己的招聘网站和智联等。简历筛了很多,也打了很多电…

多边形上点的顺序排序_一种寻找多边形视觉中心的新算法

遇到的问题在一个多边形上放置文本标签或工具提示的最佳位置通常位于其“视觉中心”的某个位置,即多边形内部的一个点,周围有尽可能多的空间。计算这样一个中心首先想到的是多边形质心。你可以用一个简单快速的公式计算多边形中心,但如果形状…

通过Jexus 部署 dotnetcore版本MusicStore 示例程序

ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示如何在CentOS上运行.NET Core版本的MusicStore,并通过Jexus对外发布。 上篇文章 《结合Jexu…

java爬虫之基于httpclient的简单Demo(二)

转载自 java爬虫之基于httpclient的简单Demo(二)延续demo1的 java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一),demo2出炉啦,大家想学爬虫都可以从这个网盘学习哦:https://pan.baidu.com/s/1pJJrcqJ#list/path%2F 免费…

神经网络中的最小二乘_深度神经网络:噪声中解读出科学

该研究介绍了一种基于深度神经网络的基本新方法,以基于已知的物理模型将函数形式拟合到噪声数据。来自美国橡树林国家实验室的Stephen Jesse领导的团队,提出了一种新的方法,可用来逆向解决问题,可从基于光谱成像数据的最小二乘拟合…

微软开放Holographic平台,意在统一VR的操作系统?

在刚刚结束的台北电脑展上,微软没有发布很多新品,而是宣布向第三方开放Windows Holographic(全息)平台,鼓励其他VR/AR头显使用该平台。近日外媒engadget发表文章,文中作者讲述了微软的野心,有意…