介绍
学习Linux命令行时,一个流行的警告是,没有“撤消”命令。 这是对于像使用删除文件,特别是相关的rm
命令,但在各种情况的影响。
在本指南中,我们将讨论一些方法来“撤消”在命令行上进行的一些更改。 没有单一的策略,所以涉及的程序和技术取决于你正在试图防御什么。 我们将从一些明显的想法开始,并向前迈进。
我们将在Ubuntu 12.04系统上实现这些功能,但是大多数Linux发行版和版本都应该能够在很少调整的情况下实现建议。
撤消文件更改
恢复已无意中(或删除)的文件的唯一方法之一是有一个额外的文件副本。 我们将讨论几种确保您拥有该选项的方法。
备份
当然,能够还原服务器上所做更改的最简单和最安全的方法是对重要文件运行常规例行备份。
在Linux系统上有大量的备份程序可用。 如何一些导游安装和配置的备份可以在这里找到。 重要的是研究工具之间的差异,以找出哪一个最适合您的需要。 同样重要的是定期验证您的备份,以确保他们正在做你想要他们做的。
备份提供了一种非常完整的方法来恢复您的服务器的损坏。 它们可以处理总数据损坏或删除,只要复制的数据保存在远程位置。
不同的备份级别包括完全备份(完全备份所有数据),差异备份(备份自上次完全备份后更改的每个文件)和增量备份(备份自上次完全备份或差异备份后文件中的数据更改) 。
这些级别的组合通常彼此串联使用以完全备份文件,而没有每次运行完全备份的开销。
通常,可以恢复单个文件,而无需恢复整个文件系统。 如果您不小心删除或修改文件,这是非常有用的。
DigitalOcean提供备份计划,将定期自动备份整个服务器。 您可以通过选中页面底部的框来创建Droplet时启用此功能。
版本控制
与备份有些类似的策略是版本控制。 虽然不是备份整个计算机的理想解决方案,如果您试图简单地将文件还原到先前的状态,版本控制可能正是您要找的。
版本控制系统,如git
和mercurial
,让您跟踪文件的更改。 这意味着,如果你把你的配置目录,如/etc
,版本控制之下,你可以,如果你所做的东西打破的变化轻松地恢复您的更改。
我们有好几篇文章涵盖了如何使用git您的服务器上。
简而言之,您可以使用以下命令在Ubuntu上安装git:
sudo apt-get update
sudo apt-get install git
安装完成后,您需要通过键入以下内容来设置几个配置选项:
git config --global user.name "your_name" git config --global user.email "your_email"
完成此操作后,切换到要跟踪更改的目录。 我们将使用/etc
目录下的这个例子。 另一个放在版本控制下的好地方是你的主目录。 我们可以通过键入以下内容来初始化一个git存储库:
cd /etc
sudo git init
然后,您可以通过键入以下内容添加此目录(和子目录)中的所有文件:
sudo git add .
通过键入以下内容来提交更改:
git commit -m "Initial commit"
您的文件现在将受版本控制。 当您对此目录中的文件进行更改时,您将需要重新运行最后两个命令(使用不同的消息,而不是“初始提交”)。
然后,您可以通过在日志中查找提交哈希,将文件还原到先前的状态:
git log
commit 7aca1cf3b5b19c6d37b4ddc6860945e8c644cd4f Author: root Date: Thu Jan 23 13:28:25 2014 -0500 again commit 4be26a199fd9691dc567412a470d446507885966 Author: root Date: Thu Jan 23 13:20:38 2014 -0500 initial commit
然后通过tyipng恢复文件:
git checkout commit_hash -- file_to_revert
这是一个简单的方法来还原您可能已经做出的更改。
请记住,这只有当你准备好定期提交git,因为你进行修改工作很好。 其中一个想法是建立一个cron作业定期运行此。
使用程序包管理器还原更改
有时候,你可以使用作出一些改变apt
,你想恢复包管理器。 其他时候,软件包管理器可以帮助您将软件包恢复为默认设置。 我们将在下面讨论这些情况。
使用Apt卸载软件包
有时,你安装一个包只是为了发现它不是你想要保留的东西。 您可以通过键入在apt中删除一个包:
sudo apt-get remove package
但是,这将保留配置文件不变。 有时候这是你想要的,但如果你想从你的系统中完全删除软件包,您可以使用purge
命令代替,就像这样:
sudo apt-get purge package
这几乎完全相同的方式操作,但也删除与包关联的任何配置文件。 如果您确定不再需要该软件包,或者您尚未进行任何修改,并且可以依赖于默认配置文件,这将非常有用。
您可以使用autoremove apt命令卸载任何不再需要的自动安装的依赖关系:
sudo apt-get autoremove --purge
使用apt安装软件包时发生的另一个问题是“meta-packages”可能难以正确删除。
元包是简单的依赖列表的包。 它们不会自己安装任何东西,而是一系列要插入的其他软件包。它们也很难以自动方式完全删除。
一个工具,可以帮助是deborphan
软件包。 安装它像这样:
sudo apt-get install deborphan
在删除一个元包,您可以运行orphaner
命令来查找已经离开了包卸载孤儿。 这将帮助您找到没有通过常规方法删除的软件包。
发现杂散文件的另一种方法是通过mlocate
包。 你可以这样安装:
sudo apt-get install mlocate
然后,您可以通过发出以下命令更新文件的索引:
sudo updatedb
然后,您可以搜索程序包名称,以查看文件系统上(在apt索引之外)的引用了该程序包的其他位置。
locate package_name
您还可以通过检查apt日志来查看元包安装的文件包:
sudo nano /var/lob/apt/history.log
您可以使用有关已安装的软件包的信息,并手动删除它们,如果不再需要它们。
恢复默认文件
有时,在配置期间,您更改配置文件,并希望还原回分发包打包的默认文件。
如果要将当前配置文件保留为备份,可以通过键入以下内容将其复制:
sudo mv file file.bak
如果您没有对相关目录的写入权限,则上述命令中的sudo是必需的。 否则,您可以忽略该命令。
删除该文件或将其移开后,您可以重新安装该软件包,告诉您检查是否缺少任何配置文件:
sudo apt-get -o Dpkg::Options="--force-confmiss" install --reinstall package_name
如果你不知道哪个包负责你需要恢复配置文件,可以使用dpkg
实用程序来告诉你:
dpkg -S file_name
如果只想运行某些安装期间发生的初始程序包配置步骤来更改某些值,则可以发出以下命令:
dpkg-reconfigure package_name
这将重新启动最初安装程序时发生的配置提示。
查找文件的默认权限
当您修改文件权限时,另一个常见的情况发生。 有时,您为了测试目的而更改文件的权限,或者因为您已经遵循了一些建议,以便稍后发现这是一个坏主意。
通过查找哪个包拥有一个文件,可以找到您的发行版打包的文件的默认权限。 你可以通过发出这个命令:
dpkg -S filename
这将告诉你与该文件相关联的包。 举例来说,如果我们要找出的包所有者/etc/deluser.conf
文件,我们可以输入:
dpkg -S /etc/deluser.conf
adduser: /etc/deluser.conf
正如你所看到的,它告诉我们adduser
包负责该文件。 然后,我们可以检查.deb
改变成易存档的文件包:
cd /var/cache/apt/archive
在这个目录中,你会发现.deb
文件对于很多系统上安装的软件包。 如果找不到与您正在使用的包匹配的文件,则可能必须使用以下命令从存储库重新下载它:
sudo apt-get download package
举例来说,如果没有.deb
对我们adduser
包,我们可以获取一个通过键入:
sudo apt-get download adduser
一旦文件在该目录中,我们可以通过键入以下内容查询其安装的文件的默认属性:
dpkg -c file.deb
对于adduser
程序,这可能是这个样子:
dpkg -c adduser_3.113ubuntu2_all.deb
drwxr-xr-x root/root 0 2011-10-19 18:01 ./ drwxr-xr-x root/root 0 2011-10-19 18:01 ./etc/ -rw-r--r-- root/root 604 2011-10-19 18:01 ./etc/deluser.conf drwxr-xr-x root/root 0 2011-10-19 18:01 ./usr/ drwxr-xr-x root/root 0 2011-10-19 18:01 ./usr/sbin/ -rwxr-xr-x root/root 35120 2011-10-19 18:01 ./usr/sbin/adduser -rwxr-xr-x root/root 16511 2011-10-19 18:01 ./usr/sbin/deluser . . .
如您所见,我们可以验证默认包是否为所有者(root)设置读/写访问权限,以及为所有其他用户设置读访问权限。
结论
你现在应该有一些策略,扭转你所犯的错误,并有如何提前计划给自己一个应急计划的想法。 上面提到的几乎所有的概念都使用了某种先前状态的记录,无论是由您创建的还是通过您的分布的存储库可用的。
这应该加强维护对您很重要的文件副本的重要性。 无论是数据文件还是配置参数,当系统处于良好工作状态时跟踪系统的外观,将有助于您在出现问题时修复问题。
在下面的评论中,发布任何其他建议,以恢复更改。