1:查看Linux操作系统的IP地址:
ip addr
并没有获取到linux系统的IP地址。这是由于启动服务器时未加载网卡,导致IP地址初始化失败而造成的。
2:需要来修改网络初始化配置,设定网卡在系统启动时初始化。
1). 修改网卡的配置项
cd / 进入根目录
cd etc 进入etc目录
cd sysconfig 进入sysconfig目录
cd network-scripts 进入network-scripts
vi ifcfg-ens33 编辑ifcfg-ens33文件
进入文件后执行如下操作:
①. 按 i 键 进入编辑状态
②. 按↑↓键来移动光标, 删除no,输入yes
③. 按 ESC 键
④. 输入 :wq
⑤. 按 ENTER 保存退出
把这个文件的配置项ONBOOT的值有no改为yes即可
重启虚拟机即可
3:LInux的目录结构
Windows目录下是一个个盘符(C、D、E)目录是归属于某一个盘符的
Linux目录的特点:
1:/是所有目录的顶点
2:目录结构像一颗倒挂的树
4:Linux常用命令
ls:
ls+目录名:查看当前目录下的内容
ls+/:查看根目录下的所有文件和文件夹
ll :查看当前目录文件及目录的详细信息
pwd:
pwd:查看当前所在目录
cd:
cd+目录名:切换目录
特殊说明: ~ 表示用户的home目录 . 表示目前所在的目录 .. 表示目前目录位置的上级目录 举例: cd .. 切换到当前目录的上级目录 cd ~ 切换到用户的home目录 cd /usr/local 切换到/usr/local目录
cd .. 切换到当前目录位置的上级目录; 可以通过 cd ../.. 来切换到上级目录的上级目录。
cat:
作用: 用于显示文件内容 小文件
语法: cat [-n] fileName
说明:
-n: 由1开始对所有输出的行数编号
举例:
cat /etc/profile 查看/etc目录下的profile文件内容
cat 指令会一次性查看文件的所有内容,如果文件内容比较多,这个时候查看起来就不是很方便了,这个时候我们可以通过一个新的指令more。
more:
作用: 以分页的形式显示文件内容
语法: more fileName
操作说明:
回车键 向下滚动一行
空格键 向下滚动一屏
b 返回上一屏
q或者Ctrl+C 退出more
举例:
more /etc/profile 以分页方式显示/etc目录下的profile文件内容
当我们在查看一些比较大的文件时,我们可能需要经常查询文件尾部的数据信息,那这个时候如果文件很大,我们要一直向下翻页,直到最后一页,去看最新添加的数据,这种方式就比较繁琐了,此时,我们可以借助于tail指令。
tail
作用: 查看文件末尾的内容
语法: tail [-f] fileName
说明:
-f : 动态读取文件末尾内容并显示,通常用于日志文件的内容输出
举例:
tail /etc/profile 显示/etc目录下的profile文件末尾10行的内容
tail -20 /etc/profile 显示/etc目录下的profile文件末尾20行的内容
tail -f /itcast/my.log 动态读取/itcast目录下的my.log文件末尾内容并显示
操作示例:
A. 默认查询文件尾部10行记录
B. 可以通过指定参数设置查询尾部指定行数的数据
C. 动态读取文件尾部的数据
在窗口1中执行指令 tail -f 1.txt
动态查看文件尾部的数据。然后在顶部的标签中右键选择 "复制标签",打开新的窗口2 , 此时再新打开的窗口2中执行指令 echo 1 >> 1.txt
, 往1.txt文件尾部追加内容,然后我们就可以在窗口1中看到最新的文件尾部的数据。
如果我们不想查看文件尾部的数据了,可以直接使用快捷键 Ctrl+C , 结束当前进程。
touch:
touch+文件名:如果文件不存在,创建文件
mkdir:
mkdir+目录名:创建目录
作用: 创建目录
语法: mkdir [-p] dirName
说明:
-p: 确保目录名称存在,不存在的就创建一个。通过此选项,可以实现多层目录同时创建
举例:
mkdir itcast 在当前目录下,建立一个名为itcast的子目录
mkdir -p itcast/test 在工作目录下的itcast目录中建立一个名为test的子目录,若itcast目录不存在,则建立一个
rm:
rm+文件名:删除指定文件(删除文件时需要确定Y)
作用: 删除文件或者目录
语法: rm [-rf] name
说明:
-r: 将目录及目录中所有文件(目录)逐一删除,即递归删除
-f: 无需确认,直接删除
举例:
rm -r itcast/ 删除名为itcast的目录和目录中所有文件,删除前需确认
rm -rf itcast/ 无需确认,直接删除名为itcast的目录和目录中所有文件
rm -f hello.txt 无需确认,直接删除hello.txt文件
==注意: 对于 rm -rf xxx 这样的指令,在执行的时候,一定要慎重,确认无误后再进行删除,避免误删。==
拷贝移动命令 (重点)
cp (copy 复制文件或者目录)
作用: 用于复制文件或目录
语法: cp [-r] source dest
说明:
-r: 如果复制的是目录需要使用此选项,此时将复制该目录下所有的子目录和文件
举例:
cp hello.txt itcast/ 将hello.txt复制到itcast目录中
cp hello.txt ./hi.txt 将hello.txt复制到当前目录,并改名为hi.txt
cp -r itcast/ ./itheima/ 将itcast目录和目录下所有文件复制到itheima目录下
cp -r itcast/* ./itheima/ 将itcast目录下所有文件复制到itheima目录下
操作示例:
如果拷贝的内容是目录,需要加上参数 -r
mv
作用: 为文件或目录改名、或将文件或目录移动到其它位置
语法: mv source dest
举例:
mv hello.txt hi.txt 将hello.txt改名为hi.txt
mv hi.txt itheima/ 将文件hi.txt移动到itheima目录中
mv hi.txt itheima/hello.txt 将hi.txt移动到itheima目录中,并改名为hello.txt
mv itcast/ itheima/ 如果itheima目录不存在,将itcast目录改名为itheima
mv itcast/ itheima/ 如果itheima目录存在,将itcast目录移动到itheima目录中
操作示例:
mv 命令既能够改名,又可以移动,具体是改名还是移动,系统会根据我们输入的参数进行判定(如果第二个参数dest是一个已存在的目录,将执行移动操作,其他情况都是改名)
打包压缩命令
作用: 对文件进行打包、解包、压缩、解压
语法: tar [-zcxvf] fileName [files]
包文件后缀为.tar表示只是完成了打包,并没有压缩
包文件后缀为.tar.gz表示打包的同时还进行了压缩
说明:
-z: z代表的是gzip,通过gzip命令处理文件,gzip可以对文件压缩或者解压
-c: c代表的是create,即创建新的包文件
-x: x代表的是extract,实现从包文件中还原文件
-v: v代表的是verbose,显示命令的执行过程
-f: f代表的是file,用于指定包文件的名称
举例:
打包
tar -cvf hello.tar ./* 将当前目录下所有文件打包,打包后的文件名为hello.tar
常用 tar -zcvf hello.tar.gz ./* 将当前目录下所有文件打包并压缩,打包后的文件名为hello.tar.gz
解包
tar -xvf hello.tar 将hello.tar文件进行解包,并将解包后的文件放在当前目录
常用 tar -zxvf hello.tar.gz 将hello.tar.gz文件进行解压,并将解压后的文件放在当前目录
tar -zxvf hello.tar.gz -C /usr/local 将hello.tar.gz文件进行解压,并将解压后的文件放在/usr/local目录
操作示例:
A. 打包
B. 打包并压缩
C. 解包
D. 解压
解压到指定目录,需要加上参数 -C
文本编辑命令 (重点)
文本编辑的命令,主要包含两个: vi (linux 自带得)和 vim (安装插件),两个命令的用法类似,我们课程中主要讲解vim的使用。
vi&vim介绍
作用: vi命令是Linux系统提供的一个文本编辑工具,可以对文件内容进行编辑,类似于Windows中的记事本
语法: vi fileName
说明: 1). vim是从vi发展来的一个功能更加强大的文本编辑工具,编辑文件时可以对文本内容进行着色,方便我们对文件进行编辑处理,所以实际工作中vim更加常用。 2). 要使用vim命令,需要我们自己完成安装。可以使用下面的命令来完成安装:yum install vim
vim安装
命令: yum install vim
安装过程中,会有确认提示,此时输入 y,然后回车,继续安装:
vim使用
作用: 对文件内容进行编辑,vim其实就是一个文本编辑器 语法: vim fileName 说明: 1). 在使用vim命令编辑文件时,如果指定的文件存在则直接打开此文件。如果指定的文件不存在则新建文件。 2). vim在进行文本编辑时共分为三种模式,分别是 命令模式(Command mode),插入模式(Insert mode)和底行模式(Last line mode)。这三种模式之间可以相互切换。我们在使用vim时一定要注意我们当前所处的是哪种模式。
三种模式: - 命令模式 A. 命令模式下可以查看文件内容、移动光标(上下左右箭头、gg、G) B. 通过vim命令打开文件后,默认进入命令模式 C. 另外两种模式需要首先进入命令模式,才能进入彼此
| 命令模式指令 | 含义 |
| ------------ | --------------------------------- |
| gg | 定位到文本内容的第一行 |
| G | 定位到文本内容的最后一行 |
| dd | 删除光标所在行的数据 |
| ndd | 删除当前光标所在行及之后的n行数据 |
| u | 撤销操作 |
| shift+zz | 保存并退出 |
| i 或 a 或 o | 进入插入模式 |
插入模式 A. 插入模式下可以对文件内容进行编辑 B. 在命令模式下按下[i,a,o]任意一个,可以进入插入模式。进入插入模式后,下方会出现【insert】字样 C. 在插入模式下按下ESC键,回到命令模式
底行模式 A. 底行模式下可以通过命令对文件内容进行查找、显示行号、退出等操作 B. 在命令模式下按下[:,/]任意一个,可以进入底行模式 C. 通过/方式进入底行模式后,可以对文件内容进行查找 D. 通过:方式进入底行模式后,可以输入wq(保存并退出)、q!(不保存退出)、set nu(显示行号)
底行模式命令 含义 :wq 保存并退出 :q! 不保存退出 :set nu 显示行号 :set nonu 取消行号显示 :n 定位到第n行, 如 :10 就是定位到第10行
操作示例:
查找命令
find
作用: 在指定目录下查找文件
语法: find dirName -option fileName
举例:
find . –name "*.java" 在当前目录及其子目录下查找.java结尾文件
find /itcast -name "*.java" 在/itcast目录及其子目录下查找.java结尾的文件
操作示例:
grep
作用: 从指定文件中查找指定的文本内容
语法: grep word fileName
举例:
grep Hello HelloWorld.java 查找HelloWorld.java文件中出现的Hello字符串的位置
grep hello *.java 查找当前目录中所有.java结尾的文件中包含hello字符串的位置
grep -n '王者' 大说.txt 查找文件中存在的数据,并且显示行号。
操作示例:
常用命令: (重点)
1.top 任务管理器 查看进程的cpu ,内存占用情况。
2.kill -9 进程名字或者进程的PID 杀死某个进程
3.ps -ef | grep 进程名字 查询此进程的信息
4.定时关机 shutdown
shutdown -c 取消定时关机
shutdown 1分钟后关机
shutdown +60 '描述信息' 指定多少时间后关机
windwos 是通用。。
shutdown -s -t 3600 多少秒后自动关机 (只能通过命令取消)
shutdown -a 取消关机
5.reboot 立马重启
==注意:==
==在执行Linux命令时,提示信息如果显示为乱码,如上图所示。这是由于编码问题导致,只需要修改Linux的编码即可,命令如下:==
echo 'LANG="en_US.UTF-8"' >> /etc/profile
source /etc/profile
5: Linux命令使用技巧
1). Tab键自动补全
执行指令的时候,对于操作的文件/目录,按一下Tab会自动补全:
2). 连续两次Tab键,给出操作提示
如果上述以 "1." 开头的文件有多个,可以按两下Tab键,给出操作提示:
3). 使用上下箭头快速调出曾经使用过的命令
4). 使用clear命令或者Ctrl+l快捷键实现清屏
rm -rf /* 删库跑路
1:不小心删库了,跑路?
误执行了rm -rf /* 之后,除了跑路还能怎么办?其实像rm这样的敏感指定在生产环境中都是禁用的,如果某天,不小心执行了有什么方法可以挽救吗?答案是有的
1:案发现场还原:
c来的代码是这样的,然后放到了生产环境中去执行了。。。。。。。。
执行后发现了 rm -rf/ 的现象,就说明 new_lic_dir 变量是空的,导致执行 rm -fr $new_lic_dir/ 这条语句的时候,变成了 rm -fr /* 删库语句
原因:给 new_lic_dir 变量赋值的时候使用了反引号
反引号在Linux Shell命令中有特殊的含义:反引号间的内容,会被 Shell 先执行。其输出被放入主命令后,主命令再被执行。
也就是说, new_lic_dir 的值是 ${lic_path}/new_license 这条命令执行的结果,问题这哪是命令啊,所以肯定返回空值给 new_lic_dir 变量。
反引号应该改成双引号才对
2:如何应对:
既然发生了删库的事情,千万不要重启服务器,也不要关闭ssh连接的会话
查查还剩些什么
ls查看,可是发现ls已经没了QAQ
只能cd+Tab会自动出现指定目录下的所有文件,于是就可以一步一步来确认哪些系统文件被删了
通过一番的确认和对比后,发现主要被删除的有四个目录分别是:
/bin 、/boot 、/dev 这三个目录整个都被删除了;
/lib 目录里的动态库部分被删除。
/bin 存放常用系统命令,ls、cp、rm、chmod 等常用命令都在此目录;
/boot 系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序;
/dev 设备文件保存位置;
/lib 存放程序所需的动态库和静态库文件。
/boot 被删除了,要是重启了服务器,系统就肯定起不来了。
cd 命令是在 /sin 目录下,/sin 还在,所以 cd 是可以正常使用。
所幸重要的数据库信息和文件都还没删除,所以首要的目标是要恢复 /bin、/boot、/dev、/lib 这四个目录。
3:还原文件:
1:由于 /bin 目录 和 /lib 部分动态文件被删除,常用的传递文件的方式是无法使用的,如 ftp、scp、mount 等
摸索了很久,竟然发现 wget 可以使用,wget 命令是在 /usr/bin 目录,所幸 /usr/bin 还健全。
于是,用了取巧的方法,先另一台正常的服务器,把 /bin 目录放到了 Web 服务器的 Web 目录,接着通过 wget 进行下载。
有戏,看到了成功的曙光。
2:但是新的问题就来了,我下载过来的命令文件,是没有执行权限的。
而 chmod 命令是在 /bin 目录的,它同样也被删除了,无法使用它来给予文件权限。
3:还在,在网上搜到了一个伟大命令 perl,可以通过它来给予文件权限:
perl -e "chmod 777, 'ls'" 真是个神奇的命令。
好了,这下赋值权限问题也解决了,成功在望了。
4:wget 是无法直接把 /bin 目录下载下来的,只能下载一个文件。
但是不可能一个一个去下载来进行恢复,这得要何年何月才能完成。。。
就想到了一个方法:
先通过 wget 的方式下载 tar 命令,并通过 perl 给予 tar 命令权限;
接着把另一台服务器把 /bin 目录打包成压缩文件,然后通过 wget 下载 bin 目录的压缩包文件;
最后通过 tar 命令把 bin 压缩包解压出来。
/bin 就这样恢复回来啦,剩余的其他目录 也是通过同样的操作恢复了回来。
此时笑容渐渐将逐渐恢复
总结:遇到 rm -fr /* 删库事件发生,一定要沉住气,稳住心态!
1、如果发现脚本执行不正常,果断立马的掐断它,没有造成重要的数据库信息被删除,如果掐断的时候再晚一点,可能就真没了;
2、当发现常用命令无法使用的时候,没有重启服务器,不然服务器就起不来了,也没有关闭 ssh 会话,不然无法在重新连接 ssh 会话了,也就无法进行操作了。
2:预防rm -rf /*
1、rm -rf 删除删除目录时要判断目录
#!/bin/bash
work_path=`pwd`
#如果目录不为空,才执行删除操作
if [ ${work_path} != "" ];then
rm -fr ${work_path}/*
fi
2、shell脚本指定 set -u
执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它。
#!/bin/bash
echo $a
echo hello
上面代码中,$a 是一个不存在的变量,执行结果如下。
$ bash test.sh
hello
可以发现,echo $a 输出了一个空行,Bash 忽略了不存在的 $a,然后继续执行 echo hello。
最好是遇到变量不存在,脚本应该报错,而不是一声不响地往下执行。
set -u 就用来改变这种行为,在脚本加上它,遇到不存在的变量就会报错,并停止执行。
#!/bin/bash
set -u
rm -fr $a/*
echo hello
运行结果如下:
$ bash test.sh
test.sh: line 4: a: unbound variable
可以看到,因为 a 是未定义变量,脚本报错了,并且不再执行后面的语句。
3、safe -rm 替换 rm
safe-rm 是一个开源软件工具,这名字听起来就很安全嘛,所以它是用来替代不太安全的 rm。
它可以在 /etc/safe-rm.conf 中配置路径黑名单,定义哪些不能被 safe-rm 删除。
我们可以将 safe-rm 更名为 rm,假设定义了 /etc/ 无能被删除,那么删除 /etc 时就会报错:
$ rm -rf /etc/
safe-rm: skipping /etc/
4、建立回收站机制
Windows 是有回收站的,即使误删了,也可以在回收站恢复。
所以,我们也可以在 Linux 实现回收站的机制。
实现思路:
删除文件时,它并不真正执行删除操作,而是将文件移动到一个特定目录,可以设置定时清除回收站,或者在回收站里面的文件大小达到一定容量时(或者用时间做判断)执行删除操作以腾出空间。
可以写个 Shell 脚本替换 rm 命令,或者在需要删除文件的时候使用 mv 命令将文件移动到回收站。
1:创建回收站目录
mkdir /home/.trash
2:编写 remove.sh 脚本,内容如下
TRASH_DIR="/home/.trash"
for i in $*;do
STAMP=`date +%s`
fileName=`basename $i`
#将对应文件mv 至 /trash 目录
mv $i ${TRASH_DIR}/${fileName}.${STAMP}
done
3:修改 ~/.bashrc, 用我们自建的 remove.sh 替代 rm 命令
alias rm="sh /home/remove.sh"
4:设置 crontab,定期清空垃圾箱,如每天 0 点清空垃圾箱:
0 0 * * * rm -rf /home/.trash/*
5:最后,执行以下命令,使之生效
source ~/.bashrc
5、根文件挂载成只读
在 /etc/fstab 文件,把 / 文件系统挂载成只读的方式。
其中 remount,ro,就表示只读的方式挂载。
只读的方式挂载后,进行删除操作是无法成功的:
3:总结
涉及到 rm -fr 命令的代码,要留个心眼,要反复检查,要做好预防误执行 rm -fr /*,并在测试机验证完后,再拖到实体机上跑,千万不可大意。
就算的发生了 rm -fr /*,要第一时间停掉它,并且要做到三不要:
不要慌,不要心跳爆炸(稳住稳住);
不要隐瞒删库事件(不丢人);
不要重启服务器或断开 ssh 会话(保留现场)。
只要立马掐断 rm -fr /* ,它是干不死我们的。
利用当下环境剩有的命令,冷静分析,是有机会恢复的。