Linux--vim编辑器和文件恢复

时间:2024-08-04 13:37:08

第五章  Vim编辑器和恢复ext4下误删除的文件-Xmanager工具

本节所讲内容:

5.1  vim的使用

5.2  实战:恢复ext4文件系统下误删除的文件

5.3  实战:使用xmanager等远程连接工具管理Linux

5.1  vim主要模式介绍,vim命令模式。

确保系统已经安装了VIM工具

[root@panda ~]# rpm -qf `which vim`

[root@panda ~]# rpm -qf `which vi`

扩展:

问:vi和vim是同一个软件包安装的吗?

答:NO,vim是vi的增加版,最明显的区别就是vim可以语法加亮,它完全兼容vi

5.1.1  vim编辑器模式

首次进入文件    ---- 命令模式

出现 “Insert” ---- 编辑模式

输入:          ---- 命令行模式

A:从编辑模式到命令行模式怎样切换?

编辑模式->esc->命令模式->: ->命令行模式

B:字符操作(怎样进入编辑模式?)

进入编辑模式 a i o  A I O

说明:

i 当前字符之前插入 (光标前)

I 行首插入  (行首)

a 当前字符之后插入 (光标后)

A 行尾插入(行尾)

o下一行插入 (另起一行)

O上一行插入(上一行插入)

x 向后删除一个字符         等同于delete

X 向前删除一个字符

u 撤销一步   每按一次就撤销一次

r 替换

5.1.2 在命令模式下做的操作:

光标定位

hjkl  左下上右

0 和 home键表示切换到行首, $和end键表示切换到行尾

gg 快速定位到文档的首行 ,  G定位到未行

3gg 或者 3G  快速定位到第3行

/string(字符串)   -----找到或定位你要找的单词或内容,如果相符内容比较多,我们可以通过N、n来进行向上向下查找,并且vi会对查找到的内容进行高亮显示,取消用 :noh

/^d  ----^意思表示以什么开头 ,,查找以字母d开头的内容

/t$   -----$意思表示以什么结尾,,查找以字母t结尾的内容

vim + a.txt  打开文件后,光标会自动位于文件的最后一行

如何对文本进行编辑

删除、复制、粘贴、撤销

y 复制(以字符为单位) :表示对单个字符进行复制,如果要复制整行,用yy(以行为单位)

复制N行: Nyy  ,比如: 2yy ,表示复制2行

dd(删除,以行为单位,删除当前光标所在行)

删除N行: Ndd  ,比如: 2dd ,表示删除2行

p : P粘贴

剪切: dd

x 删除光标所在位置的字符

D 从光标处删除到行尾

u  撤销操作

ctrl+r  还原撤销过的操作,将做过的撤销操作再还原回去,也就是说撤销前是什么样,再还原成什么样

r 替换,或者说用来修改一个字符

总结:vim如何进入其它模式

a A  o O  i I 都是可以进行插入,编辑模式

: 进入命令行模式

v 进入可视模式

ctrl+v 进入可视块模式

V 进入可视行模式

R 擦除、改写,进入替换模式

你进入以上模式后,想要退出 ,按esc

扩展:插入模式中的操作

ctrl+p可以进行补全操作,所需要的内容必须是在当前打开的文件内存在的,它只针对当前文件

5.1..3 V模式(列)

进入v模式 移动光标选择区域、

编程的时候需要进行多行注释:
        1)、ctrl+v 进入列编辑模式

2)、向下或向上移动光标,把需要注释、编辑的行的开头选中起来

4)、然后按大写的I

5)、再插入注释符或者你需要插入的符号,比如"#"

6)、再按Esc,就会全部注释或添加了

删除:再按ctrl+v
进入列编辑模式;向下或向上移动光标 ;选中注释部分,然后按d,
就会删除注释符号。

5.1.4 命令行模式操作

:w 保存 save

:w! 强制保存

:q 没有进行任何修改,退出 quit

:q! 修改了,不保存,强制退出

:wq 保存并退出

:wq! 强制保存并退出

:x 保存退出

例: wq!
强制保存并退出

[root@xuegod63
~]# ll /etc/shadow

----------.
1 root root 1179 9月  19 12:57 /etc/shadow

[root@xuegod63
~]# vim /etc/shadow

调用外部文件或命令

假设:我想要写入我的网卡MAC地址,,我要查看一下,当前在vim编辑文档,照着写。这样好麻烦。

在命令行模式下操作:

:!ifconfig 调用系统命令

!+命令

读取其他文件。(把其他文件中的内容追加到当前文档中)

:r
/etc/hosts

文本替换

格式 : 范围(其中%所有内容)  
s分隔符 旧的内容 分隔符 新的内容  (分隔符可以自定义)

默认是每一行的第一个符合要求的词   (/g全部)

:1,3 s/bin/xuegod    替换第1到3行中出现的第一个bin进行替换为xuegod

:1,3 s/bin/xuegod/g  替换第1到3行中查找到所有的bin进行替换为xuegod

:3
s/xue/aaaaa     #只把第3行中内容替换了

:% s/do/xuegod/g       将文本中所有的do替换成xuegod

:% s/do/xuegod/gi       将文本中所有的do替换成xuegod, 并且忽略do的大小写

:% s@a@b@g          
将文本中所有的a替换成b

5.1.5 自定义vim使用环境

临时设置

:set nu  设置行号

:set nonu 取消设置行号

:noh   取消高亮显示

永久设置环境

vim /etc/vimrc  设置后会影响到系统所有的用户

~/.vimrc   #在用户的家目录下,创建一个.vimrc。这样只影响到某一个用户,没有自己建一个

例:

[root@xuegod63
~]# cat  /root/.vimrc

set nu

[root@xuegod63
~]# vim  /root/.vimrc

vim打开多个文件

方法1:以上下形势,打开两个文档

[root@xuegod63
~]# vim -o /etc/passwd /etc/hosts

方法2:以左右方式打开两个文档

[root@xuegod63
~]# vim -O /etc/passwd /etc/hosts

注:ctrl+ww  在两文档之间进行切换编辑。大写O左右分屏,小写的o上下分屏

比较两个文件内容

[root@xuegod63
~]# cp /etc/passwd mima.txt

[root@xuegod63
~]# echo aaa >> mima.txt

[root@xuegod63
~]# diff /etc/passwd mima.txt

40a41

> aaa

[root@xuegod63
~]# vimdiff /etc/passwd mima.txt

5.1.6  其它编辑器

nano编辑器

emacs编辑器

GHOME编辑器gedit

例:

[root@xuegod63
~]# gedit /etc/passwd

5.1.7  实战1:在windows中编辑好的汉字文本文档,上传到Linux下打开乱码。

实验环境:centos7.4 现在系统默认使用的语言是汉语。(系统中必须安装好中文包)。

将同目录下“a此文件在windows下打开正常-到linux下vim打开是乱码.txt”上传到Linux服务器上。使用ssh远程连接到Linux上,使用vim打开显示乱码。

原因:编码的问题

通过iconv命令转码  
没有使用过:1

参数:

-f,
--from-code=名称 原始文本编码
-t, --to-code=输出编码
-o, --output=FILE 输出文件名
[root@xuegod63 ~]# mkdir test  #创建一个测试目录

[root@xuegod63 ~]# cd
test/

将测试的文件上传到Linux服务器上:

[root@xuegod63
~]# iconv -f gb2312  -t utf8 a此文件在windows下打开正常-到linux下vim打开是乱码.txt  -o aa.txt

[root@xuegod63 ~]# cat aa.txt

#!/bin/bash

echo "学神IT"

信息:
-l, --list 列举所有已知的字符集

5.1.8  实战2:解决将公司Linux服务器上脚本导到windows上打开串行的问题

原因:因为windows和linux处理回车方法不同。

上传” b在Linux编辑的文档到windows下没有换行.sh” 到Linux上,打开后正常显示

[root@localhost test]# sz b在Linux编辑的文档到windows下没有换行.sh   #发送到本地

在window 上打开显示:

解决方法:

[root@xuegod63 ~]#
rpm -ivh /mnt/Packages/dos2unix-6.0.3-7.el7.x86_64.rpm

注: 在centos7上,unix2dos这个命令已经被集成到dos2unix-6.0.3-7.el7.x86_64.rpm包中。在centos6下需要安装unix2dos.xxx.rpm。

[root@localhost test]# unix2dos b在Linux编辑的文档到windows下没有换行.sh

[root@localhost test]# sz b在Linux编辑的文档到windows下没有换行.sh   #发送到windows本地 
显示正常。

注:dos2unix 这个命令是把windows下的回车转成linux类型。

5.2  实战:在Centos6/RHEL6上恢复ext4文件系统下误删除的文件

[root@xuegod63
~]# rm -Rf /    #执行不成功的,

rm: 在"/" 进行递归操作十分危险

rm: 使用 --no-preserve-root 选项跳过安全模式

[root@xuegod63
~]# rm -rf /*    #这个可以执行成功。 呵呵。。。

ext4文件系统上删除文件,可以恢复: extundelete ,ext3恢复使用:ext3grep

windows恢复误删除的文件: 
final data v2.0 汉化版  和  easyrecovery

扩展:

Linux文件系统由三部分组成:文件名,inode,block

windows也由这三部分组成。

a.txt          -->inode              --> block

文件名       存放文件元数据信息       真正存放数据

查看文件文件名:

[root@xuegod63
~]# cp /etc/passwd a.txt

[root@xuegod63
~]# ls a.txt

a.txt

查看inode号:

常识: 每个文件,有一个inode号。

[root@xuegod63
~]# ls -i a.txt

440266
a.txt

查看inode中的文件属性; 
通过stat命令查看inode中包含的内容

[root@xuegod63
~]# stat a.txt   #查看inode信息:

[root@xuegod63
~]# ls -l a.txt

-rw-r--r--
1 root root 1720 Oct 25 10:21 a.txt

block块:真正存储数据的地方

逻辑删除:

为什么删除比复制快?

误删除文件后,第一件事要做什么???  你不心删除把存了几十年的大片删除了。

避免误删除的文件内容被覆盖。
如何避免?

卸载需要恢复文件的分区或以只读的方式挂载

5.2.2   实战:在ext4文件系统上恢复被误删除的文件

下载extundelete

http://sourceforge.net/    开源软件发布中心

准备测试分区:

[root@xuegod63
/]# fdisk /dev/sda  #创建一个sda4分区

WARNING:
DOS-compatible mode is deprecated. It's strongly recommended to

switch off the mode (command 'c') and
change display units to

sectors (command 'u').

Command
(m for help): p  
#查看现有分区表

Disk
/dev/sda: 21.5 GB, 21474836480 bytes

255
heads, 63 sectors/track, 2610 cylinders

Units
= cylinders of 16065 * 512 = 8225280 bytes

Sector
size (logical/physical): 512 bytes / 512 bytes

I/O
size (minimum/optimal): 512 bytes / 512 bytes

Disk
identifier: 0x000b8b35

Device Boot      Start         End      Blocks  
Id  System

/dev/sda1   *          
1          26      204800  
83  Linux

Partition
1 does not end on cylinder boundary.

/dev/sda2              26        1301   
10240000   83  Linux

/dev/sda3            1301        1428    
1024000   82  Linux swap / Solaris

Command
(m for help): n  
#创建一个新分区

Command
action

e  
extended

p  
primary partition (1-4)

p  #创建一个主分区

Selected
partition 4

First
cylinder (1428-2610, default 1428):

Using
default value 1428

Last
cylinder, +cylinders or +size{K,M,G} (1428-2610, default 2610): +1G  #指定分区大小

Command
(m for help): w 
#保存

The
partition table has been altered!

Calling
ioctl() to re-read partition table.

WARNING:
Re-reading the partition table failed with error 16: Device or resource busy.

The
kernel still uses the old table. The new table will be used at

the
next reboot or after you run partprobe(8) or kpartx(8)

Syncing
disks.

[root@xuegod63
~]#reboot

[root@xuegod63
~]# partx -a /dev/sda  #获得新分区表

扩展:

如果在根下删除文件了,想恢复,怎么办?

方法1: 立即断电,然后把磁盘以只读方式,挂载到另一个电脑中进行恢复

方法2:把extundelete在虚拟机上(虚拟机系统要和服务器版本一样),提前安装好后再复制到U盘中,把U盘插入服务器,恢复时,恢复的文件要保存到U盘中,(不要让恢复的数据写到/下,那样会覆盖之前删除的文件)

使用新的分区表:

[root@xuegod63
/]# mkdir /tmp/sda4     #创建挂载点

[root@xuegod63
~]# mkfs.ext4 /dev/sda4    #格式化

[root@xuegod63
~]# mount /dev/sda4 /tmp/sda4/   #挂载

5.2.3   复制一些测试文件,然后把这些文件再删除,然后演示恢复:

[root@xuegod63
~]# cp /etc/passwd /tmp/sda4/

[root@xuegod63
~]# cp /etc/hosts /tmp/sda4/

[root@xuegod63
~]# echo aaa > a.txt

[root@xuegod63
~]# mkdir -p /tmp/sda4/a/b/c

[root@xuegod63
~]# cp a.txt /tmp/sda4/a/

[root@xuegod63
~]# cp a.txt /tmp/sda4/a/b/

[root@xuegod63
~]# touch /tmp/sda4/a/b/kong.txt

安装tree命令:

[root@xuegod63
~]# rpm -ivh /mnt/Packages/tree-1.5.3-2.el6.x86_64.rpm

[root@xuegod63
~]# tree /tmp/sda4/

/tmp/sda4/

├── a

│  
├── a.txt

│  
└── b

│       ├── a.txt

│       ├── c  #空目录

│       └── kong.txt  #空文件

├──
hosts

├──
lost+found

└──
passwd

删除文件:

[root@xuegod63
~]# cd /tmp/sda4/

[root@xuegod63
sda4]# ls

a  hosts 
lost+found  passwd

[root@xuegod63
sda4]# rm -rf a hosts passwd

误删除文件后,第一件事要做什么???

如何避免误删除的文件内容被覆盖???

卸载需要恢复文件的分区:或以只读的方式挂载

[root@localhost
~]#cd /root

[root@localhost
~]# umount /tmp/sda4

5.2.4  安装extundelet

上传extundelete到linux中:

从windows上传extundelete文件到linux,安装xmanager  v5   或者CRT

[root@xuegod63
~]# rpm -ivh /mnt/Packages/lrzsz-0.12.20-27.1.el6.x86_64.rpm

安装后,就有了rz命令和sz命令

rz : 上传windows中的文件到linux

sz
:下载,将linux中的文件传到windows

解压并安装extundelet

[root@xuegod63
extundelete-0.2.4]# tar jxvf extundelete-0.2.4.tar.bz2

[root@xuegod63
~]# cd extundelete-0.2.4

[root@xuegod63]#
yum install e2fsprogs-devel

[root@xuegod63
extundelete-0.2.4]# ./configure   #检查系统安装环境

[root@xuegod63
extundelete-0.2.4]# make  -j 4  #编译,把源代码编译成可执行的二进制文件。

-j
4   使用4进程同时编译,提升编译速度 或 使用4核CPU同时编译。

[root@xuegod63
extundelete-0.2.4]# make install  #安装

install
和cp 有什么区别?

install
复制时可以指定权限  cp不可以

例:

[root@xuegod63
~]# install -m 777 /bin/find /opt/a.sh

[root@xuegod63
~]# ll /opt/

5.2.5  开始恢复:

方法1:通过inode结点恢复

方法二:通过文件名恢复

方法三:恢复某个目录,如目录a下的所有文件:

方法四:恢复所有的文件

[root@xuegod63
~]# umount /tmp/sda4/

[root@xuegod63
~]# mkdir test  #创建一个目录使用于存放恢复的数据

[root@xuegod63
~]# cd test/

方法1:

通过inode结点查看被删除的文件名字:

[root@xuegod63
test]# extundelete /dev/sda4 --inode 2

.                                               
2

lost+found                                        11

passwd                                           
12             Deleted

hosts                                            
13             Deleted

a                                                
7313           Deleted

扩展:ext4文件系统的分区根目录的inode值为2,xfs分区根目录的inode值为64

[root@xuegod63
test]# ls -id /boot/   #xfs文件系统

64 /boot/

[root@xuegod63
test]# mount /dev/sda4 /tmp/sda4/

[root@xuegod63
test]# ls -id /tmp/sda4/

2 /tmp/sda4/

[root@xuegod63
test]# umount /tmp/sda4/

方法1:通过inode结点恢复

[root@xuegod63 test]# extundelete /dev/sda4 --restore-inode 12

NOTICE: Extended attributes are not restored.

Loading filesystem metadata ... 9 groups loaded.

Loading journal descriptors ... 63 descriptors loaded.

[root@xuegod63 test]# ls

RECOVERED_FILES

[root@xuegod63 test]# diff /etc/passwd
RECOVERED_FILES/file.12  # 没有任何输出,说明一样

方法二,通过文件名恢复

[root@xuegod63 test]#
extundelete /dev/sda4 --restore-file passwd

[root@xuegod63 test]# diff /etc/passwd
RECOVERED_FILES/passwd  # 没有任何输出,说明一样

方法三:恢复某个目录,如目录a下的所有文件:

[root@xuegod63 test]# extundelete /dev/sda4 --restore-directory a

[root@xuegod63 test]#
tree RECOVERED_FILES/a/

RECOVERED_FILES/a/

├──
a.txt

└──
b

└──
a.txt

下面是原来的目录结构:

[root@xuegod63 ~]#
tree /root/sda4-back/a/

/root/sda4-back/a/

├──
a.txt

└──
b

├──
a.txt

├── c

└── kong.txt

方法四:恢复所有的文件

[root@xuegod63 test]# extundelete /dev/sda4 --restore-all

删除前后的数据:

extundelete在恢复文件的时候能不能自动创建空文件和目录?

答:不能。