Linux学习笔记[2-9]

Linux学习笔记[2-9]

三月 11, 2020

《Linux就该这么学》学习笔记

HERE

笔记: Wiseer

资料来源老刘 Linux 泡泡

欢迎交流:514165492@qq.com

转载须知: :warning: 转载请附上出处、原作者等重要信息,并告知本人获取授权

:laughing: 帅的人都会看这里:

  • 本资料是关于Linux技术的学习笔记,这一版只包含前九章节的内容,其中第一章节不作整理,请看书自行补充

  • 笔记中有较为详细的实验操作步骤,具体参数有做修改,参考时请小可爱们根据实际情况来实操

  • 我是老刘的第25期学生(同门的兄弟挥挥手吖),个人听课并结合老刘书籍资料整理的,文中部分图片来源于老刘的泡泡网站

  • 老刘讲课耐心风趣,谁听谁知道,但是确实没我帅 :cowboy_hat_face: ,没给我广告费,所以不能说他帅

  • 笔记中只记录了本人觉得重要的内容,难免有些地方有疏露错误,欢迎指点江山,本白愿意改正

  • 老刘教书不易,写书也辛苦,望各位支持正版,我确实比他帅就不说了,还得交学费

话不多说,直接上目录,点击下方 :arrow_down_small: 即可跳转哟!

[TOC]

:heart: :heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart::heart:

第二章 必须掌握的Linux命令

命令名称 [命令参数] [命令对象]

长格式 : man –help

段格式: man -h

1.常用 系统工作 命令

  • echo – 输出字符串 或 提取Shell变量的值 # echo linuxprobe.com

  • date – 显示日期与时间 # date "+%Y-%m-%d %H:%M:%S" # date -s 更新时间

  • reboot – 重启计算机 # reboot

  • poweroff – 关闭操作系统并切断电源 # poweroff

  • wget – 文件下载 # wget -r -q -P/home http://··· 下载到指定目录

  • ps – 显示进程状态 # ps aux 显示用户、没有控制终端及其他信息进程

  • top – 实时显示进程动态(任务管理器) # top

  • pidof – 返回运行程序的进程ID # pidof sshd

  • kill – 杀死进程 # kill 2156

  • killall – 使用进程名称来杀死一组进程 # killall httpd

    Ctrl + C :停止命令

    命令末尾上添加&:命令将进入系统后台来执行

2.系统状态检测命令

  • ifconfig – 获取网卡配置与网络状态等信息 # ifconfig

  • uname – 用于查看系统内核与版本等信息 # unname -a

  • uptime – 获取主机运行时间及查看系统负载 # uptime

  • free – 显示系统内存情况 # free -h

  • who – 打印当前登录用户 # who

  • last – 查看用户或终端的登录情况 # last

  • history – 显示历史操纵命令 # history

    # history -c : 清空历史命令

    # !15:重复执行第15行的命名

  • sosreport –收集系统配置及架构信息并输出诊断文档 # sosreport

3. 工作目录切换命令

  • pwd – 显示当前目录 # pwd

  • cd – 切换目录 (#cd ~返回用户主目录、# cd ..返回上级目录、# cd -返回上一次目录)

  • ls – 目录中文件信息

    # ls -a 全部文件 、# ls -l 文件属性 大小等、# ls -d 目录权限与属性

4.文本文件编辑命令

  • cat – 查看纯文本文件内容(少) Ctrl+C(中断)Ctrl+S(t停止)Ctrl+Q`(恢复)

  • more – 查看文本文件内容(多)# more file.cfg

  • head – 显示文件开头内容(- n 显示头几行) # head -n 15 file.cfg

  • tail – 查看文件尾部内容或持续刷新内容 (默认显示的末尾10行) # tail -f 文件名

  • tr – 字符转换 # cat anaconda-ks.cfg | tr [a-z] [A-Z] 先读取在转换大写

  • wc – 统计文件的字节数、字数、行数

    # wc -l 显示行数、 # wc -w 显示单词数、# wc -c 显示字节数

  • stat –显示文件存储及时间详细信息 # stat file.cfg

  • cut – 按“列”提取文本字符 # cut -d: -f1 /etc/passwd -d设置间隔符、-f设置列数

  • diff – 比较文件的差异 # diff -c fileA.txt fileB.txt

5 .文件目录管理命令

  • touch – 创建空白文件或设置文件时间 # touch file.txt

    # touch -a 修改读取时间 # touch -m 修改修改时间 # touch -d 同时修改两者时间

  • mkdir – 创建目录 # mkdir -p 目录名 创建具有嵌套叠层的文件目录

  • cp – 复制文件或目录 # cp [ ] 源文件 目标文件 # cp -r 原文件 目标目录

  • mv – 移动或重命名文件 # mv x.log linux.log

  • rm – 删除文件或目录 # rm -f x.log -f 强制删除

  • dd – 拷贝文件及转换 # dd if=/dev/zero of=560_file count=1 bs=560M

  • file – 识别文件类型 # file a.cfg

6.打包压缩搜索命令

  • tar –对文件进行打包和压缩 # tar -czvf 压缩包.tar.gz # tar -xzvf 压缩包.tar.gz

  • grep – 强大的文本搜索关键词工具 # grep -n 文件

  • find – 查找和搜索文件

    # find / user linuxprobe -exec cp -a {} /root/findresults/ \

    目的:在整个文件系统中找出所有归属于linuxprobe用户的文件并复制到/root/findresults目录。

    -exec {} ··· \;” :其中{}表示find命令搜索出每一个文件,并且命令的结尾必须是“\;

第三章 管道符、重定向与环境变量

1.输入输出重定向

输入重定向中用到的符号及其作用

符号 作用
命令 < 文件 将文件作为命令的标准输入
命令 << 分界符 从标准输入中读入,直到遇见分界符才停止
命令 < 文件1 > 文件2 将文件1作为命令的标准输入并将标准输出到文件2
  • # wc -l < readme.txt 把readme.txt导入给wc -l命令 等价 # cat readme.txt | wc -l

输出重定向中用到的符号及其作用

符号 作用
命令 > 文件 标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1 或 命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

对于重定向中的标准输出模式,可以省略文件描述符1 不写, 但错误输出模式的文件描述符2必须要写!

2.管道命令符

命令A | 命令B

把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入

  • 通过匹配关键词/sbin/nologin找出了所有被限制登录系统的用户
    • # grep "/sbin/nologin" /etc/passwd | wc -l
  • 用翻页的形式查看/etc目录中的文件列表及属性信息
    • # ls -l /etc/ | more
  • 密码重置
    • # echo "mima" | passwd --stdin root
  • 邮件内容与标题打包
    • # echo "Content" | mail -s "Subject" linuxprobe

3.命令符的通配符

* 匹配零个或多个字符 # ls -l /dev/sda* 会匹配sda sda1 sda2 sda3
? : 匹配单个字符 # ls -l /dev/sda? 会匹配 sda1 sad2 几个字符就输入几个?
[0-9] : 匹配0~9的数字 # ls -l /dev/sda[0-9]
[1,3,5] : 精确匹配 # ls -l /dev/sda[1,3,5] 逗号最好不省略
[a-z] : 匹配单个小写字母
[A-Z] : 匹配单个大写字母

4.常用的转义字符

反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串 转义符"\$$5" = $5

单引号(’’):转义其中所有的变量为单纯的字符串。单纯字符串

双引号(””):保留其中的变量属性,不进行转义处理。

反引号):把其中的命令执行后返回结果。:zap:注意是反引号不是单引号

如果输入的对象或参数有空格的话,用” “(双引号)括起来

# echo " Price is $PRICE"

1
2
3
4
5
6
7
8
# 定义一个名为PRICE的变量并赋值为5,然后输出以双引号括起来的字符串与变量信息
[root@linuxprobe ~]# PRICE=5
[root@linuxprobe ~]# echo "Price is $PRICE"
Price is 5

# 输出“Price is $5
[root@linuxprobe ~]# echo "Price is \$$PRICE"
Price is $5
  • 把命令执行后返回结果

    1
    2
    # 查看本机的linux版本和内核信息
    # echo `uname -a`

5.重要环境变量

- 命令路径 :/bin /ls

- 别名命令:alias 别名 = 命令

- 内部命令

- 外部命令:常用的命令 用 whereis 命令名 来判断是否为外部命令

Linux系统中最重要的10个环境变量

变量名称 作用
HOME 用户的主目录(即家目录)
SHELL 用户在使用的Shell解释器名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
MAIL 邮件保存路径
LANG 系统语言、语系名称
RANDOM 生成一个随机数字
PS1 Bash解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器

小写是命令,大写是变量PATH

第四章 vim编辑器与shell 命令脚本

1 Vim文本编辑器

a:光标后面一位 i:光标当前位置 o:换行 :wq! 强制保存退出

Vim中常用的命令

命令 作用
dd 删除(剪切)光标所在整行
5dd 删除(剪切)从光标处开始的5行
yy 复制光标所在整行
5yy 复制从光标处开始的5行
n 显示搜索命令定位到的下一个字符串
N 显示搜索命令定位到的上一个字符串
u 撤销上一步的操作
p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面

末行模式中可用的命令

命令 作用
:w 保存
:q 退出
:q! 强制退出(放弃对文档的修改内容)
:wq! 强制保存退出
:set nu 显示行号
:set nonu 不显示行号
:命令 执行该命令
:整数 跳转到该行
:s/one/two 将当前光标所在行的第一个one替换成two
:s/one/two/g 将当前光标所在行的所有one替换成two
:%s/one/two/g 将全文中的所有one替换成two
?字符串 在文本中从下至上搜索该字符串
/字符串 在文本中从上至下搜索该字符串

1.2 配置主机名称

# vim /etc/hostname

第1步:使用Vim编辑器修改“/etc/hostname”主机名称文件。

第2步:把原始主机名称删除后追加“linuxprobe.com”。注意,使用Vim编辑器修改主机名称文件后,要在末行模式下执行:wq!命令才能保存并退出文档。

第3步:保存并退出文档,然后使用hostname命令检查是否修改成功。

1.3 配置网卡信息

:bulb: 方法一:界面操作

  • RHEL 7 是 # nmtui
  • 重启网卡 # systemctl restart network

:bulb: 方法三 : 图形化界面操作

  • # nm-connection-editor
  • 选择编辑 IPv4 Settings 修改
  • 重启网卡

:bulb: 方法二:名编辑网卡配置文件

第一步:查看本机网卡相关信息 # ifconfig 确定ifcfg-en0xxxxxxxx的值

第二步 :打开网卡配置文件 # vim etc/sysconfig/network-scripts/ifcfg-eno16777736

第三步:编辑相关参数

TYPE=Ethernet
BOOTPROTO=static
NAME=eno16777736
ONBOOT=yes
IPADDR=192.168.10.10
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
DNS1=192.168.10.1

第四步:重启网卡 # systemctl restart network

设备类型:TYPE=Ethernet

地址分配模式:BOOTPROTO=static

网卡名称:NAME=eno16777736

是否启动:ONBOOT=yes

IP地址:IPADDR=192.168.10.10

子网掩码:NETMASK=255.255.255.0

网关地址:GATEWAY=192.168.10.1

DNS地址:DNS1=192.168.10.1

1.4 配置Yum仓库

:checkered_flag: 准备工作 : 将虚拟机的光盘设备指向ISO镜像

第一步:创建系统镜像挂载目录 # mkdir -p /media/cdrom

第二步:编辑挂载信息 # /etc/fstab 写入 /dev/cdrom /media/cdrom iso9660

第三步:进入目录 # cd /etc/yum.repos.d/

使用Vim文本编辑器创建Yum仓库的配置文件 # vim /etc/yum.repos.d/rhel7.repo

1
2
3
4
5
[rhel]
name=rhel
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0

第三步:把光盘设备中的系统镜像挂载到/media/cdrom目录 # mount -a

第四步:查看挂载情况 # df -h

2 编写Shell脚本

运行脚本: bash

脚本申明:#!/bin/bash

脚本注释:#解释说明脚本功能

脚本命令:pwd ls -al

1
2
3
4
5
[root@linuxprobe ~]# vim example.sh
#!/bin/bash
#For Example BY linuxprobe.com
pwd
ls -al

2.1 接收用户的参数

1
2
3
4
5
[root@linuxprobe ~]# vim example.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。"
echo "第1个参数为$1,第5个为$5。"

2.3 判断用户的参数

按照测试对象来划分,条件测试语句可以分为4种:

文件测试语句;

逻辑测试语句;

整数值比较语句;

字符串比较语句。

  • 文件测试所用的参数
操作符 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行

:zap: echo $? 显示返回值,返回值 0存在,返回值 非零 为不存在 $ 符号用于提取变量的值!

1
2
3
4
5
6
7
[root@linuxprobe ~]# [ -d /etc/fstab ]
[root@linuxprobe ~]# echo $?
1

'''
$? 显示返回值,返回值0为存在,返回值非零为不存在
'''
  • 逻辑测试语句

|| : 或 && :与 ?:非

&& 若前面成功,则执行后面

|| 若前面失败,则执行后面

! 取反

1
2
3
4
5
6
7
8
9
10
11
12
13
# 用来判断/dev/cdrom文件是否存在,若存在则输出Exist字样
[root@linuxprobe ~]# [ -e /dev/cdrom ] && echo "Exist"
Exist

# 判断当前登录的用户是否为非管理员身份
[root@linuxprobe ~]# [ $USER = root ] || echo "user"
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ [ $USER = root ] || echo "user"
user

# 先判断当前登录用户的USER变量名称是否等于root,然后用逻辑运算符“非”进行取反操作,效果就变成了判断当前登录的用户是否为非管理员用户了。最后若条件成立则会根据逻辑“与”运算符输出user字样;或条件不满足则会通过逻辑“或”运算符输出root字样,而如果前面的&&不成立才会执行后面的||符号。
[root@linuxprobe ~]# [ $USER != root ] && echo "user" || echo "root"
root
  • 可用的整数比较运算符
操作符 作用
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于小于
-ge 是否大于等于
1
[ `free -m | grep Men: | awk '{print $4}'` -lt 1024 ] && echo "danger" || echo "chongzu"

free -m 查看内存使用量情况(单位为MB)

grep Men: 过滤出剩余内存量的行

awk : 文件逐行的读入 ,读取第四个数据

-lt 1024 : 比较是否小于1024

  • 常见的字符串比较运算符
操作符 作用
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空

3 流程控制语句

3.1 if条件测试语句

  • 单分支的if语句

  • 双分支的if条件语句

  • 多分支的if条件语句

1
2
3
4
5
6
7
8
9
10
# 验证某台主机是否在线
[root@linuxprobe ~]# vim chkhost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null # -c 尝试次数 -i 每个数据间隔时间 -W 等待超时时间 /dev/null 写入黑洞
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用多分支的if条件语句来判断用户输入的分数在哪个成绩区间内,然后输出如Excellent、Pass、Fail等提示信息
[root@linuxprobe ~]# vim chkscore.sh
#!/bin/bash
read -p "Enter your score(0-100):" GRADE # -p 是提示信息参数 GRADE 是赋值参数
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
[root@linuxprobe ~]# bash chkscore.sh
Enter your score(0-100):88
88 is Excellent
[root@linuxprobe ~]# bash chkscore.sh
Enter your score(0-100):80
80 is Pass

3.2 for条件循环语句

eg: 批量创建用户名的脚本(p89)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@linuxprobe ~]# vim Example.sh
#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt` # 读取 user.txt 到 UNAME 中, 实战中需要先创建一个目标user.txt文件
do
id $UNAME &> /dev/null # id 用户名 : 擦看用户信息,并写入黑洞中去
if [ $? -eq 0 ] # $? 判断这条命令是否执行成功
then
echo "Already exists"
else
useradd $UNAME &> /dev/null #没有就 添加新用户
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi # if fi 成对出现
fi # if fi 成对出现
done # do done 成对出现

/dev/null是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。

/etc/passwd是用来保存用户账户信息的文件。如果想确认这个脚本是否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建的用户信息。

eg: 判断主机是否在线(p90)

1
2
3
4
5
6
7
8
9
10
11
12
[root@linuxprobe ~]# vim CheckHosts.sh
#?/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null # -c 尝试次数 -i 每个数据间隔时间 -W 等待超时时间 /dev/null 写入黑洞
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line"
else
echo "Host $IP is Off-line"
fi
done

3.3 while条件循环语句

while循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@linuxprobe~] # vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000) # RANDOM 随机调取一个值 并取余, expr 求表达式变量的值
TIMES=0
while true
do
read -p "Enter: " INT
let TIMES++ #计数(自动加一)
if [ $INT -eq $PRICE ]
then
echo "$TIME Congratulation!"
exit
elif [ $INT -gt $PRICE]
then
echo "High!!"
else
echo "Low!!"
fi
done

3.4 case条件测试语句

case 语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@linuxprobe ~]# vim Checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母。"
;;
[0-9])
echo "您输入的是 数字。"
;;
*)
echo "您输入的是 空格、功能键或其他控制字符。"
esac

4 计划任务服务程序

4.1 at 命令 一次性的计划任务

# at time 设置一次性任务

# at -l 查看已设置好但还未执行的一次性计划任务

# atrm 任务序号 删除任务

  • 设置在今晚23:30分自动重启网站服务
1
2
3
4
5
6
[root@linuxprobe ~]# at 23:30
at > systemctl restart httpd
at > 此处请同时按下Ctrl+d来结束编写计划任务
job 3 at Mon Apr 27 23:30:00 2015
[root@linuxprobe ~]# at -l
3 Mon Apr 27 23:30:00 2016 a root
  • 结合管道符 |
1
2
3
4
5
[root@linuxprobe ~]# echo "systemctl restart httpd" | at 23:30
job 4 at Mon Apr 27 23:30:00 2015
[root@linuxprobe ~]# at -l
3 Mon Apr 27 23:30:00 2016 a root
4 Mon Apr 27 23:30:00 2016 a root
  • 删除两个相同的一次性计划任务的其中一个
1
2
3
[root@linuxprobe ~]# atrm 3
[root@linuxprobe ~]# at -l
4 Mon Apr 27 23:30:00 2016 a root

4.2 crond 服务 有周期性的计划任务

# crontab -e 创建、编辑计划任务的命令

# crontab -l 查看当前计划任务的命令

# crontab -r 删除某条计划任务的命令

  • 分 时 日 月 周 命令

  • 如果有些字段没有设置,则需要使用星号(*)占位

  • :zap: 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。

​ 使用crond设置任务的参数字段说明

字段 说明
分钟 取值为0~59的整数
小时 取值为0~23的任意整数
日期 取值为1~31的任意整数
月份 取值为1~12的任意整数
星期 取值为0~7的任意整数,其中0与7均为星期日
命令 要执行的命令或程序脚本

eg : 每周一、三、五的凌晨3点25分,使用tar命令把某个网站的数据目录进行打包处理,使其作为一个备份文件

1
2
3
4
5
[root@linuxprobe ~]# crontab -e      #创建计划任务,自动调用vim编译器 
no crontab for root - using an empty one
crontab: installing new crontab
[root@linuxprobe ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

用逗号(,)来分别表示多个时间段,例如“8,9,12”表示8月、9月和12月。

用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的12~15日)。

用除号(/)表示执行任务的间隔时间(例如“*/2”表示每隔2分钟执行一次任务)。

eg: 添加一条计划任务,它的功能是每周一至周五的凌晨1点钟自动清空/tmp目录内的所有文件。

1
2
3
4
5
6
7
[root@linuxprobe ~]# whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz
[root@linuxprobe ~]# crontab -e
crontab: installing new crontab
[root@linuxprobe ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*

crond服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,

如果不知道绝对路径,请用whereis 命令进行查询,

第五章 文件权限与归属

5.1 用户身份与能力

管理员UID为0:系统的管理员用户。

系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。

普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。

通过使用用户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务

  • useradd 命令 –创建新的用户

    • # useradd -d /home -u 9999 -s /sbin/nologin linuxprobe
    • -d 指定用户的家目录(默认为/home/username)
    • -u 指定该用户的默认UID
    • -s 指定该用户的默认Shell解释器

  • userdel 命令 – 删除用户

    • # userdel -r linuxprobe
    • -f 强制删除用户
    • -r 同时删除用户及用户家目录
  • groupadd 命令 –创建用户组

    • # groupadd ronny
  • usermod 命令 – 修改用户的属性

    • # usermod -G root linuxprobe
    • -c 填写用户账户的备注信息
    • -d -m 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去
    • -e 账户的到期时间,格式为YYYY-MM-DD
    • -g 变更所属用户组
    • -G 变更扩展用户组
    • -L 锁定用户禁止其登录系统
    • -U 解锁用户,允许其登录系统
    • -s 变更默认终端
    • -u 修改用户的UID
  • passwd 命令 –修改用户密码、过期时间、认证信息等

    • # passwd
    • -l 锁定用户,禁止其登录 # passwd -l linuxprobe
    • --stdin 允许通过标准输入修改用户密码 # echo "NewPassWord" | passwd --stdin Username
    • -d 使该用户可用空密码登录系统
    • -e 强制用户在下次登录时修改密码
    • -S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称

5.2 文件权限与归属

# ls -l

# chmod +权限(-权限) 文件名称 设置文件或目录的权限 , 大写参数-R来表示递归操作 +授权 -取消权限

# chown 用户:用户组 文件名称 设置文件或目录的所有者和所属组

-:普通文件。

d:目录文件。

l:链接文件。

b:块设备文件。

c:字符设备文件。

p:管道文件。

文件权限的字符与数字表示read write execute

通过ls命令查看到的文件属性信息

5.3 文件的特殊权限

​ rwsrwsrwt 7777 满权限

  • SUID 4 执行者临时拥有属主的权限 u + s

    • rwx 改成 rws 原有权限
    • rw- 改成 rwS 原没有权限
    • # chmod u+s 文件
  • SGID 2 获取到文件所属组的权限 g + s

    • rwx 改成 rws 原有权限
    • rw- 改成 rwS 原没有权限
    • # chmod g+s 文件

让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);

在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

  • SBIT 1 “保护位” o + t

    • rwx 改成 rwt 原有权限
    • rw- 改成 rwT 原没有权限
    • # chmod o+t 文件
1
2
3
4
EG : 
rwxrwSrwt : 3 7 6 7
rwxrwSrwT:3 7 6 6
5 6 4 2 :rwSr---wT

5.4 文件的隐藏属性

  • chattr # chattr +权限 文件 # chattr -权限 文件

  • i 无法对文件进行修改;仅能修改其中的子文件内容而不能新建或删除文件
    a 仅允许补充(追加)内容无法覆盖/删除内容(Append Only)
    S 文件内容在变更后立即同步到硬盘(sync)
    s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
    A 不再修改这个文件或目录的最后访问时间(atime)
    b 不再修改文件或目录的存取时间
    D 检查压缩文件中的错误
    d 使用dump命令备份时忽略本文件/目录
    c 默认将文件或目录进行压缩
    u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
    t 让文件系统支持尾部合并(tail-merging)
    x 可以直接访问压缩文件中的内容

    把某个隐藏功能添加到文件上,命令后面追加“+参数”,

    把某个隐藏功能移出文件,追加“-参数”

  • lsattr 显示文件的隐藏权限

    • :zap: 删除目标文件

    • 1
      2
      3
      4
      # ls
      # lsattr initial.cfg 显示隐藏权限
      # chattr -a initial.cfg -a就是去除无法删除权限
      # rm initial.cfg

5.5 文件访问控制列表

  • setfacl 用于管理文件的ACL规则

1
2
3
[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root   
[root@linuxprobe ~]# su - linuxprobe
Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1

针对目录文件需要使用-R递归参数;

针对普通文件则使用-m参数;

如果想要删除某个文件的ACL,则可以使用-b参数。

su - linuxprobe : 切换用户

:zap: 怎么去查看文件上有那些ACL呢?

1
2
[root@linuxprobe ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 4 2017 /root

常用的ls命令是看不到ACL表信息的,但是却可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL了

  • getfacl命令 用于显示文件上设置的ACL信息

    • 设置ACL,用的是setfacl命令;
    • 查看ACL,用的是getfacl命令。

5.6 su命令与sudo服务

  • su命令可以解决切换用户身份的需求 # su - mrxxd - 添加减号完全切换到新的用户。# exit 注销
  • sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务。

限制用户执行指定的命令

记录用户执行的每一条命令

配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;

验证密码的后5分钟内(默认值)无须再让用户再次验证密码

sudo 服务中的可用参数以及作用

参数 作用
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或UID值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行sudo时需要再次进行密码验证
-b 后台执行指定的命令
-p 更改询问密码的提示语
  • visudo 命令

    如果担心直接修改配置文件会出现问题,则可以使用sudo命令提供的visudo命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。

1
2
3
4
5
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL # 第一个ALL 是全部 第二个ALL是获取更高权限 第三个ALL是运行执行什么命令

​ 如果需要让某个用户只能使用root管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用whereis命令找出命令所对应的保存路径,然后把配置文件第99行的用户权限参数修改成对应的路径即可:

1
2
3
4
5
6
7
whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) /usr/bin/cat

:zap: 可以添加NOPASSWD参数,使得用户执行sudo命令时不再需要密码验证:

1
2
3
4
5
6
7
8
9
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff

第六章 存储结构与磁盘划分

6.1 一切从“/”开始

Linux系统中常见的目录名称以及相应内容

目录名称 应放置文件的内容
/boot 开机所需文件—内核、开机菜单以及所需配置文件等
/dev 以文件形式存放任何设备与接口
/etc 配置文件
/home 用户主目录
/bin 存放单用户模式下还可以操作的命令
/lib 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数
/sbin 开机过程中需要的命令
/media 用于挂载设备文件的目录
/opt 放置第三方的软件
/root 系统管理员的家目录
/srv 一些网络服务的数据文件目录
/tmp 任何人均可使用的“共享”临时目录
/proc 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin Linux系统开机时不会使用到的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变化的文件,如日志
/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里

绝对路径指的是从根目录(/)开始写起的文件或目录名称,

相对路径则指的是相对于当前路径的写法

6.2 物理设备的命名规则

常见的硬件设备及其文件名称

硬件设备 文件名称
IDE设备 /dev/hd[a-d]
:star:SCSI/SATA/U盘 硬盘 /dev/sd[a-p] sda sdb sdc
软驱 /dev/fd[0-1]
打印机 /dev/lp[0-15]
:star:光驱 /dev/cdrom
鼠标 /dev/mouse
磁带机 /dev/st0或/dev/ht0

:grey_question: 坑一:第一个知识点是设备名称的理解错误。很多培训讲师和Linux技术图书中会提到,比如/dev/sda表示主板上第一个插槽上的存储设备,学员或读者在实践操作的时候会发现果然如此,因此也就对这条理论知识更加深信不疑

:zap: 正解:/dev目录中sda设备之所以是a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的.

:grey_question: 坑二:第二个知识点是对分区名称的理解错误。很多Linux培训讲师会告诉学员,分区的编号代表分区的个数

:zap: 正解:sda3只能表示是编号为3的分区,而不能判断sda设备上已经存在了3个分区.

主分区或扩展分区的编号从1开始,到4结束;

逻辑分区从编号5开始。

  • 首先,/dev/目录中保存的应当是硬件设备文件;
  • 其次,sd表示是存储设备;然后,a表示系统中同类接口中第一个被识别到的设备
  • 最后,5表示这个设备是一个逻辑分区。“区的设备文件”
  • /dev/sda5表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分

所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。

6.3 文件系统与数据资料

  • Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。

  • Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。

  • XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为18EB,这几乎满足了所有需求。

剪裁——->分区

打格——->格式化

挂载——->使用 关联

独立的inode表格

  • 该文件的访问权限(read、write、execute);
  • 该文件的所有者与所属组(owner、group);
  • 该文件的大小(size);
  • 该文件的创建或内容修改时间(ctime);
  • 该文件的最后一次访问时间(atime);
  • 该文件的修改时间(mtime);
  • 文件的特殊权限(SUID、SGID、SBIT);
  • 该文件的真实数据地址(point)。

VFS的架构示意图

6.4 挂载硬件设备

  • mount命令用于挂载文件系统 # mount /dev/sdb2 /backup

    • -a 挂载所有在/etc/fstab中定义的文件系统
    • -t 指定文件系统的类型
  • umount命令用于撤销已经挂载的设备文件 # umount /dev/sdb2

如果想将文件系统为ext4的硬件设备/dev/sdb2在开机后自动挂载到/backup目录上,并保持默认权限且无需开机自检,就需要在/etc/fstab文件中写入下面的信息:

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@linuxprobe ~]# vim /etc/fstab
    #
    # /etc/fstab
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    /dev/mapper/rhel-root / xfs defaults 1 1
    UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
    /dev/mapper/rhel-swap swap swap defaults 0 0
    /dev/cdrom /media/cdrom iso9660 defaults 0 0
    /dev/sdb2 /backup ext4 defaults 0 0 <-----------------
    备份 挂载 格式 权限 备份 自检

用于挂载信息的指定填写格式中,各字段所表示的意义

字段 意义
设备文件 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier)
挂载目录 指定要挂载到的目录,需在挂载前创建好
格式类型 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等
权限选项 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async
是否备份 若为1则开机后使用dump进行磁盘备份,为0则不备份
是否自检 若为1则开机后自动进行磁盘自检,为0则不自检

6.5 添加硬盘设备

添加硬盘设备的操作思路:

  1. 首先需要在虚拟机中模拟添加入一块新的硬盘存储设备,
  2. 然后再进行分区、格式化、挂载等操作,
  3. 最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加。

分区


  • fdisk命令 管理硬盘设备

    • m 查看全部可用的参数
    • n添加新的分区
    • d 删除某个分区信息
    • l列出所有可用的分区类型
    • t 改变某个分区的类型
    • p查看分区表信息
    • w 保存并退出
    • q不保存直接退出

第1步

我们首先使用fdisk命令来尝试管理/dev/sdb硬盘设备。在看到提示信息后输入参数p来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:

1
2
3
4
[root@linuxprobe ~]# fdisk /dev/sdb     <----------------管理/dev/sdb硬盘设备
·············
Command (m for help): p <-----------------查看硬盘设备内已有的分区信息
·············
第2步

输入参数n尝试添加新的分区。系统会要求您是选择继续输入参数p来创建主分区,还是输入参数e创建扩展分区。这里输入参数p来创建一个主分区:

1
2
3
4
5
Command (m for help): n         <-----------------添加新的分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p <-----------------创建主分区 e来创建扩展分区
第3步

在确认创建一个主分区后,系统要求您先输入主分区的编号。这里输入默认的1就可以了。接下来系统会提示定义起始的扇区位置,我们敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后,系统会要求定义分区的结束扇区位置,需要输入+2G即可创建出一个容量为2GB的硬盘分区。

1
2
3
4
5
Partition number (1-4, default 1): 1           <-----------------输入主分区的编号
First sector (2048-41943039, default 2048):此处敲击回车 <-----------------提示定义起始的扇区位置
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G <-----------------
Partition 1 of type Linux and of size 2 GiB is set
第4步

再次使用参数p来查看硬盘设备中的分区信息。这时候千万不要直接关闭窗口,而应该敲击参数w后回车,这样分区信息才是真正的写入成功啦。

1
2
3
4
5
6
7
8
9
10
11
12
13
Command (m for help): p      <-----------------查看硬盘设备中的分区信息
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x47d24a34
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux
Command (m for help): w <----------------- 写入
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
第5步:

在上述步骤执行完毕之后,Linux系统会自动把这个硬盘主分区抽象成/dev/sdb1设备文件。我们可以使用file命令查看该文件的属性,但是刘遄老师在讲课和工作中发现,有些时候系统并没有自动把分区信息同步给Linux内核,而且这种情况似乎还比较常见(但不能算作是严重的bug)。我们可以输入partprobe命令手动将分区信息同步到内核,推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧,这个杀手锏百试百灵,一定会有用的。

1
2
3
4
5
6
[root@linuxprobe ]# file /dev/sdb1        <-----------------   查看该文件的属性
/dev/sdb1: cannot open (No such file or directory)
[root@linuxprobe ]# partprobe <----------------- 将分区信息同步到内核
[root@linuxprobe ]# partprobe
[root@linuxprobe ]# file /dev/sdb1
/dev/sdb1: block special

格式化


  • mkfs 用于格式化操作的命令

这条命令很有意思,因为在Shell终端中输入mkfs名后再敲击两下用于补齐命令的Tab键,会有如下所示的效果:

1
2
3
[root@linuxprobe ~]# mkfs
mkfs mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.xfs
mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.vfat

要格式分区为XFS的文件系统,则命令应为mkfs.xfs /dev/sdb1

1
2
3
4
5
6
7
8
9
10
[root@linuxprobe ~]# mkfs.xfs /dev/sdb1   <-----------------格式化分区
meta-data=/dev/sdb1 isize=256 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

挂载


  • mount 将存储设备与挂载点进行关联

终于完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。与之相关的步骤也非常简单:首先是创建一个用于挂载设备的挂载点目录;然后使用mount命令将存储设备与挂载点进行关联;最后使用df -h命令来查看挂载状态和硬盘使用量信息。

1
2
3
4
5
6
7
8
9
10
11
12
[root@linuxprobe ~]# mkdir /newFS             # 创建一个用于挂载设备的挂载点目录
[root@linuxprobe ~]# mount /dev/sdb1 /newFS/ # 将存储设备与挂载点进行关联
[root@linuxprobe ~]# df -h # 查看挂载状态和硬盘使用量信息
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.5G 15G 20% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 140K 914M 1% /dev/shm
tmpfs 914M 8.8M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sr0 3.5G 3.5G 0 100% /media/cdrom
/dev/sda1 497M 119M 379M 24% /boot
/dev/sdb1 2.0G 33M 2.0G 2% /newFS

  • du命令 查看文件数据占用量 # du -sh /newFS/

如果想让这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0 <-----------------

6.6 添加交换分区

SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@linuxprobe ~]# fdisk /dev/sdb   <-----------------
······
Command (m for help): n <-----------------
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extendedSelect (default p): p <-----------------
Partition number (2-4, default 2):
First sector (4196352-41943039, default 4196352): 此处敲击回车 <-----------------
······
Last sector, +sectors or +size{K,M,G} (4196352-41943039, default 41943039): +5G <-----------------
·······
Command (m for help): p <-----------------
·······
Command (m for help): w <-----------------
·······

使用SWAP分区专用的格式化命令mkswap,对新建的主分区进行格式化操作

1
2
3
[root@linuxprobe ~]# mkswap /dev/sdb2       <-----------------
Setting up swapspace version 1, size = 5242876 KiB
no label, UUID=2972f9cb-17f0-4113-84c6-c64b97c40c75

使用swapon命令把准备好的SWAP分区设备正式挂载到系统中

1
[root@linuxprobe ~]# swapon /dev/sdb2       <-----------------

为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入到配置文件中,并记得保存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@linuxprobe ~]# vim /etc/fstab        <-----------------
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0

6.7 磁盘容量配额

点击查看(ctrl +) linux 中inode包含什么内容

软限制(bsoft=3m isoft=3):当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。

硬限制(bhard=6m ihard=6):当达到硬限制时会提示用户,且强制终止用户的操作。

接下来创建一个用于检查quota磁盘容量配额效果的用户tom,并针对/boot目录增加其他人的写权限,保证用户能够正常写入数据:

1
2
[root@linuxprobe ~]# useradd tom
[root@linuxprobe ~]# chmod -Rf o+w /boot
  • xfs_quota命令 针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令

    • -c参数用于以参数的形式设置要执行的命令;
    • -x参数是专家模式,让运维人员能够对quota服务进行更多复杂的配置。
1
2
3
4
5
6
7
8
# 具体的限额控制包括:硬盘使用量的软限制和硬限制分别为3MB和6MB;创建文件数量的软限制和硬限制分别为3个和6个。
[root@linuxprobe ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot
[root@linuxprobe ~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1) Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 95084 0 0 00 [--------]
tom 0 3072 6144 00 [--------]
  • edquota命令 编辑用户的quota配额限制

    • -u参数表示要针对哪个用户进行设置
    • -g参数表示要针对哪个用户进行设置

把用户tom的硬盘使用量的硬限额从5MB提升到8MB:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@linuxprobe ~]# edquota -u tom
Disk quotas for user tom (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sda1 6144 3072 8192 1 3 6
[root@linuxprobe ~]# su - tom
Last login: Mon Sep 7 16:43:12 CST 2017 on pts/0
[tom@linuxprobe ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
1+0 records in
1+0 records out
8388608 bytes (8.4 MB) copied, 0.0268044 s, 313 MB/s
[tom@linuxprobe ~]$ dd if=/dev/zero of=/boot/tom bs=10M count=1
dd: error writing ‘/boot/tom’: Disk quota exceeded
1+0 records in
0+0 records out
8388608 bytes (8.4 MB) copied, 0.167529 s, 50.1 MB/s

6.8 软硬方式链接

硬链接(hard link):可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件

软链接(soft link):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。

  • ln 命令 创建链接文件

    • -s 创建“符号链接”(如果不带-s参数,则默认创建硬链接)
    • -f 强制创建文件或目录的链接
    • -i 覆盖前先询问
    • -v 显示创建链接的过程

关于 inode

  • inode 相关命令

    • 查看inode总数和已经使用的数量: df -i
    • 查看每个inode节点的大小:sudo dumpe2fs -h /dev/hda | grep "Inode size"
    • 查看每个文件对应的inode号码:ls -i example.txt
    • 查看整个目录文件(文件名及inode号码):ls -i /etc
    • 查看文件详细信息:ls -l /etc
  • inode 的特殊作用

    • 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
    • 移动文件或重命名文件,只是改变文件名,不影响inode号码。
    • 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名

实际问题

在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。

查找原因:

/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。

解决方案:

1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:

1
ln -s /opt/newcache /data/cache

第七章 使用RAID与LVM磁盘阵列技术

7.1 RAID磁盘冗余阵列

  • RAID 0

    • 有效地提升硬盘数据的吞吐速度
    • 不具备数据备份和错误修复能力

  • RAID1

    • 将数据进行镜像或备份,避免数据损毁
    • 使用率较低 33%左右

  • RAID 5

    • 兼顾了硬盘设备的读写速度、数据安全性与存储成本问题

  • RAID 10

    • RAID 1+RAID 0技术的一个“组合体
    • 最多可以损坏50%的硬盘设备而不丢失数
    • 进一步提高硬盘设备的读写速度

7.1.1 部署磁盘阵列

  • mdadm 用于管理 Linux 系统中的软件RAID硬盘阵列

    • -a检测设备名称
    • -n指定设备数量
      -l指定RAID级别
    • -C创建
    • -v显示过程
    • -f模拟设备损坏
    • -r移除设备
    • -Q查看摘要信息
    • -D 查看详细信息
    • -S停止RAID磁盘阵列

第一步:查看一下硬盘情况: # ls -l /dev/sd*

创建磁盘阵列# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd[b-e]

查看一下md0磁盘简要的信息# mdadm -Q /dev/md0

查看一下md0磁盘详细的信息及同步状态# mdadm -D /dev/md0

-C参数代表创建一个RAID阵列卡;

-v参数显示创建的过程,同时在后面追加一个设备名称/dev/md0,这样/dev/md0就是创建后的RAID磁盘阵列的名称;

-a yes参数代表自动创建设备文件;

-n 4参数代表使用4块硬盘来部署这个RAID磁盘阵列;

-l 10参数则代表RAID 10方案;

最后再加上4块硬盘设备的名称就搞定了

第二步:将RAID磁盘阵列格式化# mkfs.xfs /dev/md0

格式化的格式可以随意的 ext4 或者xfs 都可以

第三步:创建一个目录foot作为挂载点# mkdir /foot

第四步:挂载到foot目录上面# mount /dev/md0 /foot

查看一下挂载完后的信息# df -h

第五步: 将挂载信息写入配置文件 # vim /etc/fstab :zap:

最底行写入 /dev/md0 /foot xfs defaults 0 0 0 不备份 0不自检


7.1.2 损坏磁盘阵列及修复

:bulb: 替换掉坏掉的硬盘,将新的硬盘插入。

第一步:先查看硬盘状态 # mdadm -D /dev/md0

第二步:卸载掉当前的挂载点:# umount /foot

第三步:为磁盘整列组添加新的磁盘:# mdadm /dev/md0 -a /dev/sd*

* 星号 代表那个盘坏了添加哪个

第四步:查看一下同步信息:# mdadm -D /dev/md0 等待它同步完成

第五步:重新挂载阵列磁盘:# mount /dev/md0 /foot 查看一下挂载完后的信息# df -h


7.1.3 磁盘阵列+备份盘

第一步 :创建一个RAID 5的磁盘整列和备份盘# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sd[b-e]

查看一下同步信息:# mdadm -D /dev/md0 等待它同步完成

-n 3代表创建这个RAID 5磁盘阵列所需的硬盘数,

-l 5代表RAID的级别

-x 1则代表有一块备份盘

第二步:将RAID 5磁盘阵列格式化# mkfs.xfs /dev/md0

第三步:创建一个目录foot作为挂载点# mkdir /foot

第四步:挂载阵列磁盘# mount -a

查看一下挂载完后的信息# df -h

第五步: 将挂载信息写入配置文件 # vim /etc/fstab :zap:

最底行写入 /dev/md0 /foot xfs defaults 0 0 0 不备份 0不自检

效果:

  • 损坏磁盘4之前:

  • 损坏磁盘后备份磁盘3顶替原先损坏的磁盘位置:


简单无痛解决Linux下修改/etc/fstab导致无法启动的问题


7.2 LVM逻辑卷管理器

LVM可以允许用户对硬盘资源进行动态调整。

物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列,这都可以。

卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。

逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是LVM的核心理念。

:happy:老刘易懂例子解释:小明家里想吃馒头但是面粉不够了,于是妈妈从隔壁老王家、老李家、老张家分别借来一些面粉,准备蒸馒头吃。首先需要把这些面粉(物理卷[PV,Physical Volume])揉成一个大面团(卷组[VG,Volume Group]),然后再把这个大面团分割成一个个小馒头(逻辑卷[LV,Logical Volume]),而且每个小馒头的重量必须是每勺面粉(基本单元[PE,Physical Extent])的倍数。

7.2.1 部署逻辑卷

:card_file_box: 部署LVM时,需要逐个配置 物理卷——>卷组——>逻辑卷

常用的LVM部署命令

功能/命令 物理卷管理 pv 卷组管理 vg 逻辑卷管理 lv
扫描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
显示 pvdisplay vgdisplay lvdisplay
删除 pvremove vgremove lvremove
扩展 vgextend lvextend
缩小 vgreduce lvreduce

:file_cabinet: 步骤:预先准备好两个硬盘

第一步:让新添加的两块硬盘设备支持LVM技术 # pvcreate /dev/sdb /dev/sdc

第二步:把两块硬盘设备加入到storage卷组中 # vgcreate storage /dev/sdb /dev/sdc

查看卷组的状态 # vgdisplay

storage 卷组名称 命名随意 foot 也行,主要是自己认识

第三步:切割出一个约为150MB的逻辑卷设备 # lvcreate -n vo -l 37 storage

-n vo 卷组名称统一默认vo

-l 37 生成一个大小为37×4MB=148MB的逻辑卷

-L 150M 生成一个大小为150MB的逻辑卷

第四步:把生成好的逻辑卷进行格式化 # mkfs.ext4 /dev/storage/vo

/dev/卷组名/逻辑卷名

第五步:创建挂载点进行挂载 # mkdir /foot

# mount /dev/storage/vo /foot

第六步:查看挂载状态 # df -h

写入到配置文件 # echo "/dev/storage/vo /foot ext4 defaults 0 0" >> /etc/fstab

7.2.2 扩容逻辑卷

第一步:卸载设备 # umount /foot

第二步:上一个实验中的逻辑卷vo扩展至290MB # lvextend -L 290M /dev/storage/vo

第三步:检查硬盘完整性 # e2fsck -f /dev/storage/vo

并重置硬盘容量 # resize2fs /dev/storage/vo

第四步:重新挂载硬盘设备并查看挂载状态 # mount -a `# df -h`

7.2.3 缩小逻辑卷

注意事项:

第一步:卸载设备 # umount /foot

第二步:检查文件系统的完整性 # e2fsck -f /dev/storage/vo

第三步:把逻辑卷vo的容量减小到120MB # resize2fs /dev/storage/vo 120M

第四步:重新挂载文件系统并查看系统状态 # mount -a # df -h

7.2.4 逻辑卷快照

注意事项:

  • :zap: 快照卷的容量必须等同于逻辑卷的容量 大小相同
  • :zap: 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除

第一步:首先查看卷组的信息 # vgdisplay

第二步:用重定向往逻辑卷设备所挂载的目录中写入一个文件 # echo "Welcome to my style" > /foot/readme.txt

第三步:用-s参数生成一个快照卷,使用-L参数指定切割的大小 # lvcreate -L 120M -s -n SNAP /dev/storage/vo

查看快照信息 # lvdisplay

SNAP :快照的名称!

/dev/storage/vo :快照备份对象

快照还原:

第一步:先卸载逻辑卷设备 # umount /foot

第二步: 还原快照# lvconvert --merge /dev/storage/SNAP

第三步:重新挂载 # mount -a

7.2.5 删除逻辑卷

注意事项: :zap: 需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备,这个顺序不可颠倒

第一步:取消逻辑卷与目录的挂载关联,# umount /foot

第二步:删除配置文件中永久生效的设备参数。# vim /etc/fstab

第三步:删除逻辑卷设备,需要输入y来确认操作 # lvremove /dev/storage/vo

Do you really want to remove active logical volume vo? [y/n]: y

第四步:删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。 # vgremove storage

第五步:删除物理卷设备 # pvremove /dev/sdb /dev/sdc

第八章 Iptables与Firewalld防火墙

iptables、firewall-cmd、firewall-config和TCP Wrappers等防火墙策略配置服务

8.1 防火墙管理工具

8.2 Iptables

8.2.1 策略与规则链

8.2.2 基本的命令参数

8.3 Firewalld

RHEL 7系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。

firewalld中常用的区域名称及策略规则

区域 默认规则策略
:eyes: trusted 允许所有的数据包
home 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量
internal 等同于home区域
work 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量
:eyes: public 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量
external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
block 拒绝流入的流量,除非与流出的流量相关
:eyes: drop 拒绝流入的流量,除非与流出的流量相关

8.3.1 终端管理工具

  • firewall-cmd 用Tab键来补齐 长格式参数了

ewall-cmd命令中使用的参数以及作用

  • –get-default-zone 查询默认的区域名称
  • –set-default-zone=<区域名称> 设置默认的区域,使其永久生效-
  • -get-zones 显示可用的区域
  • –get-services 显示预先定义的服务
  • –get-active-zones 显示当前正在使用的区域与网卡名称
  • –add-source= 将源自此IP或子网的流量导向指定的区域
  • –remove-source= 不再将源自此IP或子网的流量导向某个指定区域
  • –add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
  • –change-interface= <网卡名称> 将某个网卡与区域进行关联
  • –list-all 示当前区域的网卡配置参数、资源、端口以及服务等信息
  • –list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
  • –add-service= <服务名> 设置默认区域允许该服务的流量
  • –add-port= <端口号/协议> 设置默认区域允许该端口的流量
  • –remove-service= <服务名> 设置默认区域不再允许该服务的流量
  • –remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
  • –reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
  • –panic-on 开启应急状况模式
  • –panic-off 关闭应急状况模式
参数 作用
–get-default-zone 查询默认的区域名称
–set-default-zone=<区域名称> 设置默认的区域,使其永久生效
–get-zones 显示可用的区域
–get-services 显示预先定义的服务
–get-active-zones 显示当前正在使用的区域与网卡名称
–add-source= 将源自此IP或子网的流量导向指定的区域
–remove-source= 不再将源自此IP或子网的流量导向某个指定区域
–add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
–change-interface=<网卡名称> 将某个网卡与区域进行关联
–list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
–list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
–add-service=<服务名> 设置默认区域允许该服务的流量
–add-port=<端口号/协议> 设置默认区域允许该端口的流量
–remove-service=<服务名> 设置默认区域不再允许该服务的流量
–remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
–reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
–panic-on 开启应急状况模式
–panic-off 关闭应急状况模式
  • 运行时(Runtime)模式
    • 又称为当前生效模式,而且随着系统的重启会失效
  • 永久(Permanent)模式
    • 设置防火墙策略时添加--permanent参数,防火墙策略就可以永久生效
    • 如果想让配置的策略立即生效,需要手动执行# firewall-cmd --reload命令

:bookmark_tabs: 查看 get firewall服务当前所使用的区域

# firewall-cmd --get-default-zone

:bookmark_tabs: 把firewalld服务的当前默认区域设置为 public

# firewall-cmd --set-default-zone=public

:bookmark_tabs: 查询eno16777736网卡在firewalld服务中的区域

# firewall-cmd --get-zone-of-interface=eno16777736

:bookmark_tabs: 启动/关闭firewalld防火墙服务的应急状况模式 panic ,阻断一切网络连接

# firewall-cmd --panic-on 启动紧急状况

# firewall-cmd --panic-off 关闭紧急状况

:bookmark_tabs: 查询public区域是否允许请求 querySSH和HTTPS协议的流量:query

# firewall-cmd --zone=public --query-service=ssh

# firewall-cmd --zone=public --query-service=https

:bookmark_tabs: 把firewalld服务中请求HTTPS协议的流量设置为永久允许 add,并立即生效

# firewall-cmd --zone=public --add-service=https

# firewall-cmd --permanent --zone=public --add-service=https 永久生效

# firewall-cmd --reload

把firewalld服务中请求HTTP协议的流量设置为永久拒绝 remove,并立即生效:

# firewall-cmd --permanent --zone=public --remove-service=http

# firewall-cmd --reload

把在firewalld服务中访问8080和8081端口的流量策略设置为允许,但仅限当前生效

# firewall-cmd --zone=public --add-port=8080-8081/tcp

# firewall-cmd --zone=public --list-ports

把原本访问本机888端口的流量转发到22端口,要且求当前和长期均有效:

# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10

# firewall-cmd --reload

8.3.2 图形管理工具

  • # firewall-config 图形用户界面

    在使用firewall-config工具配置完防火墙策略之后,无须进行二次确认,因为只要有修改内容,它就自动进行保存

1:选择运行时(Runtime)模式或永久(Permanent)模式的配置。

2:可选的策略集合区域列表。

3:常用的系统服务列表。

4:当前正在使用的区域。

5:管理当前被选中区域中的服务。

6:管理当前被选中区域中的端口。

7:开启或关闭SNAT(源地址转换协议)技术。

8:设置端口转发策略。

9:控制请求icmp服务的流量。

10:管理防火墙的富规则。

11:管理网卡设备。

12:被选中区域的服务,若勾选了相应服务前面的复选框,则表示允许与之相关的流量。

13:firewall-config工具的运行状态。

  • 让配置的防火墙策略规则立即生效

  • 把网卡与防火墙策略区域进行绑定

8.4 服务的访问控制列表

  • TCP Wrappers

    • # vim /etc/hosts.allow
    • # vim /etc/hosts.deny

TCP Wrappers服务的控制列表文件中常用的参数

客户端类型 示例 满足示例的客户端列表
单一主机 192.168.10.10 IP地址为192.168.10.10的主机
指定网段 192.168.10. IP段为192.168.10.0/24的主机
指定网段 192.168.10.0/255.255.255.0 IP段为192.168.10.0/24的主机
指定DNS后缀 .linuxprobe.com 所有DNS后缀为.linuxprobe.com的主机
指定主机名称 www.linuxprobe.com 主机名称为www.linuxprobe.com的主机
指定所有客户端 ALL 所有主机全部包括在内

第9章 使用ssh服务管理远程主机

9.1 配置网卡服务

9.1.1 配置网卡参数

nmtui方法详细配置件见第四章:arrow_left: 点击查看

9.1.2 创建网络会话

使用了网络会话功能后只需在不同的使用环境中激活相应的网络会话,就可以实现网络配置信息的自动切换了

  • # nmcli命令来管理Network Manager

:bookmark_tabs:查看网络信息: # nmcli connection show

:bookmark_tabs:查看网络状态及详细信息: # nmcli con show eno16777736

:bookmark_tabs:创建网络会话: # nmcil connection add con-name type ifname

  • 公司
    • # nmcli connection add con-name company ifname eno16777736 autoconnect no type ethernet ip4 192.168.10.10/24 gw4 192.168.10.1
  • 家庭
    • # nmcli connection add con-name house type ethernet ifname eno16777736

:bookmark_tabs:查看创建的所有网络会话: # nmcli connection show

如果使用的是虚拟机,请把虚拟机系统的网卡(网络适配器)切换成桥接模式,如图9-9所示。然后重启虚拟机系统即可。

:bookmark_tabs: 启用house网络会话:# nmcli connection up house

9.1.3 绑定两块网卡

  • 网络传输的速度变得更快;

  • 一块网卡突然出现了故障,另外一块网卡便会立即自动顶替上去,保证数据传输不会中断

第一步: 在虚拟机系统中再添加一块网卡设备,请确保两块网卡模式相同

第二步:使用Vim文本编辑器来配置网卡设备的绑定参数

- **`# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736`**
  • TYPE=Ethernet
    BOOTPROTO=none
    ONBOOT=yes
    USERCTL=no
    DEVICE=eno16777736 确保不能输错
    MASTER=bond0
    SLAVE=yes
    - **`# vim /etc/sysconfig/network-scripts/ifcfg-eno33554968`**
    - **MASTER=bond0     SLAVE=yes**              
    

第三步:将绑定后的设备命名为bond0并把IP地址等信息填写进去

  • # vim /etc/sysconfig/network-scripts/ifcfg-bond0

  • TYPE=Ethernet
    BOOTPROTO=static
    ONBOOT=yes yes开机启用它
    USERCTL=no 不通过命令行进行控制
    DEVICE=bond0

    IPADDR=192.168.10.10
    PREFIX=24 等同 255.255.255.0
    DNS=192.168.10.1
    NM_CONTROLLED=no

第四步:使用Vim文本编辑器创建一个用于网卡绑定的驱动文件

  • # vim /etc/modprobe.d/bond.conf

  • alias bond0 bonding
    options bond0 miimon=100 mode=6

  • mode0(平衡负载模式):平时两块网卡均工作,且自动备援,但需要在与服务器本地网卡相连的交换机设备上进行端口聚合来支持绑定技术。

    mode1(自动备援模式):平时只有一块网卡工作,在它故障后自动替换为另外的网卡。

    mode6(平衡负载模式):平时两块网卡均工作,且自动备援,无须交换机设备提供辅助支持。

    • 面使用Vim文本编辑器创建一个用于网卡绑定的驱动文件,使得绑定后的bond0网卡设备能够支持绑定技术bonding);
    • 同时定义网卡以mode6模式进行绑定,且出现故障时自动切换的时间为100毫秒。

第五步:重启网络服务后网卡绑定操作即可成功

  • # systemctl restart network

9.2 远程控制服务

9.2.1 配置sshd服务

SSH(Secure Shell是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux系统的首选方式

两种安全验证的方法:

  • 基于口令的验证—用账户和密码来验证登录;
  • 基于密钥的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;

sshd服务配置文件中包含的参数以及作用

参数 作用
Port 22 默认的sshd服务端口
ListenAddress 0.0.0.0 设定sshd服务器监听的IP地址
Protocol 2 SSH协议的版本号
HostKey /tc/ssh/ssh_host_key SSH协议版本为1时,DES私钥存放的位置
HostKey /etc/ssh/ssh_host_rsa_key SSH协议版本为2时,RSA私钥存放的位置
HostKey /etc/ssh/ssh_host_dsa_key SSH协议版本为2时,DSA私钥存放的位置
:eyes: PermitRootLogin yes 设定是否允许root管理员直接登录
StrictModes yes 当远程用户的私钥改变时直接拒绝连接
MaxAuthTries 6 最大密码尝试次数
MaxSessions 10 最大终端数
PasswordAuthentication yes 是否允许密码验证
PermitEmptyPasswords no 是否允许空密码登录(很不安全)

:bookmark_tabs: 禁止以root管理员的身份远程登录到服务器

第一步:使用Vim文本编辑器打开sshd服务的主配置文件 # vim /etc/ssh/sshd_config

第二步:修改第48行参数

  • #PermitRootLogin yes 改为 PermitRootLogin no
    • # 井号去掉 ,并把 yes 改为 no

第三步:重启sshd # systemctl restart sshd

第四步:加入到开机启动项 # systemctl enable sshd

登录方式 : # ssh 192.168.10.10

9.2.2 安全密钥验证

windows 可以用PuTTYgen生成密钥

第一步在客户端主机中生成“密钥对” # ssh-keygen

第二步把客户端主机中生成的公钥文件传送至远程主机 # ssh-copy-id 192.168.10.10

第三步对服务器进行设置,使其只允许密钥验证,拒绝传统的口令验证方式 # vim /etc/ssh/sshd_config

1
2
3
4
5
6
7
8
………………省略部分输出信息………………
74
75 # To disable tunneled clear text passwords, change to no here!
76 #PasswordAuthentication yes
77 #PermitEmptyPasswords no
78 PasswordAuthentication no <--------
79
………………省略部分输出信息………………

第四步:重启sshd服务 # systemctl restart sshd

第五步在客户端尝试登录到服务器,此时无须输入密码也可成功登录 # ssh 192.168.10.10

9.2.3 远程传输命令

  • scp 是一个基于SSH协议在网络之间进行安全传输的命令

    • -v 显示详细的连接进度
      -P 指定远程主机的sshd端口号
      -r 用于传送文件夹 要传送整个文件夹内的所有数据,还需要额外添加参数-r进行递归操作
      -6 使用IPv6协议
  • 上传

    • scp /本地文件名 IP地址:/上传路径 # scp /root/readme.txt 192.168.10.20:/home
  • 下载

    • scp IP地址:文件名 /路径 # scp 192.168.10.20:/etc/redhat-release /root

9.3 不间断会话服务

screen是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序

  • 会话恢复:即便网络中断,也可让会话随时恢复,确保用户不会失去对远程会话的控制。
  • 多窗口:每个会话都是独立运行的,拥有各自独立的输入输出终端窗口,终端窗口内显示过的信息也将被分开隔离保存,以便下次使用时依然能看到之前的操作记录。
  • 会话共享:当多个用户同时登录到远程服务器时,便可以使用会话共享功能让用户之间的输入输出信息共享
  • screen命令

    • -S参数创建会话窗口
    • -d参数将指定会话进行离线处理
    • -r参数恢复指定会话
    • -x参数一次性恢复所有的会话 同步
    • -ls参数显示当前已有的会话;
    • -wipe参数把目前无法使用的会话删除

9.3.1 管理远程会话

:bookmark_tabs: 创建一个名称为backup的会话窗口 : # screen -S backup

:bookmark_tabs:查看到当前的会话 : # screen -ls

:bookmark_tabs: 退出一个会话: # exit

9.3.2 会话共享功能

screen命令不仅可以确保用户在极端情况下也不丢失对系统的远程控制,保证了生产环境中远程工作的不间断性,而且它还具有会话共享、分屏切割、会话锁定等实用的功能。其中,会话共享功能是一件很酷的事情,当多个用户同时控制主机的时候,它可以把屏幕内容共享出来,也就是说每个用户都可以看到相同的内容。

首先使用ssh服务程序将终端A远程连接到服务器,并创建一个会话窗口

1
2
3
4
5
6
7
8
9
[root@client A ~]# ssh 192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts.
root@192.168.10.10's password:此处输入root管理员密码
Last login: Wed May 4 07:56:29 2017
[root@client A ~]# screen -S linuxprobe
[root@client A ~]#

使用ssh服务程序将终端B远程连接到服务器,并执行获取远程会话的命令

1
2
3
4
5
6
7
8
[root@client B ~]# ssh 192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts.
root@192.168.10.10's password:此处输入root管理员密码
Last login: Wed Feb 22 04:55:38 2017 from 192.168.10.10
[root@client B ~]# screen -x