记一次数据恢复

引言

今天一位小兄弟准备实现一遍从删库到跑路的创举,于是把数据库里面的所有数据都给清空了,这一番操作可就苦恼我了,数据丢失那可是非常严重的问题,必须要对数据库进行恢复

恢复数据的过程

看到数据库为空的那一瞬间,我的大脑其实是不清醒的,然后那个瞬间我突然想起,我曾经写过一个定时脚本,它会在每天凌晨的三点钟对数据库进行全量备份。
在/var/mysql-backup目录下找到了20180426.sql的备份。于是先恢复一部分数据先,使用mysql的终端执行了下面的命令

mysql -uroot -p
use xxxdatabase;
source /var/mysql-back/20180426.sql

这样就把数据恢复到了晚上凌晨三点的状态,但是仅仅这样还是不够的,发现失去数据的时间为下午3点钟,这就是说从凌晨3点到下午3点整整12个小时的数据全部丢失,这样的损失仍然是无法接受的
于是检查一下/etc/my.cnf,发现我的习惯还是不错的,二进制日志默认开启,那么事情就简单了,只要把这个时间节点的二进制日志导出,继而恢复即可

基于二进制日志对数据库进行恢复

首先找到二进制日志所在的目录/var/mysql/,找到最近的二进制文件名称为mysql-bin.000011,
接下来在命令行下使用mysqlbinlog命令,导出这段时间的记录

ps 这里加上了--no-defaults 参数,因为在我的mysql5.7中 不加这个参数执行会出现mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8mb4'这样的错误

mysqlbinlog  --no-defaults    --start-datetime="2018-04-26 03:00:00" --stop-datetime="2018-04-26 15:00:00"  /data/mysql/mysql-bin.000011 > backup

这样就把这个时间点的数据全部导出到了backup中,然后用输入重定向的方式执行命令
~~~
mysql -u oort -p < backup
~~~~
然后检查了一下数据库,发现数据都回来了,完美的解决了问题

总结

数据是重中之重,定时脚本每天备份是必不可少的操作,然后二进制日志一定要开启,不要在乎那一点点的性能损耗,我们有必要用性能来换取数据库的容灾性。并且在有条件的情况下,请使用多台数据库做主从的操作,来保证数据库的容灾性质,

端口转发与反向隧道

引言

最近了解到一个叫做反向隧道的东西,发现这个可以用来很多黑科技的事情,于是就尝试了一下

准备材料

  • 一台云服务器
  • 一台带有ssh client的计算机

ssh动态端口转发

ssh有三种转发模式,本地端口转发 远程端口转发 动态端口转发,对应的参数分别是 -L -R -D
如果仅仅作为正向代理服务器的话,我们只要使用动态端口转发就可以了(这里只介绍动态端口转发进行科学上网,ssh更详细的用法还是查看手册比较好)

ssh -D  localhost:1991 root@server_ip

这样就在本地的1991端口开启了一个socks代理,接着是配置火狐浏览器的代理功能首选项->设置->手动设置代理

socks主机: localhost
端口: 1991

这样当前计算机就能通过1991端口,转向到云服务器从而获取网络资源了 ,不过这样只能给本机使用,如果希望当前局域网内的所有计算机使用的话,只要稍微改一下地址就可以了,假设本地计算机的ip地址是192.168.10.10,那么使用命令如下

ssh -D 192.168.10.10:1991 root@server_ip

这样在火狐浏览器中的配置就是

sockes主机: 192.168.10.10
端口: 1991

配置到局域网的ip之后,本地局域网内的所有计算机都可以通过这个ip进行代理,但是本机不能使用127.0.0.1的地址进行代理,如果你希望本地使用127.0.0.1 的方式并且局域网的其他计算机也可以访问的话,那么还是上一条命令稍稍做一下修改就可以了

ssh -D 0.0.0.0:1991 root@server_ip

这样本地使用127.0.0.1 或者局域网其他计算机使用192.168.10.10 就都可以使用代理服务器了

0.0.0.0其实不算是一个ip地址,它代表 的是你计算机上所有的ip地址

尾声

工具能够帮助你更好的完成一些复杂的任务,但是基础知识能够让你更加灵活的运用工具。

linux下分割文件

linux下分割文件

在 linux下工作的时候,总是需要对文件进行分割的时候,比如文件太大又或者希望把一段敏感信息分开存储,这个时候linux下强大的split就登场了,split工具分割文件的方式有两种,一种是以行的形式,另外一种是以二进制的形式

split的参数(split 8.25)

  • -a 分割后的文件的前缀
  • -b 以二进制方式分割文件
  • -C 每个输出文件的最大值
  • -d 以数字形式输出文件名
  • -e 不输出空文件
  • -l 以行的形式分割文件
  • -n 生成chuncks输出文件

实际用法

比如有一个文件名为file,大小为4M,那么可以通过下面的命令来切成4片

  • 二进制形式分割
split -b 1M  file

那么就会生成xab xac xad xae四个文件

  • 生成带上数字形式的文件
split -b 1M  -d file

带上了-d参数,那么生成的文件将会是x01 x02 x03 x04

  • 指定生成的文件的前缀
split -b 1M  -d file  suffix

那么生成的文件将会是suffix01 suffix02 suffix03 suffix04

  • 以行的形式分割

如果是文本文件,那么可以用-l 数字以行的形式进行分割

split -l 10 file

合并文件

分割之后必定有合并,否则就好像不怎么完整,不过合并就没有专用的工具了,但是还是一条命令就可以解决的 ,比如分割后的文件是xac xab xac xad四个,那么使用这样的命令

cat x* > newfile

这样新生成的文件newfile和原来的file文件就是一样的,使用md5sum工具可以计算出,他们具有相同的md5值

尾语

通过split工具,我们不仅仅可以单纯的把它当作一种切割文件的工具,其实也可以当作一种加密工具,有些时候自己个人的隐私数据保存成文本十不安全的,加密的话是一种选择,不过我还是更倾向于把文件分割开来,分开存储,需要的之后组合起来就能看到自己想要的数据了。未尝不是一种好的手法。linux下的工具丰富强大,怎么选择还是看个人,不过这一切都需要依靠自己主动的去探索。

利用ssh反向隧道控制内网计算机

引子

今天有个朋友告诉我他们 公司把teamviewer的端口封掉了,所以没有办法在家里控制公司的电脑去完成一些任务,于是就问我怎样进行内网穿透。这个时候我第一时间想到的是,通过在一台有公网ip的服务器上编写socket服务器,然后在客户端利用socket连接到服务器,连接到之后,把从服务器接收到的信息当做命令来执行,这样等于就是开了一个后门,可以实现内网穿透。正在我准备编写socket服务端代码的时候,我的直觉告诉我,这么简单的功能肯定已经有前辈实现了,本着不重复造轮子的良好习惯,于是顺手搜索了一下ssh,于是了解到反向隧道可以实现这个功能。

准备环境

  • 一台具有公网ip的服务器(必须开启sshd服务)
  • 一台unix/linux系列的客户端(必须开启sshd服务)

实现原理

这种手段的实现方式是,通过当前unix/linux客户端向服务器主动的建立一个SSL隧道,然后将服务器上的某个端口转发到当前客户端的22端口上,这样任何一台计算机包括服务器本身,都能使用服务器上开启的某个端口连接到当前的客户端上

实现过程

要先实现这个过程非常简单,现在定义服务器名称为S,服务器的ip地址为SADDR,服务器用户为root,需要开启的端口任意,这里使用7777, 客户端计算机的名称为C,客户端计算机的用户user
在C上使用命令主动的向S建立ssh隧道

ssh -p 22  -qngfNTR 7777:127.0.0.1:22  root@SADDR

这样一条命令就能在客户端C上建立了一条链接服务器S的ssh隧道
然后在S上就可以通过7777端口来连接到客户端C了,使用命令如下

ssh -p 7777 user@127.0.0.1

如果是其他计算机,那么可以使用下面的命令来连接

ssh -p 7777 user@SADDR

这样就完成了从外网利用ssh来访问内网的计算机了,当然ssh的 功能肯定不止这么一点,更多的功能就不多做介绍了,想要掌握更多的知识,最终还是需要自己去探索的。

工欲善其事必先利其器(二)—–vagrant

学会使用虚拟机之后,那么我们一定会面临一个比较棘手的问题:我们应该如何来管理这些虚拟机?因为我们常用的虚拟机都是配置好的,熟悉的环境,熟悉的工具。重复配置无疑是一种浪费时间的行为,为了避免这种浪费,那么我们需要一个强有力的工具vagrant.

什么是vagrant

Vagrant is a tool for building and managing virtual machine environments in a single workflow.

来自于官方的说法,vagrant就是专门用来建立和管理虚拟机环境的工具。

vagrant是用ruby语言编写的,在vagrant中所有的虚拟机环境都来自于一个叫做box的文件,通过 配置Vagrantfile,指定需要使用的box,然后配置cpu核心数量,内存大小,网络,共享文件,登录凭证等信息,可以快速的得到一个已经配置好的虚拟机环境。其实大多数配置都是可以省略的,最便捷的配置文件甚至只有一条配置。

什么场景下应该使用vagrant

抛开场景谈工具都是耍流氓,每一种工具都有它最适合存在的地方。虽然平时作为个人使用的时候,我们大多用来迁移和管理自己的虚拟机,但是我觉得它最实用的地方就是“团队协作”。每个人都会有自己的使用习惯,有些人习惯mac,有些人习惯linux,还有人则习惯用windows。哪怕同样用的是windows,也有win7和win10等各种区别,就算同样用的win7或者win10,那么大家用的IDE也可能都是不一样的。linux更不用说了,对应着各种不同的发行版。这个时候vagrant的强大就体现出来了,不管用户所使用的操作系统是何种类别,都能保证开发环境的一致性。这样可以避免开发过程中,因为环境不一致所带来问题。

获取vagrant

vagrant下载页,  可以获得最新版的vagrnat版本,有debian,windows,centos,mac.arch linux等各种版本可以选择,如果是ubuntu操作系统的话,除了可以使用debian的deb安装包来安装,还可以使用apt命令进行安装

sudo apt install vagrant

不过通过apt安装的vagrant版本不是最新版本,请酌情使用

vagrant操作

vagrant操作系统的基本操作非常简单,只有简单的几条命令

vagrant init  初始化虚拟机

vagrant up 启动虚拟机

vagrant provision 应用虚拟机配置

vagrant halt  关闭虚拟机

vagrant destroy 摧毁虚拟机

vagrant ssh  进入虚拟机终端

获得vagrant官方基本系统环境hashicorp/precise64的方法非常简单,只需要运行命令


vagrant init hashicorp/precise64
vagrant up

就可以获得一个基础的虚拟机环境了,不过需要注意的是,因为vagrant的box有时候体积比较大,在执行下载的过程中可能会非常缓慢甚至是没有办法获得资源的情况,如果在运行命令的过程中出现超时或者卡主的情况,可以在后面找到解决的办法

vagrant的box

vagrant官方提供了一系列的box下载,在下载页中,支持最多的虚拟机就是virtualbox,

vagrant中添加box的命令如下

vagrant box add  box名称 box路径     ps:可以是网络路径或者是本地路径

可以添加本地路径的box,那么我们可以先从下载页把box下载到本地,然后本地环境添加hashicorp/precise64,接着执行

vagrant init hashicorp/precise64
vagrant up

就能快速得到一个可用的虚拟机环境了

如果要查看当前可用的box,可以使用命令
vagrant box list

制作属于自己的box

box除了可以从网上获取之外,还自己制作,除了可以从无到有制作一个box,还可以在已有的box之上,添加一些定制功能,把它变成只属于自己的box

在vagrant中有一条命令,可以打包属于自己的虚拟机

vagrant package --base 虚拟机标识 --output box名称

ps:虚拟机标识不是在虚拟机页面显示的名称,这个标识需要通过命令vboxmanage list vms来得到,其中vboxmanage命令是virtualbox自带的工具,如果是其他虚拟机的话,则需要其他工具来获取

在使用vagrant中可能会遇到的问题

  • 在执行vagrant up过程中,出现超时或者卡住的现象,这个是因为网络的问题,因为在国内的网络速度不是很给力,而且还有GFW的存在可能没有办法获取到资源,不过这个可以通过添加本地box的方式或者通过科学上网工具来解决
  • vagrant up过程中,ssh配置失败,这个现象发生的原因有很多种,调试方法是打开gui选项,看看是否出现故障,其次是可以通过ssh vagrant@ip  password:vagrant 登录到虚拟机 手动配置ssh权限即可
  • 更多问题请仔细阅读vagrant官方文档,或者通过stackoverflow寻找解决方案

 

 

正则表达式

今天在 使用awk工具处理日志的时候,需要捕获ip地址进行分类,于是随手就写了一个匹配ip的正则((\d{1,3})\.){3}\d{1,3},但是在匹配的时候发现没有任何反应,仔细检查并测试之后,发现并不是我写的正则有问题,而是这是一个历史遗留问题。

正则表达式的种类

纵观整个Regular Expression(正则表达式)的历史,你就会发现,正则表达式是有一个发展过程的,像我上面写的((\d{1,3})\.){3}\d{1,3}这样的正则表达式,其实是比较现代的正则表达式,也就是Perl的正则表达式(Perl Regular Expression),简称PREs。但是在PREs出现之前,人们常用的是BREs(基础正则表达式),和EREs(扩展正则表达式)。

三种正则表达式的区别

如果单从语法的角度看,三种正则表达式并没有多大区别,都是由元字符+普通字符组成,其中元字符“ ^ $ . * + ?  ()  [] {} \ ” 这些基本的元字符都包含在内,这些元字符是正则表达式的基础,但是BREs基础正则表达式对于“* + ? () {}”的支持是需要转义才能使用的,比如在PREs中[0-9]{1,3}匹配1-3个0-9之间的数字,在BREs中的写法则是[0-9]\{1,3\}。

EREs和PREs在“ * + ? () {} ”的使用上则没有什么不同

在PREs中,我们常常使用\d \s \t \n \f \num 等等这种带有转义性质的特殊元字符,在BREs和EREs中是不 支持的

awk sed grep对三种正则表达式的支持

在linux命令行下,我们常常用的awk sed 以及grep命令,默认支持的都是BREs(基础正则表达式),不过grep带上参数之后可以提供对PREs和EREs的支持(grep -P, grep -E),如果习惯使用PREs的话,可以对grep 加上别名

alias grep = "grep -P"

解决方案

了解了三种表达式的区别以后,想要解决之前出现的问题,就非常简单了,只需要把(\d{1,3}\.){3}\d{1,3}改成(\d{1,3}\.)\{3\}\d\{1,3\},就解决了问题了。

正则表达式是一种强大的工具,我觉得任何一个程序员都应该熟练掌握它。

工欲善其事必先利其器(一)—–虚拟机

作为一名程序员,大多数时候都是在自己熟悉的环境里工作,永远是熟悉的操作系统,熟悉的那个IDE,熟悉的那个环境,仿佛一切都那么自然。但是如果永远是这样的话, 那么生活就显得太安逸了,实际生活中我们总会遇到各种各样复杂的情况。比如说,我们常常在windows或者是mac下工作,但是有些时候服务器的环境往往都是linux,为了熟悉服务器上的环境,我们必须要去熟悉并且灵活这种工具。但是在现实生活中,拥有多台物理机的成本还是相对于普通人来说,还是比较昂贵的,这个时候使用虚拟机把现有的硬件进行虚拟化来达到拥有多台计算机的效果就显得十分有必要了。

使用虚拟机的情景

  • 宿主机是windows或者mac,想要学习linux或者是unix
  • 沙箱环境,构建一个和本机相同环境的沙箱,当需要运行一些可能对计算机造成损害的软件的时候,先在沙箱中运行检查软件是否有危害,而后迁移到本机上,保证计算机的安全性
  • 工作环境迁移,一个用的十分熟练的系统必定是经过自己打磨许久之后逐渐磨合的一个超级工具,装了很多熟悉的软件,到一个新的环境下 之后,重新安装上这些东西会非常的麻烦,但是如果选择在虚拟机里进行工作的话,就可以在任何地方迅速的搭建起熟悉的环境

虚拟机软件常见的种类

  • Vmware ,横跨windows,linux,mac各种平台(注:在mac下叫FUSION,其他平台一般叫WORKSTATION),性能强大,功能齐全,唯一不足的地方就是价格了,每个月$249.99,多0.01美金就是250了
  • Hyper-V, 微软的产品,采用hypervisor的技术,据说可以和Vmware比肩,优点非常明显,windows自带,直接开箱即用,但这也是最大的缺点,只能在windows下用。
  • parallels,mac用户的福音,mac下的专属软件,可以非常方便快速的在mac下执行windows软件,价格每年$79.99,不算很贵,缺点就是只能在mac下运行。
  • VirtualBox,我最钟爱的虚拟机软件,强大的跨平台能力,支持windows,linux,mac,solaris等各种平台,体积轻巧,并且开源信仰。

不一样的VirtualBox

尽管virtualbox在功能上来说,它没有vmware那么强大,并且对于windows用户来说没有内置的Hyper-v来那么方便快捷,但是它拥有的特性:开源,跨平台,对我来说都有着深深的吸引力,我觉得对于大部分人来说都是一个非常好的选择,而且如果使用vagrant的话,就更能体会到它的优势所在了

  • 获取virtualbox

virtualbox的安装包可以在virtualbox的官方下载页获得

ubuntu用户可以通过apt工具来获得

sudo apt update

sudo apt install VirtualBox-5.2

centos用户可以直接通过yum工具来获得

yum install VirtualBox-5.2

使用virtualbox需要注意的地方

  • 虚拟硬盘,使用virtualbox创建虚拟硬盘的时候有三个选项,分别是VDI,VHD,VMDK,其中VHD是微软虚拟磁盘文件,一般应用于virtual PC,而VMDK则是由vmware创建的磁盘,如果创建这种磁盘可以共享给vmware使用,而VDI则是virtualbox自己创建的虚拟硬盘了,如果没有特殊需求的话,只要选择VDI类型的磁盘就可以了
  • 网卡,在virtualbox中的网卡有6种,分别是网络地址转换(NAT),NAT网络,桥接网卡,内部网络,仅主机(host-only)网络,通用驱动。

网络地址转换和NAT网络的区别并不是很大,都是把主机当成路由器来使用,同一网段下的多个虚拟机之间可以相互访问,并且虚拟机能访问到外部网络,包括互联网

桥接网卡则是把虚拟机当成局域网下一台真实的主机一样使用,使用桥接网卡的虚拟机可以使用宿主机相同网段的ip地址,并且可以让局域网下其他的计算机访问到

内部网络是虚拟机自成网络,虚拟机内部可以互相通信,但是不能对外,也不能访问互联网

仅主机网络,相当于用一根网线把虚拟机和主机连接起来,相互可以访问,但是如果需要访问其他地方的话,则需要其他配置

多种网卡有所区别,但是在virtualbox中是可以配置多块网卡的,所以使用还是非常方便的

使用virtualbox可能遇到的问题

  • 虚拟机不能全屏

virtualbox的安装目录下,有名为VBoxGuestAdditions.iso的镜像文件,这是virtualbox的增强工具,只有安装了增强工具的虚拟机才能使用文件夹共享,目录同步,虚拟机全屏等一些扩展功能

  • 不能选择64位操作系统的虚拟机

造成这个原因的极有可能是,在bios没有开启cpu的虚拟化功能,修复这个操作需要进入到bios开去cpu 虚拟化,不同的硬件厂商标准不一样,这里不多介绍

  • 虚拟机中复制的文件或者文字不能粘贴到宿主机

打开虚拟机设置,在常规选项》高级, 启用共享剪切板和拖放功能

  • 虚拟机卡顿不流畅

需要多分配一些内存给虚拟机,虚拟机和真实的电脑差不多,也是需要消耗计算机资源的

结语

如果用来学习多个操作系统的话,除了选择虚拟机之外,还可以使用双系统,双系统的优势是两个操作系统都可以享受完整的计算机cpu和内存等资源,而且互不干扰,缺点就是两个系统不能同时启动,而使用虚拟机的话,那就意味着你的电脑配置相对来说需要好一点。如果计算机的配置不是很高的话,还是推荐使用双系统。