Fork me on GitHub

NFS服务

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

NFS简介

NFS特点

  • NFS(Network File System)网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

  • NFS适用于Linux与unix之间实现文件共享,不能实现Linux与Windows之间的文件共享

  • NFS运行在应用层的协议上,其监听于2049/tcp和2049/udp套接字上

注意:NFS服务只能基于IP进行认证

使用NFS的好处

  • 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。
  • 用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。
  • 一些存储设备如软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。

NFS的体系组成

NFS体系至少有两个主要部分:

img

一台NFS服务器和若干台客户机,如上图所示。

客户机通过TCP/IP网络远程访问存放在NFS服务器上的数据。

在NFS服务器正式启用前,需要根据实际环境和需求,配置一些NFS参数。

NFS的应用场景

  1. 多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。

  2. 在大型网络中,配置一台中心 NFS 服务器用来放置所有用户的home目录可能会带来便利。这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。

  3. 不同客户端可在NFS上观看影视文件,节省本地空间。

  4. 在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下。

  • NFS是运行在应用层的协议。随着NFS多年的发展和改进,NFS既可以用于局域网也可以用于广域网,且与操作系统和硬件无关,可以在不同的计算机或系统上运行。

NFS挂载原理

  • ​ 当我们在NFS服务器设置好一个共享目录/home/public后,其他的有权访问NFS服务器的NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点,这个挂载点可以自己定义,如上图客户端A与客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/home/public的所有数据。如果服务器端配置的客户端只读,那么客户端就只能够只读。如果配置读写,客户端就能够进行读写。挂载后,NFS客户端查看磁盘信息命令:#df –h。

  • 既然NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间要传输数据就要有想对应的网络端口,NFS服务器到底使用哪个端口来进行数据传输呢?基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了!

NFS的工作机制

NFS是基于rpc来实现网络文件系统共享的。

RPC

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

RPC工作原理

运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:

1.调用客户端句柄;执行传送参数

2.调用本地系统内核发送网络消息

3.消息传送到远程主机

4.服务器句柄得到消息并取得参数

5.执行远程过程

img

6.执行的过程将结果返回服务器句柄

7.服务器句柄返回结果,调用远程系统内核

8.消息传回本地主机

9.客户句柄由内核接收消息

10.客户接收句柄返回的数据

NIS

NIS(Network Information Service)—–网络信息服务,是诺顿网络安全特警简称,同时NIS是Sun Microsystem于1985年发布的一项目录服务技术(Diretory Service),用来集中控制几个系统管理数据库的网络用品。简化了UNIX和LINUX桌面客户的管理工作,客户端利用它可以使用中心服务器的管理文件。

NFS的工作机制

NFS服务器端运行着四个进程:

  • nfsd nfs的守护进程,监听在2049/tcp和2049/udp端口上;不负责文件的存储(由NFS服务器本地内核负责调度存储),用于理解客户端发起的RPC请求,并将其转交给本地内核,然后存储在指定的文件系统上
  • mountd 用于验证客户端是否在允许访问此NFS文件系统的客户端列表中,如果在的话就允许访问(发放一个指令,携带指令去寻找nfsd); mountd的服务端口是随机的,由rpc服务提供随机的端口号
  • idmapd 实现用户账号的集中映射,把所有的账号都映射为nfsnobody,但是在访问时却能以本地用户的身份去访问
  • portmapper NFS服务器的RPC服务,其监听于111/tcp和111/UDP套接字上,用于管理远程过程中调用RPC

exports文件的格式

nfs的主配置文件是/etc/exports,在此文件中,可以定义NFS系统的输出目录(即共享目录)、访问权限和允许访问的主机等参数。该文件默认为空,没有配置输出任何共享目录,这是基于安全性的考虑,如此即使系统启动了NFS服务也不会输出任何共享资源。

exports文件中每一行提供了一个共享目录的设置,其命令格式为:

1
<输出目录> [客户端1(选项1,选项2,...)] [客户端2(选项1,选项2,...)]

其中,除输出目录是必选参数外,其他参数均是可选项。另外,格式中的输出目录和客户端之间、客户端与客户端之间都使用空格分隔,但客户端与选项之间不能有空格。

客户端是指网络中可以访问这个NFS共享目录的计算机。客户端的指定非常灵活,可为单个主机的IP或域名,亦可为某个子网或域中的主机等。

客户端地址的设置主要有以下几种方式:

  • 可以使用完整的IP或者是网络号,例如192.168.107.140 或 192.168.107.0/24
  • 可以使用主机名,但这个主机名必须要在/etc/hosts内,或可以使用DNS找到该名称才行,反正重点是可找到IP就行,如果是主机名的话,还可以支持通配符,例如‘*’或‘?’均可接受。

选项用来设置共享目录的访问权限、用户映射等。exports文件中的选项比较多,一般可分为三类:

  • 访问权限选项(用于控制共享目录的访问权限)
  • 用户映射选项
    • 默认情况下,当客户端访问NFS服务器时,若远程访问的用户是root用户,则NFS服务器会将其映射成一个本地的匿名用户(该用户为nfsnobody),并将其所属的用户组也映射成匿名用户组(该用户组也为nfsnobody),如此有助于提高系统的安全性。
  • 其他选项

访问权限选项:

访问权限选项 说明
ro 设置输出目录只读
rw 设置输出目录可读写

用户映射选项:

用户映射选项 说明
all_squash 将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody)
no_all_squash 不将远程访问的所有普通用户及所属用户组都映射为匿名用户或用户组(默认设置)
root_squash 将root用户及所属用户组都映射为匿名用户或用户组(默认设置)
no_root_squash 不将root用户及所属用户组都映射为匿名用户或用户组
anonuid=xxx 将远程访问的所有用户都映射为匿名用户,并指定该匿名用户为本地用户帐户(UID=xxx)
anongid=xxx 将远程访问的所有用户组都映射为匿名用户组,并指定该匿名用户组为本地用户组(GID=xxx)

常用的其他选项:

其他选项 说明
secure 限制客户端只能从小于1024的TCP/IP端口连接NFS服务器(默认设置)
insecure 允许客户端从大于1024的TCP/IP端口连接NFS服务器
sync 将数据同步写入内存缓冲区或磁盘中,效率较低,但可保证数据一致性
async 将数据先保存在内存缓冲区中,必要时才写入磁盘
wdelay 检查是否有相关的写操作,如果有则这些写操作一起执行,可提高效率(默认设置)
no_wdelay 若有写操作则立即执行,应与sync配置使用
subtree_check 若输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认设置)
no_subtree_check 即使输出目录是一个子目录,NFS服务亦不检查其父目录的权限,可提高效率
nohide 若将一个目录挂载到另一个目录之上,则原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需启用hide选项

NFS管理

  • 安装NFS
1
2
3
4
5
6
7
# 安装
yum -y install nfs*
# 启动
systemctl restart nfs-server rpcbind
或者 systemctl start nfs-server rpcbind
#查看启动状态
systemctl status nfs
  • 使用showmount命令测试NFS服务器的输出目录状态
1
2
3
4
5
6
7
8
9
10
11
12
13
语法:showmount [选项] [NFS服务器名称或地址]
常用的选项:
-a 显示指定NFS服务器的所有客户端主机及其所连接的目录
-d 显示指定的NFS服务器中已被客户端连接的所有输出目录
-e 显示指定的NFS服务器上所有输出的共享目录

[root@client ~]# showmount -a 192.168.176.222
All mount points on 192.168.176.222:
[root@client ~]# showmount -d 192.168.176.222
Directories on 192.168.176.222:
[root@client ~]# showmount -e 192.168.176.222
Export list for 192.168.176.222:
/123 192.168.176.111
  • 在客户端挂载NFS文件系统
1
2
3
mount -t nfs 服务器的IP地址:服务端的地址目录 本地挂载地址目录

[root@client ~]# mount -t nfs 192.168.176.222:/123 /nfs
  • 在客户端设置开机自动挂在NFS

首先编辑/etc/fstab

添加内容如下

1
2
3
服务器的IP地址:服务端的地址目录 本地挂载地址目录 nfs defaults,_netdev 0 0

192.168.176.222:/123 /nfs nfs defaults,_netdev 0 0
  • 客户端挂载时可以使用的特殊选项:
    • rsize:其值是从服务器读取的字节数(缓冲)。默认为1024。若使用比较高的值,如8192,可以提高传输速度
    • wsize:其值是写入到服务器的字节数(缓冲)。默认为1024。若使用比较高的值,如8192,可以提高传输速度
1
2
3
4
5
exportfs	维护exports文件导出的文件系统表的专用工具
-a 输出在/etc/exports文件中所设置的所有目录
-r 重新读取/etc/exports文件中的设置,并使其立即生效,无需重启服务
-u 停止输出某一目录
-v 在输出目录时将目录显示到屏幕上

检查输出目录所使的选项:

​ 在配置文件/etc/exports中,即使在命令行中只设置了一两个选项,但在真正输出目录时,实际上还带有很多默认的选项。通过查看/var/lib/nfs/etab文件,可以看到具体使用了何选项

NFS配置演示

服务端地址为:192.168.176.222

客服端地址为:192.168.176.111

服务端:

1
2
3
4
5
6
7
8
9
10
[root@server ~]# yum install nfs* rpcbind -y
[root@server ~]# systemctl restart nfs rpcbind
[root@server ~]# mkdir /123
[root@server ~]# vim /etc/exports
[root@server ~]# cat /etc/exports
/123 192.168.176.111(rw)
[root@server ~]# systemctl restart nfs rpcbind
#服务端已经配置完成,转到客户端之前请确认服务端以及客户端SELinux以及防火墙关闭
[root@server ~]# systemctl stop firewalld
[root@server ~]# setenforce 0

客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@client ~]# systemctl stop firewalld
[root@client ~]# setenforce 0
[root@client ~]# showmount -e 192.168.176.222
Export list for 192.168.176.222:
/123 192.168.176.111
[root@client ~]# mkdir /nfs
[root@client ~]# mount -t nfs 192.168.176.222:/123 /nfs
[root@client ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 17G 1.1G 16G 6% /
devtmpfs devtmpfs 982M 0 982M 0% /dev
tmpfs tmpfs 993M 0 993M 0% /dev/shm
tmpfs tmpfs 993M 8.7M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.3G 4.3G 0 100% /mnt
/dev/sda1 xfs 1014M 125M 890M 13% /boot
tmpfs tmpfs 199M 0 199M 0% /run/user/0
192.168.176.222:/123 nfs4 17G 1.3G 16G 8% /nfs
[root@client /]# cd /nfs
[root@client nfs]# ls
[root@client nfs]# mkdir abc
mkdir: 无法创建目录"abc": 权限不够

# 此时我们要修改服务端的文件权限
[root@client nfs]# ssh root@192.168.176.222
Last login: Tue Jun 25 15:49:36 2019 from 192.168.176.111
[root@server ~]#
[root@server ~]# cd /
[root@server /]# ls -ld 123
drwxr-xr-x. 2 root root 6 6月 25 16:45 123
[root@server /]# chmod 777 123
[root@server /]# exit
登出
Connection to 192.168.176.222 closed.
[root@client nfs]# mkdir abc
[root@client nfs]# ls -l
drwxr-xr-x. 2 nfsnobody nfsnobody 6 6月 25 17:21 abc

## 或者我们修改服务端的文件的所属者
[root@client nfs]# ssh root@192.168.176.222
Last login: Tue Jun 25 17:25:35 2019 from 192.168.176.111
[root@server ~]# cd /
[root@server /]# ls -ld 123
drwxrwxrwx. 3 root root 17 6月 25 17:26 123
[root@server /]# chmod 755 123
[root@server /]# ls -ld 123
drwxr-xr-x. 3 root root 17 6月 25 17:26 123
[root@server /]# chown nfsnobody /123
[root@server /]# ls -ld 123
drwxr-xr-x. 3 nfsnobody root 17 6月 25 17:26 123
[root@server /]# exit
登出
Connection to 192.168.176.222 closed.
[root@client nfs]# rm -rf abc
[root@client nfs]# mkdir eerefsf
[root@client nfs]# ls
eerefsf

作业

1.手动搭建一个nfs服务器

  • 开放/nfs/shared目录,供所有用户查阅资料
1
2
[root@server /]# mkdir /nfs/shared
[root@server /]# chmod -R 777 /nfs/shared
  • 开放/nfs/upload目录为192.168.176.0/24(或者自己主机网段)网段的数据上传目录,并将所有用户及所属的用户组都映射为nfs-upload,其UID与GID均为300

2.通过脚本搭建nfs并在客户端上挂载

samba服务

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

samba简介

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBIOS over TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。

samba监听端口有:

TCP:139 445

UDP:137· 138

tcp端口相对应的服务是smbd服务,其作用是提供对服务器中文件、打印资源的共享访问。
udp端口相对应的服务是nmbd服务,其作用是提供基于NetBIOS主机名称的解析。

samba进程:

进程 对应
nmbd 对应netbios
smbd 对应cifs协议
winbindd + ldap 对应Windows AD活动目录

samba用户:

帐号 密码
都是系统用户 /etc/passwd Samba服务自有密码文件 通过smbpasswd -a USERNAME命令设置

smbpasswd命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-a		添加系统用户为samba用户并为其设置密码
-d 禁用用户账号
-e 启动用户账号
-x 删除用户账号


[root@server ~]# yum -y install samba*
[root@server ~]# useradd 123
[root@server ~]# smbpasswd -a 123
New SMB password:
Retype new SMB password:
Added user 123.
[root@server ~]# smbpasswd -d 123
Disabled user 123.
[root@server ~]# smbpasswd -e 123
Enabled user 123.
[root@server ~]# smbpasswd -x 123
Deleted user 123.

Samba安全级别:
Samba服务器的安全级别有三个,分别是user,server,domain

安全级别 作用
user 基于本地的验证
server 由另一台指定的服务器对用户身份进行认证
domain 由域控进行身份验证

以前的samba版本支持的安全级别有四个,分别是share,user,server,domain
share是用来设置匿名访问的,但现在的版本已经不支持share了,但是还是可以实现匿名访问的(share在7版本中已经不支持)
只是配置方式变了

samba配置文件:

  • /etc/samba/smb.conf(主配置文件)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[root@server samba]# ls
lmhosts smb.conf smb.conf.example
[root@server samba]# vim smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global] # 全局配置,此处的设置项对整个samba服务器都有效
workgroup = SAMBA # 表示设置工作组名称
security = user # 表示设置安全级别,其值可为user、server、domain
passdb backend = tdbsam # 表示设置共享帐户文件的类型,其值可为tdbsam(tdb数据库文件)、ldapsam(LDAP目录认证)、smbpasswd(兼容旧版本samba密码文件)
printing = cups
printcap name = cups
load printers = yes
cups options = raw

[homes] # 宿主目录共享设置,此处用来设置Linux用户的默认共享,对应用户的宿主目录。当用户访问服务器中与自己用户名同名的共享目录时,通过验证后将会自动映射到该用户的宿主目录中
comment = Home Directories # 表示设置对应共享目录的注释,说明信息,即文件共享名
valid users = %S, %D%w%S # 设置可以访问的用户和组,例如 valid users = root,@root
browseable = No # 表示设置共享是否可见
read only = No
inherit acls = Yes

[printers] # 打印共享设置
comment = All Printers # 表示设置对应共享目录的注释,说明信息,即文件共享名
path = /var/tmp # 表示共享目录的路径
printable = Yes # 表示设置是否为打印机
create mask = 0600
browseable = No # 表示设置共享是否可见

[print$]
comment = Printer Drivers # 表示设置对应共享目录的注释,说明信息,即文件共享名
path = /var/lib/samba/drivers # 表示共享目录的路径
write list = root # 表示设置允许写的用户和组,组要用@表示,例如 write list = root,@root
create mask = 0664
directory mask = 0775


# server string 表示描述samba服务器
# writable 表示设置目录是否可写
# guest ok 表示设置是否所有人均可访问共享目录
# public 表示设置是否允许匿名用户访问
# hosts deny 设置拒绝哪台主机访问,例如 hosts deny = 192.168.176.111
# hosts allow 设置允许哪台主机访问,例如 hosts allow = 192.168.176.222
# printable 表示设置是否为打印机

常用配置文件参数:

可使用testparm命令检测是否有语法错误

1
2
3
4
5
6
7
8
9
10
[root@server ~]# testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[printers]"
Processing section "[print$]"
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

samba访问

服务器地址:192.168.176.222

客户端地址:192.168.176.111

服务端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@server ~]# yum install samba* -y
[root@server ~]# cd /etc/samba/
[root@server samba]# ls
lmhosts smb.conf smb.conf.example
[root@server ~]# cd /
[root@server /]# mkdir samba
[root@server /]# vim /etc/samba/smb.conf
[root@server /]# tail -n 5 /etc/samba/smb.conf

[share]
path = /samba
browseable = Yes
valid users = 123
[root@server /]# systemctl restart smb nmb
[root@server /]# systemctl stop firewalld
[root@server /]# setenforce 0

客户端:

  • 交互式访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@client ~]# yum install -y samba-client
[root@client ~]# smbclient -L 192.168.176.222 -U 123
Enter SAMBA\123's password:123321
Domain=[SEVER] OS=[Windows 6.1] Server=[Samba 4.6.2]

Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
IPC$ IPC IPC Service (Samba 4.6.2)
123 Disk Home Directories
Domain=[SEVER] OS=[Windows 6.1] Server=[Samba 4.6.2]

Server Comment
--------- -------

Workgroup Master
--------- -------
SAMBA SEVER
# 交互式访问共享资源
[root@client ~]# smbclient //192.168.176.222/123 -U 123
Enter SAMBA\123's password:
Domain=[SEVER] OS=[Windows 6.1] Server=[Samba 4.6.2]
smb: \> ls
. D 0 Wed Jun 26 10:17:59 2019
.. D 0 Wed Jun 26 10:17:59 2019
.bash_logout H 18 Thu Aug 3 05:11:00 2017
.bash_profile H 193 Thu Aug 3 05:11:00 2017
.bashrc H 231 Thu Aug 3 05:11:00 2017

17811456 blocks of size 1024. 16485268 blocks available
smb: \>
# 可用?来查看当前状态可用哪些命令
  • 挂载方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@client ~]# mount -t cifs //192.168.176.222/share /media -o username=123,password=123321
[root@client ~]# vim /etc/fstab
[root@client ~]# tail -n 1 /etc/fstab
//192.168.176.222/share /media cifs defaults,username=123,password=123321 0 0
[root@client ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 17G 3.8G 14G 22% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 0 993M 0% /dev/shm
tmpfs tmpfs 993M 9.1M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sr0 iso9660 3.8G 3.8G 0 100% /mnt/cdrom
/dev/sda1 xfs 1014M 161M 854M 16% /boot
tmpfs tmpfs 199M 12K 199M 1% /run/user/42
tmpfs tmpfs 199M 0 199M 0% /run/user/0
//192.168.176.222/share cifs 17G 3.9G 14G 23% /media

示例

  • 用户映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
## 服务端
[root@client ~]# cd /etc/samba/
[root@client samba]# vim smbusers
[root@client samba]# cat smbusers
123 = haha
[root@client samba]# vim /etc/samba/smb.conf
[global]
workgroup = SAMBA
security = user
username map = /etc/samba/smbusers # 找到global,将此行添加上去

[root@client samba]# cd /
[root@client /]# mkdir camba
[root@client /]# vim /etc/samba/smb.conf
[root@client /]# tail -n 3 /etc/samba/smb.conf
path = /samba
browseable = Yes
valid users = 123

[root@client samba]# systemctl restart smb nmb

## 客户端
[root@client media]# smbclient -L 192.168.107.144 -U haha
Enter SAMBA\haha's password:
Domain=[SEVER] OS=[Windows 6.1] Server=[Samba 4.6.2]

Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
share Disk
IPC$ IPC IPC Service (Samba 4.6.2)
123 Disk Home Directories
Domain=[SEVER] OS=[Windows 6.1] Server=[Samba 4.6.2]

Server Comment
--------- -------

Workgroup Master
--------- -------
SAMBA
[root@client media]# vim /etc/fstab
[root@client media]# tail -n 1 /etc/fstab
//192.168.107.144/share /media cifs defaults,useradd=haha,password=123321 0 0
[root@client media]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 17G 3.8G 14G 22% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 0 993M 0% /dev/shm
tmpfs tmpfs 993M 9.1M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sr0 iso9660 3.8G 3.8G 0 100% /mnt/cdrom
/dev/sda1 xfs 1014M 161M 854M 16% /boot
tmpfs tmpfs 199M 12K 199M 1% /run/user/42
tmpfs tmpfs 199M 0 199M 0% /run/user/0
//192.168.107.144/share cifs 17G 3.9G 14G 23% /media
  • 匿名访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
## 服务端
[root@server ~]# cd /etc/samba/
[root@server samba]# vim smbusers
[root@server samba]# cat smbusers
123 = haha
[root@server samba]# vim /etc/samba/smb.conf
[global]
workgroup = SAMBA
security = user
map to guest = Bad User # 找到global,将此行添加上去
# 加入下列6行
[share]
path = /samba
browseable = Yes
guest ok = yes
public = yes
writable = yes

[root@server samba]# systemctl restart smb nmb
[root@server samba]# chmod 777 /samba

## 客户端
[root@client media]# vim /etc/fstab
[root@client media]# tail -n 1 /etc/fstab
//192.168.107.144/share /media cifs defaults,username='BadUser' 0 0
[root@client media]# mount -a
\[root@client media]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 17G 3.8G 14G 22% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 0 993M 0% /dev/shm
tmpfs tmpfs 993M 9.1M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sr0 iso9660 3.8G 3.8G 0 100% /mnt/cdrom
/dev/sda1 xfs 1014M 161M 854M 16% /boot
tmpfs tmpfs 199M 12K 199M 1% /run/user/42
tmpfs tmpfs 199M 0 199M 0% /run/user/0
//192.168.107.144/share cifs 17G 3.9G 14G 23% /media

练习

1.搭建匿名用户共享服务器
2.搭建用户认证共享服务器

要求:
1.不论是匿名用户还是用户认证共享,均要在客户机验证结果
2.用户认证共享需要映射系统用户为一个虚拟用户

FTP服务

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

FTP简介

网络文件共享服务主流的主要有三种,分别是ftpnfssamba

FTP:文件传输协议(英文:File Transfer Protocol,缩写:FTP是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议应用层。文件传送(file transfer)和文件访问(file access)之间的区别在于:前者由FTP提供,后者由如NFS等应用系统提供。

FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而不需要进一步处理,就像MIME或Unicode一样。但是,FTP有着极高的延时,这意味着,从开始请求到第一次接收需求数据之间的时间,会非常长;并且不时的必须执行一些冗长的登录进程。

在使用FTP时候,用户经常会遇到两种概念:

  • 上传

将自己电脑上的文件拷贝到远端主机上

  • 下载

从远端主机拷贝文件到自己的电脑上面

FTP架构

FTP工作于应用层,它监听tcp的21号端口,是一种c/s架构的应用程序。其有多种客户端和服务端的应用程序

  • 客户端工具

    • ftp
    • liftp,lftpget
    • wget,curl
    • filezilla
    • gftp(linux GUI)
    • 商业软件(flashftp,cuteftp)
  • 服务端软件

    • wu-ftpd
    • proftpd(提供web接口的一种ftp服务端程序)
    • pureftp
    • vsftpd(Very Secure)
    • ServU(windows平台的一种强大ftp服务端程序)

FTP数据连接模式

ftp有2种数据连接模式:

  • 命令连接:是指文件管理类命令,始终在线的持久性连接,直到用户退出登录为止
  • 数据连接:是指数据传输,按需创建及关闭的连接
    • 数据传输格式:
      • 文件传输
      • 二进制传输
    • 数据传输模式:
      • 主动模式:由服务器端创建数据连接
      • 被动模式:由客户端创建数据连接
  • 主动模式下

    • 命令连接:

    客户端以大于1023的随机端口去连接ftp服务端的21号端口

    1024 –> 21 建立命令连接

    • 数据连接:

    服务端以自己的20号端口去连接客户端建立命令连接时的端口+1的端口号

    20 –> 1025 建立数据连接

  • 被动模式下

    • 命令连接

    客户端以一个随机端口(1110)来连接服务器端的21号端口,之后服务器会返回一个告知客户端连接服务端的哪个端口号

    1110 –> 21 (告知客户端连接哪一个端口)

    • 数据连接

    客户端以创建命令连接的端口+1 (1110 + 1)的端口号去连接服务器端通过命令连接告知自己的一个随机端口号来创建数据连接

    1111 –> (服务端告知自己的端口)

注意:

主动模式有个弊端,因为客户端的端口是随机的,如果客户端开了防火墙,那么服务器端去连接客户端创建数据连接时就可能会被拒绝。

用户认证

FTP的用户主要有三种:

  • 虚拟用户:仅用于访问某特定服务中的资源
  • 系统用户:可以登录系统的真实用户
  • 匿名用户

vsftpd

vsftpd安装

1
2
3
4
5
6
[root@client111 ~]# yum install -y vsftpd
........
已安装:
vsftpd.x86_64 0:3.0.2-22.el7

完毕!

vsftpd配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 配置文件目录
[root@client111 ~]# ls -ld /etc/vsftpd
drwxr-xr-x. 2 root root 88 6月 27 15:45 /etc/vsftpd

# 主配置文件
[root@client111 ~]# ls -l /etc/vsftpd/vsftpd.conf
-rw-------. 1 root root 5030 8月 3 2017 /etc/vsftpd/vsftpd.conf

# vsftpd用户认证配置文件
[root@client111 ~]# ls -l /etc/pam.d/vsftpd
-rw-r--r--. 1 root root 335 8月 3 2017 /etc/pam.d/vsftpd


# 匿名用户(映射为ftp用户)的共享资源位置是/var/ftp
# 系统用户通过ftp访问的资源位置为用户的家目录
# 虚拟用户通过ftp访问的资源位置为给虚拟用户指定的映射成为的系统用户的家目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
anonymous_enable=YES				启用匿名用户登陆
anon_upload_enable=YES 允许匿名用户上传
anon_mkdir_write_enable=YES 允许匿名用户创建目录,但是不能删除
anon_other_write_enable=YES 允许匿名用户创建和删除目录
local_enable=YES 启用本地用户登陆
write_enable=YES 允许本地用户有写权限
local_umask=022 通过FTP上传文件的默认遮罩码
chroot_local_user=YES 禁锢所有FTP本地用户只能在其家目录中
chroot_list_enable=YES 开启禁锢文件列表;需要与chroot_list_file参数一起使用
chroot_list_file=/etc/vsftp/chroot_list 指定禁锢列表文件路径;在此文件里面的用户将被禁锢在其家目录中
allow_writeable_chroot=YES 允许被禁锢的用户家目录有写权限
xferlog_enable=YES 是否启用传输日志,记录FTP传输过程
xferlog_std_format=YES 传输日志是否使用标准格式
xferlog_file=/var/log/xferlog 指定传输日志存储的位置
chown_uploads=YES 是否启用改变上传文件属性的功能
chown_username=whoever 指定要将上传的文件的属主改为哪个用户,此用户必须在系统中存在
pam_service_name=vsftpd 指定vsftp使用/etc/pam.d下的哪个pam配置文件进行用户认证
userlist_enable=YES 是否启用控制用户登陆的列表文件:默认为/etc/vsftpd/user_list文件
userlist_deny=YES 是否拒绝userlist指定的列表文件中存在的用户登陆FTP
max_cients=`#` 最大并发连接数
max_per_ip=`#` 每个IP可同时发起的并发请求数
anon_max_rate 匿名用户的最大传输速率,单位是‘字节/秒’
local_max_rate 本地用户的最大传输速率,单位是‘字节/秒’
dirmessage_enable=YES 启用某目录下的.message描述信息
#假设有一个目录,在此目录下面创建一个名为.message的文件,在此文件内写入一些描述信息之后切换出目录,目录会自动显示.message文件中的内容

message_file 设置访问一个目录时获得的目录信息文件的文件名,默认是.message
idle_session_timeout=600 设置默认的断开不活跃session的时间
data_connection_timeout=120 设置数据传输超时时间
ftpd_banner="Welcome to chenlf FTP service." 定制欢迎信息,登陆FTP时自动显示

vsftpd虚拟用户配置

  • 虚拟用户的配置:

    • 所有的虚拟用户会被统一映射为一个指定的系统账号,访问的共享位置即为此系统账号的家目录
    • 各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
    • 虚拟用户账号的存储方式:
      • 文件:编辑文件,此文件需要为编码hash格式
        • 文件奇数行为用户
        • 偶数行为密码
      • 关系型数据库的表中:
        • 通过即时查询数据库完成用户认证
        • mysql库:pam要依赖于pam_mysql软件,可以通过epel源yum安装

vsftpd虚拟用户的配置步骤:

  • 安装依赖的程序
1
2
3
4
5
6
7
8
9
10
11
12
[root@client111 ~]# cd /etc/yum.repos.d/
[root@client111 yum.repos.d]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@client111 yum.repos.d]# vim CentOS7-Base-163.repo
[root@client111 yum.repos.d]# tail -n 5 CentOS7-Base-163.repo
name=CentOS-$releasever - Plus - 163.com
baseurl=http://mirrors.163.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=1 # 此处将0改为1
gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7
[root@client111 yum.repos.d]# yum clean all
[root@client111 yum.repos.d]# yum install -y epel-release
[root@client111 yum.repos.d]# yum install -y vsftpd
  • 创建文本格式的用户名以及密码
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@client111 yum.repos.d]# cd /etc/vsftpd/
[root@client111 vsftpd]# vim vu.list
[root@client111 vsftpd]# cat vu.list
123
123321
abc
123321
# 用户和密码一一对应,前面为账户,后面为密码
[root@client111 vsftpd]# id 123
id: 123: no such user
[root@client111 vsftpd]# id abc
id: abc: no such user
# 账户在系统中没有创建过
  • 安装db4工具
1
[root@client111 vsftpd]# yum install -y db4*
  • 使用db4工具将刚才编辑的vu.list转换成数据库文件(vu.db)
1
2
3
4
5
6
7
-T 表示转换		-t 表示加密方式使用hash算法加密
[root@client111 vsftpd]# db_load -T -t hash -f /etc/vsftpd/vu.list /etc/vsftpd/vu.db
[root@client111 vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh vu.db vu.list
[root@client111 vsftpd]# file vu.*
vu.db: Berkeley DB (Hash, version 9, native byte-order)
vu.list: ASCII text
  • 为防止数据泄露,将文件权限设置为600
1
2
3
4
[root@client111 vsftpd]# chmod 600 vu.*
[root@client111 vsftpd]# ls -l vu.*
-rw-------. 1 root root 12288 6月 27 17:16 vu.db
-rw-------. 1 root root 22 6月 27 17:08 vu.list
  • 添加虚拟用户的映射账号,创建ftp的根目录
1
2
3
4
5
6
7
[root@client111 vsftpd]# useradd -d /file -s /sbin/nologin vftp
[root@client111 vsftpd]# cd /
[root@client111 /]# ls -ld file
drwx------. 3 vftp vftp 78 6月 27 17:32 file
[root@client111 /]# chmod 755 file
[root@client111 /]# ls -ld file
drwxr-xr-x. 3 vftp vftp 78 6月 27 17:32 file
  • 备份vsftpd用户认证配置文件
1
2
3
[root@client111 pam.d]# cp /etc/pam.d/vsftpd{,.bak}
[root@client111 pam.d]# ls vsftpd*
vsftpd vsftpd.bak
  • 为虚拟用户建立pam认证
1
2
3
4
5
[root@client111 pam.d]# vim /etc/pam.d/vsftpd
[root@client111 pam.d]# cat /etc/pam.d/vsftpd
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vu
account required pam_userdb.so db=/etc/vsftpd/vu
  • 修改vsftpd配置文件,添加虚拟用户支持
1
2
3
4
[root@client111 pam.d]# vim /etc/vsftpd/vsftpd.conf
[root@client111 pam.d]# tail -n 2 /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=vftp
  • 为不同的虚拟用户建立独立的配置文件
1
2
3
4
[root@client111 pam.d]# vim /etc/vsftpd/vsftpd.conf
[root@client111 pam.d]# tail -n 2 /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir
allow_writeable_chroot=YES

上述配置配置完成之后,转到/etc/vsftpd/vusers_dir目录中为每个虚拟用户分别建立配置文件

1
2
3
4
5
[root@client111 pam.d]# mkdir /etc/vsftpd/vusers_dir
[root@client111 pam.d]# cd /etc/vsftpd/vusers_dir
[root@client111 vusers_dir]# ls
[root@client111 vusers_dir]# touch 123
[root@client111 vusers_dir]# touch abc
  • 设置虚拟用户123能上传和下载,而abc可以上传文件和创建目录、以及下载。
1
2
3
4
5
6
7
[root@client111 vusers_dir]# vim 123
[root@client111 vusers_dir]# vim abc
[root@client111 vusers_dir]# cat 123
anon_upload_enable=YES
[root@client111 vusers_dir]# cat abc
anon_upload_enable=YES
anon_mkdir_write_enable=YES
  • 重启服务
1
[root@client111 vusers_dir]# systemctl restart vsftpd

此时用另外一台主机去访问

  • 安装lftp
1
[root@server222 ~]# yum install -y lftp
  • 查看lftp的帮助用法
1
2
3
4
5
6
7
8
9
10
11
12
[root@server222 ~]# lftp --help
用法: lftp [OPTS] <site>
`lftp' 是在 rc 文件执行后 lftp 执行的第一个命令
-f <file> 执行文件中的命令后退出
-c <cmd> 执行命令后退出
--help 显示帮助信息后退出
--version 显示 lftp 版本后退出
其他的选项同 `open' 命令
-e <cmd> 在选择后执行命令
-u <user>[,<pass>] 使用指定的用户名/口令进行验证
-p <port> 连接指定的端口
<site> 主机名, URL 或书签的名字
  • 连接192.168.176.111中的abc用户
1
2
3
4
5
6
[root@server222 ~]# lftp -u abc,123321 192.168.176.111
lftp abc@192.168.176.111:~> ls
lftp abc@192.168.176.111:/> mkdir abc
mkdir 成功, 建立 `abc'
lftp abc@192.168.176.111:/> ls
drwx------ 2 1001 1001 6 Jun 27 14:28 abc
  • 可用help或者?来查看帮助命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
lftp abc@192.168.176.111:/> help
!<shell-command> (commands)
alias [<name> [<value>]] attach [PID]
bookmark [SUBCMD] cache [SUBCMD]
cat [-b] <files> cd <rdir>
chmod [OPTS] mode file... close [-a]
[re]cls [opts] [path/][pattern] debug [<level>|off] [-o <file>]
du [options] <dirs> exit [<code>|bg]
get [OPTS] <rfile> [-o <lfile>] glob [OPTS] <cmd> <args>
help [<cmd>] history -w file|-r file|-c|-l [cnt]
jobs [-v] [<job_no...>] kill all|<job_no>
lcd <ldir> lftp [OPTS] <site>
ln [-s] <file1> <file2> ls [<args>]
mget [OPTS] <files> mirror [OPTS] [remote [local]]
mkdir [-p] <dirs> module name [args]
more <files> mput [OPTS] <files>
mrm <files> mv <file1> <file2>
[re]nlist [<args>] open [OPTS] <site>
pget [OPTS] <rfile> [-o <lfile>] put [OPTS] <lfile> [-o <rfile>]
pwd [-p] queue [OPTS] [<cmd>]
quote <cmd> repeat [OPTS] [delay] [command]
rm [-r] [-f] <files> rmdir [-f] <dirs>
scache [<session_no>] set [OPT] [<var> [<val>]]
site <site-cmd> source <file>
torrent [-O <dir>] <file|URL>... user <user|URL> [<pass>]
wait [<jobno>] zcat <files>
zmore <files>
  • 进入192.168.176.111
1
2
3
4
5
6
[root@client111 /]# cd file/
[root@client111 file]# ls
abc
[root@client111 file]# echo "1234567890" > abc.txt
[root@client111 file]# ls
abc abc.txt
  • 进入192.168.176.222
1
2
3
4
[root@server222 ~]# lftp -u abc,123321 192.168.176.111
lftp abc@192.168.176.111:~> ls
drwx------ 3 1001 1001 21 Jun 27 14:34 abc
-rw-r--r-- 1 0 0 11 Jun 27 14:39 abc.txt
  • 下载abc.txt
1
2
3
4
5
6
7
8
9
10
11
[root@server222 ~]# lftp -u abc,123321 192.168.176.111
lftp abc@192.168.176.111:~> ls
drwx------ 3 1001 1001 21 Jun 27 14:34 abc
-rw-r--r-- 1 0 0 11 Jun 27 14:39 abc.txt
lftp abc@192.168.176.111:/> get abc.txt -o /opt
11 bytes transferred
lftp abc@192.168.176.111:/> exit
[root@server222 ~]# ll /opt
总用量 4
-rw-r--r--. 1 root root 11 6月 27 22:39 abc.txt
drwxr-xr-x. 2 root root 6 3月 26 2015 rh

练习

1.安装vsftpd
2.配置匿名用户ftp
3.配置虚拟用户ftp
4.配置系统用户ftp
5.写博客,要写明ftp的使用场景以及如何安装与配置

要求:
1.安装并配置完成后要使用ftp客户端工具登录验证

openssh

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

openssh

[TOC]

使用ssh访问远程命令行

openssh 简介

OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。

常见的远程登陆工具有:

  • telnet
  • ssh
  • dropbear
1
2
3
4
5
6
7
8
9
10
telnet 远程登陆协议:23/TCP
认证明文
数据传输明文

ssh 全称:secure shell 是应用层协议,22/tcp
通过认证过程是加密的,主机认证
用户认证过程加密
数据传输过程加密

dropbear 为嵌入式系统专用的ssh服务器端和客户端工具

ssh版本

openssh有两个版本,分别为v1和v2,其特点如下:

1
2
3
v1版本:基于crc-32做mac,但没有其防范中间人的攻击
# 中间人含义解释:在主机以及网关中间,告诉主机我是网关,却又告诉网关我是主机
v2版本:双方主机协议选择安全的mac方式。基于DH算法做密钥交换,基于RSA或者DSA算法实现身份认证

ssh认证方式

openssh有两种认证方式,分别是:

  • 基于口令认证
  • 基于密钥认证

openssh的工作模式

openssh是基于C/S架构工作的

1
2
3
4
C/S架构
# Client/Server架构,即客户端/服务器架构。
B/S结构
# 即Browser/Server (浏览器/服务器) 结构
1
2
3
4
5
服务器端   sshd  配置文件在/etc/ssh/sshd_config
客户端 ssh 配置文件在/etc/ssh/ssh_config
ssh-keygen 密钥生成器
ssh-copy-id 将公钥传输至远程服务器
scp 跨主机安全复制工具

secure shell 示例

1
2
3
4
5
6
7
8
9
[root@clirnt ~]# ssh root@192.168.107.144
The authenticity of host '192.168.107.144 (192.168.107.144)' can't be established.
ECDSA key fingerprint is SHA256:ckD0Gi2156g1NjAR4mGFYX4gYlcI4IH4VWYHuz9bDSg.
ECDSA key fingerprint is MD5:1b:f5:48:ce:e5:18:d2:fe:be:55:46:69:d6:67:06:4c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.107.144' (ECDSA) to the list of known hosts.
root@192.168.107.144's password:
Last login: Mon May 20 03:21:23 2019 from 192.168.107.1
[root@server ~]#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//以当前用户身份创建远程交互式shell,然后在结束时使用exit命令返回到之前的shell
[root@clirnt ~]# ssh 192.168.107.144
root@192.168.107.144's password:
Last login: Mon May 20 03:23:00 2019 from 192.168.107.140
[root@server ~]# exit
登出
Connection to 192.168.107.144 closed.

//以远程用户身份(remoteuser)在远程主机(remotehost)上通过将输出返回到本地显示器的方式来执行单一命令
[root@clirnt ~]# ssh zhou@192.168.107.144 '/usr/bin/cat /etc/hostname'
zhou@192.168.107.144's password:
144

/w命令可以显示当前登录到计算机的用户列表。这对于显示哪些用户使用ssh从哪些远程位置进行了登录以及执行了何种操作等内容特别有用
[root@server ~]# w
03:42:04 up 3:08, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root :0 :0 00:34 ?xdm? 35.24s 0.13s /usr/libexec/gn
root pts/0 192.168.107.1 03:21 4.00s 0.03s 0.00s w
zhou pts/1 192.168.107.140 03:42 2.00s 0.02s 0.02s -bash

ssh主机密钥

​ ssh通过公钥加密的方式保持通信的安全,当某一ssh客户端连接到ssh服务器时,在该客户端登录之前,服务器会向其发送公钥副本。这可用于为通信渠道设置安全加密,并可验证客户端的服务器。

​ 当用户第一次使用ssh连接到特定服务器时,ssh命令可在用户的/.ssh/known_hosts文件中存储该服务器的公钥。在此之后每当用户进行连接时,客户端都会通过对比/.ssh/known_hosts文件中的服务器条目和服务器发送的公钥,确保从服务器获得相同的公钥。如果公钥不匹配,客户端会假定网络通信已遭劫持或服务器已被入侵,并且中断连接。

​ 这意味着,如果服务器的公钥发生更改(由于硬盘出现故障导致公钥丢失,或者出于某些正当理由替换公钥),用户则需要更新其~/.ssh/known_hosts文件并删除旧的条目才能够进行登录。

1
2
3
4
5
6
7
8
9
10
//主机ID存储在本地客户端系统上的 /root/.ssh/known_hosts 中
[root@clirnt ~]# cat .ssh/known_hosts
192.168.107.144 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNpzCsuRZmBI8gq7WVjQNzuVlNqukUQj9i62JhdGmBK9Tm38P+MXMJRfeRz2q2KpP5Klbdiwysxei6byi3KXCC8=
192.168.107.140 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBB1oHAfCZcxVYWUygQ2PaN2NiVKs2+W/pT4xXUKXDK2etvkj1qEETkZGgVo4kTxQBmujhfCcdHl7/vfL6qVR7P4=

//主机密钥存储在SSH服务器上的 /etc/ssh/ssh_host_key* 中
[root@server ~]# ls /etc/ssh/*key*
/etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key.pub

配置基于ssh密钥的身份验证

​ 用户可通过使用公钥身份验证进行ssh登录身份验证。ssh允许用户使用私钥-公钥方案进行身份验证。这意味着将生成私钥和公钥这两个密钥。私钥文件用作身份验证凭据,像密码一样,必须妥善保管。公钥复制到用户希望登录的系统,用于验证私钥。公钥并不需要保密。拥有公钥的ssh服务器可以发布仅持有您私钥的系统才可解答的问题。因此,可以根据所持有的密钥进行验证。如此一来,就不必在每次访问系统时键入密码,但安全性仍能得到保证。

1
使用ssh-keygen命令生成密码。将会生成私钥~/.ssh/id_rsa和公钥~/.ssh/id_rsa.pub

注意:

生成密钥时,系统将提供指定密码的选项,在访问私钥时必须提供该密码。如果私钥被偷,除颁发者之外的其他任何人很难使用该私钥,因为已使用密码对其进行保护。这样,在攻击者破解并使用私钥前,会有足够的时间生成新的密钥对并删除所有涉及旧密钥的内容。

1
生成ssh密钥后,密钥将默认存储在家目录下的.ssh/目录中。私钥和公钥的权限就分别为600和644。.ssh目录权限必须是700

在可以使用基于密钥的身份验证前,需要将公钥复制到目标系统上。可以使用ssh-copy-id命令完成这一操作

1
2
3
4
5
6
7
8
9
10
[root@clirnt ~]# ssh-copy-id root@192.168.107.144
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.107.144's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'root@192.168.107.144'"
and check to make sure that only the key(s) you wanted were added.
1
在通过ssh-copy-id将密钥复制到另一系统时,它默认复制~/.ssh/id_rsa.pub文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//SSH密钥演示
//使用 ssh-keygen 创建公钥-私钥对
[root@clirnt ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:L382dyk3r5TizdnGKXJfikf3buKfzCbnTXe5Ufz5vqM root@140
The key's randomart image is:
+---[RSA 2048]----+
| |
| |
| |
| . |
| S o|
| . ..*|
| . . ..o*X|
| o o+@*&/|
| .o=E^^&|
+----[SHA256]-----+

//使用 ssh-copy-id 将公钥复制到远程系统上的正确位置
[root@clirnt ~]# ls .ssh/
id_rsa id_rsa.pub known_hosts
[root@clirnt ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.107.144
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.107.144's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'root@192.168.107.144'"
and check to make sure that only the key(s) you wanted were added.

//使用 ssh 命令无命令登录远程主机
[root@clirnt ~]# ssh root@192.168.107.144
Last login: Mon May 20 06:30:57 2019 from 192.168.107.1

//使用 scp 命令传送文件到远程主机
[root@clirnt ~]# scp 1 root@192.168.107.144:/root
1 100% 18 15.4KB/s 00:00
[root@clirnt ~]# ssh root@192.168.107.144
Last login: Mon May 20 07:06:44 2019 from 192.168.107.140
[root@server ~]# ls
1 initial-setup-ks.cfg 模板 图片 下载 桌面
anaconda-ks.cfg 公共 视频 文档 音乐

//使用 scp 命令从远程主机上下载文件到本地
[root@clirnt ~]# ls
1 initial-setup-ks.cfg 公共 视频 文档 音乐
anaconda-ks.cfg root@192.168.107.144 模板 图片 下载 桌面
[root@clirnt ~]# rm -f 1
[root@clirnt ~]# ls
anaconda-ks.cfg root@192.168.107.144 模板 图片 下载 桌面
initial-setup-ks.cfg 公共 视频 文档 音乐
[root@clirnt ~]# scp root@192.168.107.144:/root/1 /root
1 100% 18 22.3KB/s 00:00
[root@clirnt ~]# ls
1 initial-setup-ks.cfg 公共 视频 文档 音乐
anaconda-ks.cfg root@192.168.107.144 模板 图片 下载 桌面

//scp命令常用选项
-r //递归复制
-p //保持权限
-P //端口
-q //静默模式
-a //全部复制

自定义ssh服务配置

虽然OpenSSH服务器通常无需修改,但会提供其他安全措施,可以在配置文件/etc/ssh/sshd_config中修改OpenSSH服务器的各个方面。

1
2
3
PermitRootLogin {yes|no}    //是否允许root用户远程登录系统
PermitRootLogin without-password //仅允许root用户基于密钥方式远程登录
PasswordAuthentication {yes|no} //是否启用密码身份验证,默认开启

ssh安全注意事项

  • 密码应该经常换且足够复杂
1
2
3
4
5
[root@clirnt ~]#  tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 |xargs   //生成30位的密码
LYH9cbirdT6E_hbColMFjZNf9Kd6If

[root@clirnt ~]# openssl rand 20 -base64
Di9ry+dyV40xVvBHirsc3XpBOzg= //生成20位随机密码
  • 使用非默认端口
  • 限制登录客户端地址
  • 仅监听特定的IP地址
  • 禁止管理员直接登录
  • 仅允许有限制用户登录
    • AllowUsers
    • AllowGroups
  • 使用基于密钥的认证
  • 禁止使用空密码
  • 禁止使用SSHv1版本
  • 设定空闲会话超时时长
  • 利用防火墙设置ssh访问策略
  • 限制ssh的访问频度和并发在线数
  • 做好日志的备份,经常分析(集中于某台服务器)

作业

1.说明密钥认证的过程

1
2
3
第一步:本地创建密钥对
第二步:本地将公钥发到远端
第三步:进行免登陆测试

2.手动配置密钥认证登录

1
2
3
4
5
6
7
8
9
10
11
//使用 ssh-keygen 创建公钥-私钥对
[root@clirnt ~]# ssh-keygen -t rsa
# [回车三次 直至出现RSA 2048]
//使用 ssh-copy-id 将公钥复制到远程系统上的正确位置
[root@clirnt ~]# ls .ssh/
id_rsa id_rsa.pub known_hosts
[root@clirnt ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.107.144
#[选择yes之后输入密码]
//使用 ssh 命令无命令登录远程主机
[root@clirnt ~]# ssh root@192.168.107.144
Last login: Mon May 20 06:30:57 2019 from 192.168.107.1

Linux基础命令

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

man 查询命令

man是一种查询帮助命令,当你不知道这么命令后的参数,可用man命令来查看。

例如下面我输出了”man ls” 查询ls-man的帮助文档(里面介绍了ls各种详细信息)。

1
2
3
4
5
6
7
8
9
10
11
[root@MR ~]# man ls
LS(1) User Commands LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...

-a, --all
do not ignore entries starting with .
-A, --almost-all
do not list implied . and ..

echo 输出

echo 就是一个输出命令,可别小看这个输出命令,在后面脚本文件运用的可相当多。

例如下面我将输入echo的一些简单用法

1
2
3
4
5
6
[root@MR ~]# echo 123
123
[root@MR ~]# echo $SHELL
/bin/bash
[root@MR ~]# [ $USER = root ] && echo "Admin" || echo "User"
Admin #在此解析此含义:此时用户是不是root,如果是,则输出“Admin”,反之则输出“user”

date 显示时间

date为显示时间命令,单独输入显示如下

1
2
[root@MR ~]# date
2019年 03月 13日 星期三 02:18:20 CST

哇,怎么才13号凌晨两点钟,现在才是北京时间14号18点50分啊

那我们就来更改一下吧

1
2
[root@MR ~]# date -s "20190314 18:50:00"
2019年 03月 14日 星期四 18:50:00 CST

reboot 重启

用于重启系统,这个就在此不演示

poweroff 关机

关机命令,但我习惯使用“shutdown +0” ,后面加几就代表几分钟后面关机,加0就是立马关机,例如下面我设置100分钟后关机

1
2
3
4
5
6
[root@MR ~]# shutdown +100
Shutdown scheduled for 四 2019-03-14 20:46:02 CST, use 'shutdown -c' to cancel. #含义就是将在20点46分执行关机,如果你想取消请执行'shutdown -c'
[root@MR ~]# shutdown -c
Broadcast message from root@MR.ZLJ (Thu 2019-03-14 19:07:19 CST):
The system shutdown has been cancelled at Thu 2019-03-14 19:08:19 CST!
# 这里就提示了系统关闭已于2019-03-14星期四19:08:19 CST取消!

wget 下载

下载命令,后接下载地址,下面介绍一些常用的参数

1
2
3
4
5
6
[root@MR ~]# wget http://mirrors.aliyun.com/repo/Centos-6.repo
# 直接下载
[root@MR ~]# wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
# -O CentOS-Base.repo表示下载之后以CentOS-Base.repo来命名
[root@MR ~]# wget -r -p http://mirrors.aliyun.com
# -r -p递归下载网站里所有内容

ps 显示进程

含义:查看系统中进程状态

1
2
3
4
5
[root@MR ~]# ps
PID TTY TIME CMD
3492 pts/0 00:00:00 bash
3514 pts/0 00:00:00 ps
# 单独输出是这样

上面主要用于查看哪些东西在运行,然后我们不要的可以用Kill+PID来结束

ps有三个常用参数:

-a:显示所有进程(包括其他用户的进程)

-u:用户以及其他详细信息

-x:显示没有控制终端的进程

大多数情况,我们都是将-a、-u、-x连在一起使用:-aux

下面我们来敲打吧。。。。

1
2
3
4
5
6
7
[root@MR ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 49988 6412 ? Ss 15:01 0:01 /usr/lib/syste
root 2 0.0 0.0 0 0 ? S 15:01 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 15:01 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 15:01 0:00 [kworker/0:0H]
......................以下省略好多条........................

? 这么多,让我看到猴年马月吗?

然而并不是,其实ps是与后面管道符搭配使用,用来抓取与某一个指定服务进程相对应的PID号码。

USER:进程的所有者 TTY:所在终端
PID:进程ID号 STAT:进程状态
%CPU:运算器占用率 START:被启动的时间
%MEM:内存占用率 TIME:实际使用CPU的时间
VSZ:虚拟内存使用量(KB) COMMAND:命令名称与参数
RSS:占用的固定内存量(KB)

上面这些含义我们只需要混一个脸熟就可以了,下面这就就需要我们详细的记住了:

R(运行):进程正在运行或在运行队列中等待

S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态

D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断

Z(僵尸):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放

T(停止):进程收到停止信号后停止运行

top 动态显示进程

动态监视进程活动与系统负载,我们亲切地称之它为强化版的windows中的任务管理器,怎么个强化法,往下看吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@MR ~]# top
top - 20:30:05 up 5:28, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 407 total, 2 running, 405 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 1870760 total, 313124 used, 1557636 free, 780 buffers
KiB Swap: 2097148 total, 0 used, 2097148 free. 100424 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 49988 6412 3716 S 0.0 0.3 0:01.62 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:+
# 此时我这里就一个进程在启用,其余为0的都为停止或者等待为用户服务
# -20 所代表优先级最高

第1行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内负载情况,

第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数

第3行:用户占用资源百分比、系统内核占用资源百分比、正在占用的百分比、资源空闲百分比

第4行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量

第5行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量

pidof 后面接服务来查看PID

用于查询某个服务进程的PID,每个PID如同身份证一样是唯一的

1
2
[root@MR ~]# pidof top
3645

kill 终止PID

用于终止某个服务进程的PID

1
2
3
4
[root@MR ~]# kill 3685
[root@MR ~]# pidof top
[root@MR ~]#
#终止之后,我们在来查看,这里就看不到top正在运行了

killall终止服务所有PID

有些服务,它的进程PID值远远不止一个,怎样去结束他们呢,我们可用killall来终止这种服务,那么顾名思义,killall就是某个服务的全部进程

ifconfig 查看网卡配置

用于获取网卡配置与网络状态等信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@MR ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:b6:10:19 brd ff:ff:ff:ff:ff:ff
inet 192.168.233.132/24 brd 192.168.233.255 scope global dynamic eno16777736
valid_lft 1290sec preferred_lft 1290sec
inet6 fe80::20c:29ff:feb6:1019/64 scope link
valid_lft forever preferred_lft forever
# 由于我使用的是文本界面,是不带GUI的,所以只能使用"ip a"供大家查看,具体可以在图形化界面中输入"ifconfig"查看

uname 查看内核信息

用于查看内核与版本信息,常常在后面接 -a

1
2
3
4
[root@MR ~]# uname
Linux
[root@MR ~]# uname -a
Linux MR.ZLJ 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux

uptime 显示top的第一行

查看系统的内核负载信息

1
2
3
4
[root@MR ~]# uptime
21:22:18 up 6:20, 3 users, load average: 0.00, 0.01, 0.05
时间 运行了多久 开了几个终端 最近1分钟,5分钟,15分钟
#此命令相当于top命令的第一行

free 查看内存信息

显示当前系统中内存的使用量信息

1
2
3
4
5
[root@MR ~]# free
total used free shared buffers cached
Mem: 1870760 327300 1543460 8752 792 113392
-/+ buffers/cache: 213116 1657644
Swap: 2097148 0 2097148

天啊!这是啥,我怎么看不懂,这要一个个的数单位吗?

其实不用,下面我将会 用”-h” 人性化的角度来显示

1
2
3
4
5
6
[root@MR ~]# free -h
内存总量 已用量 可用量 进程共享的内存量 磁盘缓存的内存量 缓存的内存量
total used free shared buffers cached
Mem: 1.8G 319M 1.5G 8.5M 792K 110M
-/+ buffers/cache: 208M 1.6G
Swap: 2.0G 0B 2.0G

who 谁(此时为哪个用户)

用于查看当前登入主机的用户终端信息

1
2
3
4
[root@MR ~]# who
root tty1 2019-03-12 22:34
root pts/0 2019-03-14 19:44 (192.168.233.1)
# 我正在使用putty.exe 远程链接此系统

last 查看当前系统的登陆记录

用于查看所有系统的登录记录

1
2
3
4
5
6
7
[root@MR ~]# last
root pts/1 192.168.233.1 Thu Mar 14 21:03 - 21:03 (00:00)
root pts/1 192.168.233.1 Thu Mar 14 20:57 - 20:58 (00:00)
root pts/1 192.168.233.1 Thu Mar 14 20:55 - 20:57 (00:01)
......................以下省略好多条........................
wtmp begins Wed Mar 6 16:48:05 2019
#于2019年3月6日星期三16:48:05开始

history 查看历史命令

用于显示历史执行过的命令

1
2
3
4
5
6
7
[root@MR ~]# history
1 sudo useradd huangbichun
2 cd huangbichun
......................以下省略好多条........................
543 who
544 last
545 history

再次执行那一条命令可以用”!+数字 “

1
2
3
4
[root@MR ~]# !543
who
root tty1 2019-03-12 22:34
root pts/0 2019-03-14 19:44 (192.168.233.1)

清除历史命令可用”history -c”

1
2
3
[root@MR ~]# history -c
[root@MR ~]# history
1 history

sosreport 收集系统信息

用于收集系统配置及架构信息并输出诊断文档

pwd 显示当前所在目录

显示用户当前所处的工作目录

1
2
3
4
5
[root@MR ~]# pwd
/root
[root@MR ~]# cd /home
[root@MR home]# pwd
/home

cd 切换目录

用于切换工作路径

1
[root@MR ~]# cd /home

ls 列出当前目录下的文件

用于显示目录中的文件信息

-a :查看全部文件(包括隐藏文件)

-l:查看文件的属性、大小等详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@MR ~]# ls -a
. .bash_history
.. .bash_logout .cshrc .tcshrc
2019-03-09-测试 .bash_profile .viminfo
anaconda-ks.cfg .bashrc
[root@MR ~]# ls -l
总用量 24
drwxr-xr-x. 2 root root 6 3月 12 22:38 2019-03-09-测试
-rw-------. 1 root root 810 3月 6 16:33 anaconda-ks.cfg
[root@MR ~]# ls -al
总用量 68
dr-xr-x---. 5 root root 4096 3月 14 19:17 .
drwxr-xr-x. 17 root root 4096 3月 15 18:09 ..
drwxr-xr-x. 2 root root 6 3月 12 22:38 2019-03-09-测试
-rw-------. 1 root root 810 3月 6 16:33 anaconda-ks.cfg
-rw-------. 1 root root 7368 3月 14 22:16 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r--. 1 root root 224 3月 7 21:59 .bashrc
-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc
-rw-r--r--. 1 root root 15 3月 7 21:44 passwod
-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc
-rw-------. 1 root root 5656 3月 11 17:44 .viminfo

cat 查看文本文件(适用于短文本)

查看纯文本文件 (适合内容较少)

1
2
3
4
5
[root@MR ~]# cat CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
......................以下省略好多条........................

天啊!这么多,我只想要中间的一行,怎么办,没事,Linux中每一个命令都有参数,那么我们接下来看吧。

1
2
3
4
5
6
7
[root@MR ~]# cat -n CentOS-Base.repo
1 # CentOS-Base.repo
2 #
3 # The mirror system uses the connecting IP address of the client and the
......................以下省略好多条........................
61 enabled=0
62 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-6

这样我们就可以清晰的看到有多少行数据了

more 查看文本文件(适用于长文本)

以百分比、翻页形式查看

1
2
3
4
5
[root@MR ~]# more CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
--More--(32%)

如果我们不想看,可以按下字母q退出,或者按ctrl+c

head 查看一定行数

默认下显示前十行,我们也可以输入-n 【输入一个数字】来查看你想要看到的前多少行

1
2
3
4
5
6
7
[root@MR ~]# head CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
......................以下省略7条........................
[root@MR ~]# head -n 1 CentOS-Base.repo
# CentOS-Base.repo

tail 查看一定行数

默认下只显示后十行,我们也可以输入-n 【输入一个数字】来查看你想要看到的后多少行

1
2
3
4
5
6
7
[root@MR ~]# tail CentOS-Base.repo
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
......................以下省略7条........................
[root@MR ~]# tail -n 1 CentOS-Base.repo
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-6

tr 替换文本文件中的字符

用于替换文本文件文件中的字符

1
2
3
4
[root@MR ~]# cat 1
a b c d
[root@MR ~]# cat 1 | tr [a-d] [A-D]
A B C D

wc 用于统计文本文件的行数、字数、字节数

用于统计指定文本的行数、字数、字节数

-l 只显示行数

-w 只显示单词数

-c 只显示字节数

1
2
3
4
5
6
7
8
9
10
#例如我现在来统计刚才这个1文本
[root@MR ~]# wc -l 1
1 1
#1这个文本只有一行
[root@MR ~]# wc -w 1
4 1
#1这个文本只有4个单词
[root@MR ~]# wc -c 1
9 1
#1这个文本只有9个字节

stat 查看文件的时间

用于查看文件的具体储存信息和时间等信息

1
2
3
4
5
6
7
8
9
10
[root@MR ~]# stat 1
文件:"1"
大小:9 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:68107948 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2019-03-16 18:12:24.024958722 +0800
最近更改:2019-03-16 18:12:24.024958722 +0800
最近改动:2019-03-16 18:12:24.025958722 +0800
创建时间:-

cut 按列来提取文本字符

以一列两列来提取文本里面的信息

-d 后接某一字节符号来设置间隔

-f 后接数字来提取多少列

1
2
3
4
5
6
7
8
9
[root@MR ~]# cut -d: -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
......................以下省略........................

diff 用于对比文本文件的差异

用于对比文件的差异

1
2
3
4
5
6
[root@MR 12]# ls
a A
[root@MR 12]# cat a
a b c d
[root@MR 12]# cat A
A B C D
1
2
3
4
5
6
7
8
9
10
11
[root@MR 12]# diff --brief a A
文件 a 和 A 不同

[root@MR 12]# diff -c a A
*** a 2019-03-16 18:24:24.139918637 +0800
--- A 2019-03-16 18:24:38.922917814 +0800
***************
*** 1 ****
! a b c d
--- 1 ----
! A B C D

touch 创建文本文件

用于创建文本文件,并且可以结合date创建以时间开头的文本文件

-a 只修改读取时间

-m 只修改修改时间

-d 同时修改读取时间又修改修改时间

1
2
3
[root@MR 12]# touch 5
[root@MR 12]# ls -l 5
-rw-r--r--. 1 root root 0 3月 16 18:29 5
1
2
3
4
5
6
7
8
9
[root@MR 12]# echo “132ewfwefwef” >> 5
[root@MR 12]# cat 5
“132ewfwefwef”
[root@MR 12]# ls -l 5
-rw-r--r--. 1 root root 19 3月 16 18:32 5
[root@MR 12]# touch -d "18:29" 5
[root@MR 12]# ls -l
总用量 4
-rw-r--r--. 1 root root 19 3月 16 18:29 5

mkdir 创建文件夹

用于创建空白的目录

-p 一次性创建多个目录

1
2
3
[root@MR 12]# mkdir 10
[root@MR 12]# ls
10 5
1
2
3
4
5
6
7
8
9
10
[root@MR 10]# mkdir -p a/{b,c/{d,e}}
[root@MR 10]# tree
.
└── a
├── b
└── c
├── d
└── e

5 directories, 0 files

cp 复制

复制命令 可以复制文件,也可以复制目录

-p 保留原始文件的属性

-d 若对象为“链接文件”,则保留该“链接文件”的属性

-r 递归持续复制(用于目录)

-i 若目标文件存在则询问是否覆盖

-a 相当于-pdr(p、d、r为上述参数)

1
2
3
[root@MR 10]# cp 1 2
[root@MR 10]# ls
1 2 a

mv 剪切(移动)

剪切文件或者移动文件或者将文件重命名

1
2
3
[root@MR 10]# mv 1 3
[root@MR 10]# ls
2 3 a

rm 删除

用于删除文件的命令,这个命令就不用我过多介绍吧

-r 删除目录

-f 强制删除

dd 类似于提取

按照指定大小和个数的数据块来复制文件或转换文件

if 输入的文件名称

of 输出的文件名称

bs 设置每个‘块’大小

count 设置要复制‘块’的个数

1
2
3
4
[root@MR ~]# dd if=/dev/sda of=111_file count=1 bs=125M
记录了1+0 的读入
记录了1+0 的写出
131072000字节(131 MB)已复制,3.35874 秒,39.0 MB/秒

file 查看文件类型

用于查看文件的类型

1
2
3
4
[root@MR ~]# file /home
/home: directory
[root@MR ~]# file 1
1: ASCII text

tar 压缩(解压)

-c 创建压缩文件

-x 解开压缩文件

-z 用Gzip压缩或解压

-v 显示压缩或解压的过程

-f 目标文件名

-C 指定解压到的目录

1
2
3
4
5
6
7
8
9
10
11
12
压缩:
[root@MR 12]# tar -czvf 10.tar.gz 10
10/
10/a/
10/a/b/
10/a/c/
10/a/c/d/
10/a/c/e/
10/2
10/3
[root@MR 12]# ls
10 10.tar.gz 5
1
2
3
4
5
6
7
8
9
10
11
12
解压至/home目录:
[root@MR 12]# tar xzvf 10.tar.gz -C /home
10/
10/a/
10/a/b/
10/a/c/
10/a/c/d/
10/a/c/e/
10/2
10/3
[root@MR 12]# ls /home
10 zhou

grep 在文本文件中执行关键词搜索

-d 将可执行文件(binary)当作文本文件(text)来搜索

-c 仅显示找到的行数

-i 忽略大小写

-n 显示行号

-v 反向选择—仅列出没有“关键词”的行

1
2
3
4
5
[root@MR 12]# grep /sbin/nologin /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......................以下省略........................

find 按照指定的条件来查找文件

-name 匹配名称
-perm 匹配权限(mode为完全匹配,-mode为包含即可)
-user 匹配所有者
-group 匹配所有组
-mtime -n +n 匹配修改内容的时间(-n指n天以内,+n指n天以前)
-atime -n +n 匹配访问文件的时间(-n指n天以内,+n指n天以前)
-ctime -n +n 匹配修改文件权限的时间(-n指n天以内,+n指n天以前)
-nouser 匹配无所有者的文件
-nogroup 匹配无所有组的文件
-newer f1 !f2 ent–> 匹配比文件f1新但比f2旧的文件
–type b/d/c/p/l/f 匹配文件类型(后面的字母参数依次表示块设备、目录、字符设备、管道、链接文件、文本文件)
-size 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件)
-prune 忽略某个目录
-exec …… {}; 后面可跟用于进一步处理搜索结果的命令(下文会有演示)
1
2
3
4
5
6
7
8
[root@MR 12]# find /etc -name "host*" -print
/etc/host.conf
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/avahi/hosts
/etc/selinux/targeted/modules/active/modules/hostname.pp
/etc/hostname
1
2
3
4
5
6
7
8
9
[root@MR 12]# find / -perm -4000 -print
/usr/bin/mount
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/su
......................以下省略........................

RHEL 7.4 实验环境搭建

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

RHEL 7.4 实验环境搭建

环境搭建请访问链接:https://pan.baidu.com/s/1w2IHw3ozCZWqm-c-TaEVMA

提取码:ppm4

内含:

  • rhel-server-7.4-x86_64-dvd.iso镜像文件
  • VMware14安装包
  • Xftp-6.0.0083p.exe
  • Xmanager-6.0.0092.exe
  • Xshell-6.0.0089p.exe
  • 屏幕录像专家.exe
  • 向日葵远程协助.exe
  • 搭建环境视频指导

开工准备

  • 按着视频操作完之后,就代表我们搭建好RHEL 7.4实验环境之后,输入”ip a“来查看ens33里面有没有IP地址,如果没有(此处如果有直接跳转去看下一段),这时我们输入”vi /etc/sysconfig/network-scripts/ifcfg-ens33“ 然后我们按字母”i“,将光标移动至最低行或者’ONBOOT=no’这一行,将‘no’改为‘yes’即可,然后狂按esc键,输入”:wq“,之后我们就要重启网卡了,输入”systemctl restart network“,然后网卡就被重启了,然后再次输入“ip a”来查看ens33里面的IP地址。

  • 然后就开始搭建本地yum源了,首先我们”cd /etc/yum.repos.d/“,然后输入”ls“查看一下这个目录里面有东西,如果有,我们就输入”rm -rf *“,意思就是删除所有东西,然后我们创建目录”mkdir /mnt/cdrom“再次输入”mount /dev/cdrom /mnt/cdrom“,之后我们输入”vi bendiyum.repo“,然后我们进入了一个全新的界面,我们按”i”进入编辑模式,将:

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

加入进去之后,我们狂按esc键,输入”:wq“保存并退出,然后我们输入”yum clean all“清除缓存,然后我们输入”yum list | wc -l“来统计有多少行,结果非零为正确。证明本地yum 源搭建成功。

  • 快照

这里的快照的含义就是将我们的系统拍一张照片,然后某一时刻系统出问题,这时拍摄过的快照就派上了用场,我们可以还原快照还原到现在这个模样,话不多说,我们来拍摄快照吧。我们在终端中输入”shutdown +0”立刻关机。然后在VMwark中点击你自己这个虚拟机,然后上面一栏中找到“虚拟机”,点击之后再点击“快照“,在点击”拍摄快照“,将快照保存下来,想还原快照就可以在快照管理器中查看拍摄过的快照。

《Git分布式版本控制详解手册》

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

开篇

学会使用Markdown进行编写文本文件
作为一名新时代的IT知识分子,熟悉Markdown语法至关重要
Markdown是一种轻量级标记语言,由于Markdown的轻量化、易读易写等特点
并且Markdown对于图片,图表、数学式都有支持
当前许多网站都在广泛地使用Markdown来撰写帮助文档或是用于论坛上发表消息
甚至Markdown都已经被用来撰写电子书
初学者可以使用Typora来写Markdown,进而提高自己的写作能力,熟悉语法之后,可尝试使用vim或者Visual Studio Code来进行编写

这里附带一下Typora的下载链接,点击此处打开,选择下载

本篇手册就基于Markdown语法编写

Git版本控制

1-Git版本控制的来历

全称:Git分布式版本控制系统
在IT行业中,Linux系统无人不知无人不晓,在1991年linus创建了Linux并将它开源,早期的Linux就仅仅只是一个框架,就连我们熟知的vim也是后来开发者们不断开发出来的。

在这里简要提示一下:vim最初是vi,vim第一个版本是由一个叫布莱姆荷兰人在1991年开发

由于Linux系统是开源,并吸引了世界各地的开发者为Linux提供代码服务,因此Linux系统不断的发展壮大,现绝大部分互联网公司服务器运用的都是Linux系统

那么,linus是怎么管理这些代码呢,如何进行区分以及修改呢?

早在2002年以前,世界各地的开发者们通过diff的方式将源代码发送给linus,然后由linus手工合并。

到了2002年,Linux经过了10年的历程,其中的源代码早已经非常庞大了,代码库之大让linus很难再使用手工的方式管理了,于是呢,linus脑袋一转,选择了一个商业性的版本控制系统BitKeeper,这个控制系统的老东家BitMover公司处于人道主义,授权给Linux社区免费使用这个版本控制系统。

不过好景不长,时隔三年,也就是在2005年的时候,一位叫Andrew(著名的samba服务由他开发而来)试图破解BitKeeper的协议,不料BitMover公司正是搞监控的,后来大家也应该能猜到,BitMover公司收回了Linux社区使用BitKeeper的版权。

Linus完全可以出面和BitMover公司交谈一下,并管好自己社区的弟兄,但是linus没有,其实linus内心早就想写一个分布式控制系统来管理自己的代码仓库。

Linus花了两周的时间,运用C语言写了一个分布式控制系统,Git由此而诞生,linus在一个月内,就将linux系统中的源码交接到Git中管理。

Git迅速就成为了最流行的分布式版本控制系统,尤其是在2008年,GitHub网站(被国内称之为程序员社交网站)上线,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等。

2-安装Git

此章节主要所讲在Linux以及windows系统上怎么安装Git分布式版本控制

Git是在linux上进行开发的,所以理所应当的用到Linux和unix上跑,不过,慢慢的有些大牛就将Git移植到windows上跑,现在Git不仅可以在Linux、unix、windows上跑,还来可以在mac系统上运行。

在Linux上安装Git

这里就以RHEL 7版本举例

第一步:首先检查系统是否安装Git

1
2
[root@client111 ~]# git
-bash: /usr/bin/git: 没有那个文件或目录

若您有信息,则跳过第二步骤,这个信息类似一个帮助文档

第二步:安装Git

首先清空本地所有yum源,并使用网易yum源

1
2
3
4
5
6
7
8
[root@client111 ~]# cd /etc/yum.repos.d/
[root@client111 yum.repos.d]# rm -rf *
[root@client111 yum.repos.d]# ls
[root@client111 yum.repos.d]# wget https://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@client111 yum.repos.d]# ls
CentOS7-Base-163.repo
[root@client111 yum.repos.d]# yum clean all
[root@client111 yum.repos.d]# yum makecache

查询是否有Git软件包

1
2
3
4
5
6
7
8
9
[root@client111 yum.repos.d]# cd
[root@client111 ~]# yum info yum
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
已安装的软件包
名称 :yum
架构 :noarch
版本 :3.4.3
···········

安装Git

1
2
3
4
5
6
7
[root@client111 ~]# yum install git -y
············
已安装:
git.x86_64 0:1.8.3.1-20.el7
作为依赖被安装:
perl-Git.noarch 0:1.8.3.1-20.el7
完毕!

查看是否安装成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@client111 ~]# git
··········
最常用的 git 命令有:
add 添加文件内容至索引
bisect 通过二分查找定位引入 bug 的变更
branch 列出、创建或删除分支
checkout 检出一个分支或路径到工作区
clone 克隆一个版本库到一个新目录
commit 记录变更到版本库
diff 显示提交之间、提交和工作区之间等的差异
fetch 从另外一个版本库下载对象和引用
grep 输出和模式匹配的行
init 创建一个空的 Git 版本库或重新初始化一个已存在的版本库
log 显示提交日志
merge 合并两个或更多开发历史
mv 移动或重命名一个文件、目录或符号链接
pull 获取并合并另外的版本库或一个本地分支
push 更新远程引用和相关的对象
rebase 本地提交转移至更新后的上游分支中
reset 重置当前HEAD到指定状态
rm 从工作区和索引中删除文件
show 显示各种类型的对象
status 显示工作区状态
tag 创建、列出、删除或校验一个GPG签名的 tag 对象

命令 'git help -a''git help -g' 显示可用的子命令和一些指南。参见
'git help <命令>''git help <指南>' 来查看给定的子命令帮助或指南。

注意事项

  • 如果您的系统是ubuntu或者Debian系统的话,请使用sudo get install git -y命令进行安装
  • 如果还是不行,请使用sudo apt-get install git -y命令进行安装
  • 最后还是不行,请移步至官网下载源码,用tar解压,然后编译安装,编译安装步骤:./configmakesudo make install

    如果你所装的系统比较先进,基本二三条是不用看的

在windows上安装Git

第一步:移步官网下载最新版本

点击此处访问Git官网下载界面
现在最新版本是2.23.0,于2019年8月16日发布

下载成功后请使用傻瓜式安装方法,安装地址自行输入,建议在C盘.

使用Git

安装完成之后,在桌面单机鼠标右键会多出两个选项Git GUI HereGit Bash Here.

选择Git Bash Here点击,此时会蹦出一个界面

输入git,如果报出以下帮助文档便是安装正确

1
2
3
4
5
6
7
8
9
10
$ git
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
···············
'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.

以上就是介绍怎么安装Git,此详解手册仅仅介绍linu以及windows,其他系统安装方法也大致相同,具体可进Git官方网站阅读

3-创建账户

绑定用户名

绑定用户在上传文件的时候就知道是谁上传的,起到一个表示作用

1
2
3
4
5
6
[root@client111 ~]# git config --global user.name "Jack"
[root@client111 ~]# git config --global user.email "18371207979@139.com"
[root@client111 ~]# git config user.name
Jack
[root@client111 ~]# git config user.email
18371207979@139.com

创建一个目录

创建好一个目录,这个目录将作为一个版本仓库
[root@client111 ~]# cd
[root@client111 ~]# mkdir git-test
[root@client111 ~]# cd git-test/

使用Git管理此仓库
[root@client111 git-test]# git init
初始化空的 Git 版本库于 /root/git-test/.git/

4-连接进Github网站

创建Github账号

点击进入Github官方网站

Github网站挺有名,全球最大的源代码托管服务平台,2018年6月4日,微软宣布以75亿美元的股票收购GitHub。在21世纪互联网时代,我们IT人员应该理所应当地知道这个网站。

进入网站之后点击右上角注册账户,也可以直接点击此处开始注册,注册之中,遵循能跳过则跳过,不能跳过则认真填的原则。

进入邮箱验证界面之后,无论界面怎么样,请点击左上角一个狸猫的图片,然后点击start a project,进入创建一个新的仓库界面。或者验证完成之后直接点击此处看能否跳转创建新的仓库界面

Repository name 这是存储库的名称,随便命名就行,这里我命名为chinesejack
Description 存储库的说明,可选输入,可输入,也可不输入
Public 请选择此选项,任何人都可以看到此存储库。您选择谁可以提交
Initialize this repository with a README
使用自述文件初始化此存储库,勾选则生成README.md一个解释文件,也可以不用勾选,根据自生所需,建议勾选

最后直接鼠标单击create repository创建仓库

ssh密钥链接进Github网站

生成本机密钥

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 默认直接回车即可
[root@client111 git-test]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:bFQH+qf7m9/ruwsE2P5Ho3x0wzHbMN8YY+J24DXTo+M root@client111
The key's randomart image is:
+---[RSA 2048]----+
| o.. |
| oo. . |
| o. oo X+.|
| o ..o.=oXB|
| S ..=+oB=|
| . +=.= +|
| . E o |
| . .+. |
| ..+oo**|
+----[SHA256]-----+
[root@client111 git-test]# cd ~/.ssh/
[root@client111 .ssh]# ls
id_rsa id_rsa.pub
[root@client111 .ssh]# cat id_rsa.pub
····································

将生成出来的密钥复制
进入Github网站,登陆自己刚注册的账号,右上角自己的头像旁边的扩展箭头点一下

然后再点击Settings选项,然后再单击SSH and GPG keys选项

选择第一个New SSH key新建SSH keys密钥

Title随意填写,这里我填写root@client111

Key密钥将刚复制的密钥粘贴进去

此时此刻便连接进你的GitHub仓库

5- Git常用参数

clone-克隆

clone
标准意为:克隆一个仓库到一个新目录
可以理解为:将远端的仓库克隆到本地
命令:git clone [链接]
举例:

1
2
3
4
5
6
7
8
[root@client111 git-test]# git clone https://github.com/chineseJack/chinesejack
正克隆到 'chinesejack'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
[root@client111 git-test]# ls
chinesejack

add-添加

add
标准意为:添加文件内容至索引
可以理解为:提交到暂缓区
命令:git add [文件]
举例:

1
2
3
4
5
6
7
8
9
10
# 单个文件提交到暂存
[root@client111 git-test]# cd chinesejack/
[root@client111 chinesejack]# touch 123.txt
[root@client111 chinesejack]# git add 123.txt
# 多个文件提交到暂存区
[root@client111 chinesejack]# touch abc.txt 456.txt def.txt
[root@client111 chinesejack]# ls
123.txt 456.txt abc.txt def.txt README.md
[root@client111 chinesejack]# git add --all .
# .是代表当前目录

commit-提交

commit
标准意为:记录变更到仓库
可以理解为:将暂存区所有内容提交到当前分支
命令:git commit -m “填写所要描述的内容”
举例:

1
2
3
4
5
6
7
[root@client111 chinesejack]# git commit -m "创建了4个txt文件"
[master 38911e7] 创建了4个txt文件
4 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 123.txt
create mode 100644 456.txt
create mode 100644 abc.txt
create mode 100644 def.txt

push-推

push
标准意为:更新远程引用和相关的对象
可以理解为:推,更新本地到远程仓库
命令:git push

第一次推上去需要后面跟上项目链接,以后就可以不用输入链接
举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@client111 chinesejack]# git push https://github.com/chineseJack/chinesejack
warning: push.default 未设置,它的默认值将会在 Git 2.0 由 'matching'
修改为 'simple'。若要不再显示本信息并在其默认值改变后维持当前使用习惯,
进行如下设置:

git config --global push.default matching

若要不再显示本信息并从现在开始采用新的使用习惯,设置:

git config --global push.default simple

参见 'git help config' 并查找 'push.default' 以获取更多信息。
'simple' 模式由 Git 1.7.11 版本引入。如果您有时要使用老版本的 Git,
为保持兼容,请用 'current' 代替 'simple' 模式)

Username for 'https://github.com': chineseJack # 此处需要当时注册账户时候的账户名
Password for 'https://chineseJack@github.com': # 此处需要填写当时注册账户时候的密码
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 312 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/chineseJack/chinesejack
50fe4cf..38911e7 master -> master

pull-拉

pull
标准意为:获取并整合另外的仓库或一个本地分支
可以理解为:拉,拉取远程仓库到本地
命令:git pull
举例:

1
2
# 手法如同push
git pull https://github.com/chineseJack/chinesejack

show-查看内容

show
标准意为:显示各种类型的对象
可以理解为:检查你所提交的版本的减少以及增加的内容
命令:git show
举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@client111 chinesejack]# git show
commit 38911e7c2226a033779fdcf7b2eef9c19cb477bf
Author: Jack <18371207979@139.com>
Date: Tue Oct 29 20:58:34 2019 +0800

创建了4个txt文件

diff --git a/123.txt b/123.txt
new file mode 100644
index 0000000..e69de29
diff --git a/456.txt b/456.txt
new file mode 100644
index 0000000..e69de29
diff --git a/abc.txt b/abc.txt
new file mode 100644
index 0000000..e69de29
diff --git a/def.txt b/def.txt
new file mode 100644
index 0000000..e69de29

因为我四个文件里什么都没有,所以未显示内容

status-状态

status
标准意为:显示工作区状态
可以理解为:显示状态,提醒你有没有没提交的
命令:git status
举例:

1
2
3
[root@client111 chinesejack]# git status
# 位于分支 master
无文件要提交,干净的工作区

这里改动一个文件,然后再看下状态

1
2
3
4
5
6
7
8
9
10
[root@client111 chinesejack]# echo 123456789 > 123.txt
[root@client111 chinesejack]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: 123.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

如果git status告诉你有文件被修改过,用git diff可以查看修改内容

diff-对比

diff
标准意为:显示提交之间、提交和工作区之间等的差异
可以理解为:你写的对比提交了的有哪些变化
命令:git diff

后面还可以接版本号,与各个版本之间对比
举例:

1
2
3
4
5
6
7
[root@client111 chinesejack]# git diff
diff --git a/123.txt b/123.txt
index e69de29..28d1445 100644
--- a/123.txt
+++ b/123.txt
@@ -0,0 +1 @@
+123456789

log-日志

log
标准意为:显示提交日志
可以理解为:查看提交历史
命令:git log
举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@client111 chinesejack]# git log
commit fd6c7f54c502a2a575e4450429892ec4d1dc3e48
Author: Jack <18371207979@139.com>
Date: Tue Oct 29 21:12:21 2019 +0800

不小心将全部文件删除

commit 38911e7c2226a033779fdcf7b2eef9c19cb477bf
Author: Jack <18371207979@139.com>
Date: Tue Oct 29 20:58:34 2019 +0800

创建了4个txt文件

commit 50fe4cf75396b3e25d9ca51aa21c8a751f52ea6d
Author: chineseJack <57097857+chineseJack@users.noreply.github.com>
Date: Mon Oct 28 20:51:58 2019 +0800

Initial commit

# commit:意为版本

reset –hard-版本退回

reset –hard
标准意为:倒版本号
可以理解为:后面接版本编号,直接回到那个版本
命令:git reset –hard [版本号]
举例:

1
2
3
4
[root@client111 chinesejack]# git reset --hard 38911e7
HEAD 现在位于 38911e7 创建了4个txt文件
[root@client111 chinesejack]# ls
123.txt 456.txt abc.txt def.txt README.md

reflog-历史提交版本

reflog
标准意为:查看命令历史
可以理解为:查看提交历史
命令:git reflog
举例:

1
2
3
4
5
[root@client111 chinesejack]# git reflog
38911e7 HEAD@{0}: reset: moving to 38911e7
fd6c7f5 HEAD@{1}: commit: 不小心将全部文件删除
38911e7 HEAD@{2}: commit: 创建了4个txt文件
50fe4cf HEAD@{3}: clone: from https://github.com/chineseJack/chinesejack

然后再使用reset –hard可回到’未来’版本

1
2
3
4
[root@client111 chinesejack]# git reset --hard fd6c7f5
HEAD 现在位于 fd6c7f5 不小心将全部文件删除
[root@client111 chinesejack]# ls
[root@client111 chinesejack]#

6- Git部分参数

git fetch
从服务器下载数据库,并放到新分支,不跟自己的数据库合并

git whatchanged
查看两个分支的变化

git branch
创建分支,查看分支,删除分支

git checkout
切换分支

git merge
合并分支,把目标分支合并到当前分支

git config
配置相关信息,例如email 和name

git tag
标定版本号

git mv
重命名文件或者文件夹

git rm
删除文件或者文件夹

git help
查看帮助,还有几个无关紧要的命令,请自行查看帮助

7-git版本控制重点知识梳理

本地(local)

初始化
1
2
3
4
5
6
7
8
9
10
全局变量:
git config -global user name "chinesejack"
git config -global email "18371207979@139.com"

初始化新版本库:git init

添加新文件到版本库:
添加单个文件:git add somefile.txt
添加所有txt文件:git add *.txt
添加所有文件:git add
日常操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
提交:
提交所有修改文件:git commit -m "some msg" -a
提交单个文件:git commit -m "add msg to readme.txt" readme.txt
提交增补:git commit -C head -a -amend (此提交增补不会产生新的提交历史记录)

撤销修改:
撤销尚未提交的修改:
撤销1、2个文件:git checkout head readme.txt todo.txt
撤销所有txt文件:git checkout head *.txt
撤销所有文件:git checkout head
撤销提交:
复位:
取消暂存:git reset head或者git reset head <filename>
复位到head之前那个版本:git reset --hard head^

分支:
列出本地分支:git branch
列出所有分支:git branch -a
基于当前分支的末梢创建新的分支:git branch <branchname>
检出分支:git checkout <branchname>
基于当前分支的末梢创建新分支并检出分支:git checkout <branchname>
基于某次提交、分支或标签创建新分支:git branch emputy2 emputy
git branch emputy bfe57de0 用来查看某个历史断面很方便
合并分支:
普通合并:
合并提交:git merge <branchname>
合并但不提交:git merge --no-commit
压合合并:
压合合并后直接提交:git merge --squash <branchname>
压合合并但不提交:git merge --squash --no-commit <branchname>
拣选合并:挑选某次提交合并但不提交:git cherry-pick --no-commit 5b62b6

重命名分支:
git branch -m <branchname> <newname> 不会覆盖已存在的同名分支
git branch -M <branchname> <newname> 会覆盖已存在的同名分支

删除分支:
git branch -d new2 如果分支没有被合并会删除失败
git branch -D new2 即使分支没有被合并也照删不误

标签:
创建标签:
git tag 1.0 为当前分支最近一次提交创建标签
git tag contacts_1.1 contacts 为contacts分支最近一次提交创建标签
git tag 1.1 4e6861d5 为某次历史提交创建标签
显示标签列表:git tag
检出标签:git checkout 1.0
由标签创建分支:git branch b1.1 1.1/git chech=kout -b b1.0 1.0
删除标签:git tag -d 1.0

查看状态:
当前状态:git status
历史记录:git log
当前分支历史记录:gitk
查看某分支历史记录:gitk <branchname>
查看所有分支:gitk branch -v
每个分支最后的提交:git branch -v

导出版本库:
git archive --format=zip head>nb.zip
git archive --format-zip --prefix=nb1.0/ head>nb.zip

远程(remote)

初始化
1
2
3
4
5
6
7
克隆版本:git clone <url>

别名:
添加远程版本库的别名:git remote add <别名> <远程版本库的url>
删除远程库的别名和相关分支:git remote rm <别名>

创建一个无本地分支的库:git init -bare
日常操作
1
2
3
4
5
6
7
8
9
分支:
列出远程分支:git branch -r
删除远程库中已经不存在的分支:git remote prune origin

从远程库获取:
获取但不提交:git fetch <远程版本库>
获取并提交到当前本地分支:git pull

推入远程:git push origin master

生成SSH Key

1
2
3
第一步:启动git Bash控制台
第二步:生成SSH Key:ssh-keygen -t rsa -C "18371207979@139.com"
第三步:将SSH Key添加到Github账户里

8-使用Github+Hexo搭建个人博客

效果可点击此处

当您看到这里,我就默认你掌握了git的全部常用知识。如果还不是不懂,请返回到手册的开头,再看一遍。

创建个人仓库

  • 第一步 ssh进自己的GitHub账户
    在前面第四章节的时候已经将本地ssh进github账户了,所以此处不再讲解。

  • 第二步 主界面点击Start a project
    仓库命名请以.github.io结尾
    Description 为可选择填写
    勾选Public
    不勾选Initialize this repository with a README
    点击Create repository

例如本文的仓库名:chineseJack.github.io
Descriptiont这里填写blog

之后就会跳转到创建好仓库,细心的查看,你的仓库会形成一个地址,同时它也可以切换ssh形式或者https形式,这里我们复制ssh形式的链接
例如本手册的创建出来的链接:git@github.com:chineseJack/chineseJack.github.io.git

在做下面一些步骤时,如果你是服务器,那么还好,如果你是在虚拟机上操作,那么建议将处理器的核数调到2核以上,最好4核,不然下面会渴望到放弃。

下载安装Node.js

点击此处下载
下载Linux Binaries (x64)包,将包导入到root的家目录

或者用wget下载

1
2
[root@client111 ~]# wget https://npm.taobao.org/mirrors/node/v10.16.0/node-v10.16.0-linux-x64.tar.xz
[root@client111 ~]# mv node-v10.16.0-linux-x64.tar.xz /usr/local/
  • 安装node.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@client111 ~]# cd /usr/local/
    [root@client111 local]# tar xf node-v10.16.0-linux-x64.tar.xz
    [root@client111 local]# ln -s node-v10.16.0-linux-x64 nodejs
    [root@client111 local]# cd nodejs/
    [root@client111 nodejs]# ls
    bin CHANGELOG.md include lib LICENSE README.md share
    [root@client111 nodejs]# cd bin/
    [root@client111 bin]# ./node -v
    v10.16.0
  • 创建软链接

    1
    2
    3
    4
    5
    6
    [root@client111 bin]# ls
    node npm npx
    [root@client111 bin]# pwd
    /usr/local/nodejs/bin
    [root@client111 bin]# ln -s /usr/local/nodejs/bin/node /usr/local/bin/node
    [root@client111 bin]# ln -s /usr/local/nodejs/bin/npm /usr/local/bin/npm

安装部署Hexo

1
2
3
4
5
6
7
[root@client111 ~]# npm install hexo-cli -g
/usr/local/node-v10.16.0-linux-x64/bin/hexo -> /usr/local/node-v10.16.0-linux-x6 4/lib/node_modules/hexo-cli/bin/hexo
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.1.1 (node_modules/hex o-cli/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@ 2.1.1: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"} )

+ hexo-cli@3.1.0
added 66 packages from 313 contributors in 85.809s

出现报错,不要慌张,依次往下
其实fsevents@2.1.1 为mac系统中的,linux系统可以忽略

  • 创建软链接

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@client111 ~]# cd /usr/local/nodejs/lib/node_modules/hexo-cli/bin/
    [root@client111 bin]# pwd
    /usr/local/nodejs/lib/node_modules/hexo-cli/bin
    [root@client111 bin]# ln -s /usr/local/nodejs/lib/node_modules/hexo-cli/bin/hexo /usr/local/bin/hexo
    [root@client111 bin]# cd
    [root@client111 ~]# vim .bash_profile
    # 将第十行改动如下
    PATH=$PATH:$HOME/bin:/usr/local/bin
    # 保存并退出
    [root@client111 ~]# source /etc/profile
    [root@client111 ~]# hexo
    Usage: hexo <command>

    Commands:
    ·······
    # 如果没有报错则表示hexo安装成功
  • 部署Hexo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    [root@client111 ~]# cd
    [root@client111 ~]# mkdir hexo
    [root@client111 ~]# cd hexo/
    [root@client111 blog]# hexo init
    INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git
    正克隆到 '/root/hexo'...
    remote: Enumerating objects: 22, done.
    remote: Counting objects: 100% (22/22), done.
    remote: Compressing objects: 100% (17/17), done.
    remote: Total 153 (delta 8), reused 8 (delta 3), pack-reused 131
    接收对象中: 100% (153/153), 29.67 KiB | 5.00 KiB/s, done.
    处理 delta 中: 100% (70/70), done.
    子模组 'themes/landscape' (https://github.com/hexojs/hexo-theme-landscape.git) 已为路径 'themes/landscape' 注册
    正克隆到 'themes/landscape'...
    remote: Enumerating objects: 32, done.
    remote: Counting objects: 100% (32/32), done.
    remote: Compressing objects: 100% (25/25), done.
    remote: Total 1054 (delta 20), reused 10 (delta 7), pack-reused 1022
    接收对象中: 100% (1054/1054), 3.21 MiB | 3.00 KiB/s, done.
    处理 delta 中: 100% (578/578), done.
    子模组路径 'themes/landscape':检出 '73a23c51f8487cfcd7c6deec96ccc7543960d350'
    INFO Install dependencies
    npm notice created a lockfile as package-lock.json. You should commit this file.
    npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules/nunjucks/node_modules/fsevents):
    npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
    npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.1.1 (node_modules/fsevents):
    npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.1: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

    added 362 packages from 470 contributors and audited 2622 packages in 211.34s
    found 0 vulnerabilities

    INFO Start blogging with Hexo!

这里的警告依然如此不用理会,最后一句Start blogging with Hexo!我们就可以开始用Hexo博客!

生成测试页面

1
2
3
4
[root@client111 hexo]# hexo g
[root@client111 hexo]# hexo s
INFO Start processing
INFO Hexo is running at http://localhost:4000 . Press Ctrl+C to stop.

此时先不用Ctrl+C,先访问http://localhost:4000看看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@client111 ~]# netstat -lntup | grep 'hexo'
tcp6 0 0 :::4000 :::* LISTEN 53413/hexo
[root@client111 ~]# yum install elinks.x86_64 -y
[root@client111 ~]# elinks http://localhost:4000
Link: [1]Hexo (alternate)

[2]Hexo

Home [3]Archives
[4]_____________________ [5]
[6]2019-11-04

Hello World

Welcome to [7]Hexo! This is your very first post. Check [8]documentation
for more info. If you get any problems when using Hexo, you can find the
answer in [9]troubleshooting or you can ask me on [10]GitHub.

Quick Start

Create a new post

1 $ hexo new "My New Post"

More info: [11]Writing

Run server

1 $ hexo server

More info: [12]Server

Generate static files

如果能看到这些信息就表示成功,此时就可以Press Ctrl+C to stop。

生成博客页面

  • 修改配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    [root@client111 hexo]# ls
    _config.yml node_modules package-lock.json scaffolds themes
    db.json package.json public source
    [root@client111 hexo]# vim _config.yml
    # 在最后一行添加:
    type: git
    repo: git@github.com:chineseJack/chineseJack.github.io.git
    branch: master

repo这里请使用上面创建仓库时所复制的链接

  • 生成页面并部署
    1
    2
    3
    4
    [root@client111 hexo]# hexo c && hexo g && hexo d
    ········
    INFO 28 files generated in 410 ms
    ERROR Deployer not found: git

出现报错,不要惊慌
解决办法:

1
2
3
4
5
6
7
8
9
[root@client111 hexo]# npm install --save hexo-deployer-git
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.1.1 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.1: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules/nunjucks/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

+ hexo-deployer-git@2.0.0
added 1 package from 1 contributor and audited 2697 packages in 5.796s
found 0 vulnerabilities

忽视前4行的报错

再进行一次部署

1
2
3
4
5
6
7
8
9
[root@client111 hexo]# hexo c && hexo g && hexo d
············
Username for 'https://github.com': chineseJack # 这里树妖验证你的github账户
Password for 'https://chineseJack@github.com': # 这里需要验证你的GitHub账户密码
·········
To git@github.com:chineseJack/chineseJack.github.io.git
* [new branch] HEAD -> master
分支 master 设置为跟踪来自 git@github.com:chineseJack/chineseJack.github.io.git 的远程分支 master。
INFO Deploy done: git

总结

  • 至此,搭建个人博客已结束,浏览器访问仓库名称就是属于自己的个人博客
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    [root@client111 hexo]# elinks chineseJack.github.io
    Link: [1]Hexo (alternate)

    [2]Hexo

    Home [3]Archives
    [4]_____________________ [5]
    [6]2019-11-04

    Hello World

    Welcome to [7]Hexo! This is your very first post. Check [8]documentation
    for more info. If you get any problems when using Hexo, you can find the
    answer in [9]troubleshooting or you can ask me on [10]GitHub.

    Quick Start

    Create a new post

    1 $ hexo new "My New Post"

    More info: [11]Writing

    Run server

RHCSA复习

1.破解root密码

1
2
3
4
5
6
7
8
启动界面 按e
下翻至最后2行,删除到ro 若有语言代码不用删除,按下ctrl+x键
mount -o remount,rw /sysroot
chroot /sysroot
echo "tangkai" | passwd --stdin root
touch /.autorelabel
exit
exit

2.配置IP地址

1
2
3
4
5
6
7
8
vim /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
IPADDR=172.25.254.10
NETMASK=255.255.255.0
GATEWAY=172.25.254.254
DNS1=172.25.254.250
保存并退出
systemctl restart network

【此时在本地主机上开一个终端远程连接】
ssh root@172.25.254.10

3.更改主机名

1
2
3
4
5
[root@localhost ~]# vim /etc/hostname
[root@localhost ~]# cat /etc/hostname
station.domain12.example.com
[root@localhost ~]# bash
[root@station ~]#

4.配置yum源

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
rhel_dvd.repo
[root@localhost yum.repos.d]# rm -rf rhel_dvd.repo
[root@localhost yum.repos.d]# vim zhou.repo
[root@localhost yum.repos.d]# cat zhou.repo
[zhou]
name=zhou
baseurl=http://classroom.example.com/content/rhel7.0/x86_64/dvd/
enabled=1
gpgcheck=0
[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# yum install vsftpd -y

此时安装报错,可能是classroom.example.com访问不了,请看最下面介绍的注意

5.配置selinux

1
2
[root@station ~]# vim /etc/selinux/config
SELINUX=enforcing(将disabled修改为enforcing)

6.配置系统磁盘及打包操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
lsblk
fdisk /dev/vdb
p-n-p-回车-回车-+500M-p-w
partprobe /dev/vdb
lsblk
mkfs.xfs /dev/vdb1
mkdir /common
blkid
复制/dev/vdb1的UUID
vim /etc/fstab
UUID="2204b223-5803-4136-b09b-59903527dc77" /common xfs defaults 0 0
保存并退出
mount -a
df -Th

mkdir /common/adm
cd /common
useradd admin
chown .admin adm
ls -l
setfacl -m g:admin:rwx adm
setfacl -m o::--- adm
ls -l

tar cjf backup_local.tar.bz2 /usr/local
ls

7.内核设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wget http://classroom.example.com/content/rhel7.3/x86_64/dvd/Packages/kernel-3.10.0-514.el7.x86_64.rpm
rpm -ivh kernel-3.10.0-514.el7.x86_64.rpm
wget http://classroom.example.com/content/rhel7.3/x86_64/dvd/Packages/dracut-033-463.el7.x86_64.rpm
wget http://classroom.example.com/content/rhel7.3/x86_64/dvd/Packages/linux-firmware-20160830-49.git7534e19.el7.noarch.rpm
wget http://classroom.example.com/content/rhel7.3/x86_64/dvd/Packages/xfsprogs-4.5.0-8.el7.x86_64.rpm
wget http://classroom.example.com/content/rhel7.3/x86_64/dvd/Packages/kmod-20-9.el7.x86_64.rpm
rpm -Uvh kmod-20-9.el7.x86_64.rpm
rpm -Uvh linux-firmware-20160830-49.git7534e19.el7.noarch.rpm
rpm -Uvh xfsprogs-4.5.0-8.el7.x86_64.rpm
rpm -Uvh dracut-033-463.el7.x86_64.rpm --nodeps
rpm -ivh kernel-3.10.0-514.el7.x86_64.rpm
【此时中途会卡一会,不必惊慌,等待出来提示符】
reboot
等待2分钟再次ssh root@172.25.254.10
uname -r
3.10.0-514.el7.x86_64
【此时表示内核升级成功】

8.开启IP转发功能

1
2
3
4
5
6
7
8
vim /etc/sysctl.conf
复制 /usr/lib/sysctl.d/00-system.conf
退出
vim /usr/lib/sysctl.d/00-system.conf
加入 net.ipv4.ip_forward = 1
保存并退出
sysctl -p /usr/lib/sysctl.d/00-system.conf
【当有出现net.ipv4.ip_forward = 1表示IP转发成功】

9.计划任务

1
2
3
4
5
6
7
8
useradd natasha
crontab -u natasha -e
23 14 * * * /usr/bin/echo "I AM RHCE"
保存并退出
vim /etc/cron.allow
root
natasha
保存并退出

10.创建用户

1
2
useradd tangkai -c "BOSS" -u 9999 -G root -d /tangkai
tail -n 1 /etc/passwd

11.创建用户和组

1
2
3
4
5
6
7
8
9
10
11
usermod -a -G admin natasha
id natasha
useradd -G admin harry
id harry
useradd -s /sbin/nologin sarah
id sarah
echo "tangkai" | passwd --stdin natasha
echo "tangkai" | passwd --stdin harry
echo "tangkai" | passwd --stdin sarah
chage -M 30 -W 5 natasha
chage -l natasha

12.权限设置

1
2
3
4
5
6
7
cp /etc/fstab /var/tmp
cd /var/tmp
ls -l
setfacl -m u:natasha:rw- fstab
setfacl -m u:harry:--- fstab
setfacl -m o::r-- fstab
ls -l

13.远程登陆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1)用LDAP验证:
cd /etc/openldap/
mkdir cacerts
cd cacerts/
wget http://classroom.example.com/pub/example-ca.crt
yum install authconfig* sssd* krb5* -y
authconfig-tui
【此处勾选以下四个:】
【Use LDAP】
【Use Shadow Passwords】
【Use LDAP Authentication】
【Local authorization is sufficient】
然后下一步
[*] Use TLS
Server: classroom.example.com
Base DN: dc=example,dc=com
然后ok
su - ldapuser12
出现bash-4.2$为正确

2)用kerbros验证
authconfig-tui
【此处勾选以下四个:】
【Use LDAP】
【Use Shadow Passwords】
【Use Kerberos】
【Local authorization is sufficient】
然后下一步
[*] Use TLS
Server: classroom.example.com
Base DN: dc=example,dc=com
然后下一步
Realm: EXAMPLE.COM
KDC: classroom.example.com
Admin Server: classroom.example.com
[ ] Use DNS to resolve hosts to realms
[ ] Use DNS to locate KDCs for realms
然后OK
su - ldapuser12
出现bash-4.2$为正确

14.NTP客户端连接

1
2
3
4
5
6
7
8
9
10
11
12
vim /etc/chrony.conf

#server 0.rhel.pool.ntp.org iburst
#server 1.rhel.pool.ntp.org iburst
#server 2.rhel.pool.ntp.org iburst
#server 3.rhel.pool.ntp.org iburst
server classroom.example.com iburst

保存并退出

systemctl restart chronyd
systemctl enable chronyd

15.LDAP客户端自动挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yum install autofs.x86_64 -y
cd /etc
ll auto.【此处tab两下】
vim auto.master
在/misc /etc/auto.misc下添加
/home/guests /etc/auto.ldap
保存并退出
cp auto.misc auto.ldap
vim auto.ldap
ldapuser12 -rw classroom.example.com:/home/guests/ldapuser12
保存并退出
systemctl restart autofs
systemctl enable autofs
su - ldapuser12
【出现完整的登陆提示符表示登陆完成】
[ldapuser12@station ~]$

16.查找文件

1
2
3
find / -user tangkai -exec cp -rf {} /root/findfile/ \;

cat /usr/share/dict/words | grep "atens" > /root/lines.txt

17.文件系统管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lsblk
fdisk /dev/vdb
n-e-回车-回车-回车-n-l-回车-+500M-p-w
fdisk /dev/vdb
p-回车-82-w
partprobe /dev/vdb
mkswap /dev/vdb5
blkid
复制/dev/vdb5的UUID
vim /etc/fstab
UUID="1fdd485e-faf5-4635-a61c-d9e0aef78702" swap swap defaults 0 0
保存并退出
swapon /dev/vdb5
free -m
【swap中total出现499表示成功】

18.LVM拉大/减小

此题先存放至最后倒数第二题时候再做

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
df -Th  这里会有一个vo
环境中没有所以我们先创建一个vo
lsblk
fdisk /dev/vdb
p-n-l-回车-+400M-p-t-回车-8e-w
partprobe /dev/vdb
lsblk
vgcreate vg0 /dev/vdb6
lvcreate -L 200M -n vo vg0
lvdisplay
lsblk
mkfs.ext4 /dev/vg0/vo
blkid
复制/dev/loop0的UUID
vim /etc/fstab
UUID="c5e1fe56-4745-4e34-ae69-715e008b3bfe" /vo ext4 defaults 0 0
mkdir /vo
mount -a
lsblk
df -Th
【此时就有一个vo了】
【以上考试时候是已经有了,只需做以下步骤】
lvextend -L 312M /dev/vg0/vo
resize2fs /dev/vg0/vo
df -Th
【此时可以看到299M,表示成功】

19.ACL控制及权限委派

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
useradd admin1
useradd admin2
useradd admin3
echo "tangkai" | passwd --stdin admin1
echo "tangkai" | passwd --stdin admin2
echo "tangkai" | passwd --stdin admin3
useradd user2 -s /sbin/nologin
echo "tangkai" | passwd --stdin user2
mkdir /data
setfacl -m u:admin1:rwx /data
setfacl -m u:admin2:r-x /data
setfacl -m u:admin3:--- /data
chown .admin1 /data
chmod g+s /data
mkdir /storage
chmod 777 /storage/
chmod o+t /storage/
visudo
找到root ALL=(ALL) ALL 在下面一行写上:
admin1 ALL=(ALL) /usr/sbin/useradd,/usr/sbin/userdel,/usr/sbin/usermod
保存并退出

20.日志管理

1
2
3
4
5
6
vim /etc/rsyslog.conf
找到mail.*
将后面的-/var/log/maillog替换成classroom.example.com
systemctl restart rsyslog.service
systemctl enable rsyslog.service
systemctl stop rsyslog.service

21.LVM配置

此题先存放至最后一题时候再做

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
1)
lsblk
fdisk /dev/vdb
p-n-l-回车-+816M-t-回车-8e-w
partprobe
lsblk
pvcreate /dev/vdb7
vgcreate -s 16M -p 50 datastore /dev/vdb7
vgdisplay

lvcreate -L 800M -n database datastore
lvs
mkdir /mnt/wshare
mkfs.vfat /dev/datastore/database
blkid
复制/dev/mapper/datastore-database的UUID
vim/etc/fstab
UUID="2E55-7C3E" /mnt/wshare vfat defaults 0 0
保存并退出
mount -a
df -Th

2)
lsblk
fdisk /dev/vdb
p-n-l-回车-+168M-p-t-回车-8e-w
partprobe
pvcreate /dev/vdb8
vgcreate -s 8M -p 20 vg1 /dev/vdb8
vgdisplay

lvcreate -L 160 -n game vg1
lvdisplay
mkfs.ext4 /dev/vg1/game
ll /storage
复制/dev/mapper/vg1-game的UUID
vim/etc/fstab
UUID="b1f45d75-53b2-4691-8198-841f14719e31" /storage ext4 defaults 0 0
保存并退出
mount -a
df -Th

3)
lsblk
fdisk /dev/vdb
p-n-l-回车-+746M-p-t-回车-8e-w
partprobe
pvcreate /dev/vdb9
vgextend vg1 /dev/vdb9
vgdisplay
lvextend -L 746M /dev/vg1/game
resize2fs /dev/vg1/game
lvdisplay


4)
umount /dev/vg1/game
e2fsck -f /dev/vg1/game
resize2fs /dev/vg1/game 160M
lvreduce -L 160M /dev/vg1/game
y
df -Th
e2fsck /dev/vg1/game
mount -a
df -Th

22.过滤操作

1
2
3
yum install vsftpd.x86_64 -y
cp /etc/vsftpd/vsftpd.conf /root
cat vsftpd.conf | grep -v ^# | grep -v ^$ | grep "YES"$ > /root/ftp.txt

23.挂载操作

1
2
3
4
5
6
7
8
9
cd /root
wget http://classroom.example.com/content/boot/rhci-foundation-7.3-5.r46146.iso
mv rhci-foundation-7.3-5.r46146.iso boot.iso
vim /etc/fstab
将:
/root/boot.iso /media/cdrom iso9660 defaults,loop 0 0
添加至最后一行
保存并退出
mount -a

24.计划任务

1
2
3
4
5
6
crontab -e
*/10 14-17 1-5 * * /usr/bin/echo "I Love RHCE"
保存并退出
cat /etc/cron.allow
systemctl restart crond
systemctl enable crond

25.防火墙

systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service
iptables -nvL
iptables -F
service iptables save

注:

如classroom.example.com不能访问
首先在本地主机远程172.25.254.254(172.25.0.254)
命令如下:
ssh root@172.25.254.254
echo ‘NSSENforceValidCerts off’ >> /etc/httpd/conf.d/nss.conf
systemctl restart httpd

linux基础练习

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

关闭selinux,手工配置本地yum源

关闭SElinux:

1
2
3
4
5
6
7
[root@zhoulijie ~]# getenforce
Enforcing
[root@zhoulijie ~]# setenforce 0
[root@zhoulijie ~]# getenforce
Permissive
# 配置文件在:
/etc/selinux/config

手工配置本地yum源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@MR ~]# cd /etc/yum.repos.d/
[root@MR yum.repos.d]# ls
[root@MR dev]# mkdir /mnt/cdrom
[root@MR dev]# mount /dev/sr0 /mnt/cdrom/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@MR dev]# vi /etc/fstab
将/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
写入到最后一行后保存并退出
[root@MR dev]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 18G 816M 17G 5% /
devtmpfs devtmpfs 908M 0 908M 0% /dev
tmpfs tmpfs 914M 0 914M 0% /dev/shm
tmpfs tmpfs 914M 8.6M 905M 1% /run
tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 96M 401M 20% /boot
/dev/sr0 iso9660 3.5G 3.5G 0 100% /mnt/cdrom
# 此时/dev/sr0已经挂载到/mnt/cdrom
[root@MR dev]# cd /etc/yum.repos.d/
[root@MR yum.repos.d]# ls
[root@MR yum.repos.d]# vi bendiyum.repo
将:
[bendiyum]
name=bendiyum
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
加入进去,保存并退出
[root@MR yum.repos.d]# yum clean all
[root@MR yum.repos.d]# yum list | wc -l
4405
# 此时本地yum源成功搭建

安装vsftpd,并启动vsftpd服务

1
2
[root@MR ~]# yum -y install vsftopd
[root@MR ~]# systemctl start vsftpd

安装krb5-config命令

1
2
3
[root@zhoulijie ~]# yum provides krb5-config
[root@zhoulijie ~]# yum -y install krb5-devel-1.11.3-49.el7.x86_64
[root@zhoulijie /]# krb5-config

使用rpm命令安装httpd软件,不解决依赖关系进行安装

1
待解答

使用sed命令将网卡配置文件的ONBOOT=no 改为ONBOOT=yes

1
2
3
4
5
6
7
8
[root@MR network-scripts]# cat -n /etc/sysconfig/network-scripts/ifcfg-eno16777736
1 HWADDR="00:0C:29:B6:10:19"
........(中间省略)
16 ONBOOT="no"
[root@MR network-scripts]# sed '16c ONBOOT=“yes”' ifcfg-eno16777736
HWADDR="00:0C:29:B6:10:19"
........(中间省略)
ONBOOT=“yes"

备份/etc/shadow到/tmp ,保留其权限,使用sed命将此文件中的root替换为aaaabbbb,并对比/etc/shadow和/tmp/shadow两个文件的差别

1
2
[root@MR /]# cp /etc/shadow /tmp
[root@MR tmp]# sed s/root/aaaabbbb/ /tmp/shadow

添加用户:user1,并为文件/tmp/shadow文件添加user1的ACL,权限为读和执行,并把user1加入root组

1
2
3
[root@MR home]# useradd -G root user1
[root@MR home]# id user1
uid=1000(user1) gid=1000(user1) 组=1000(user1),0(root)

使用find命令找出系统中所有属于user1的文件

1
2
[root@MR home]# find -name user1
./user1

使用find命令找出/boot目录下所有目录文件,然后统计目录的个数

1
2
[root@MR home]# find /boot -type d | wc -l
7

查找系统中小于10M的文件并打印显示

1
2
3
4
5
6
[root@MR home]# find -size -10M -print
.
./user1
./user1/.bash_logout
./user1/.bash_profile
./user1/.bashrc

使用rpm命令列出vsftpd的所有doc/man文档

1
[root@zhoulijie /]# rpm -qd vsftpd

手工创建用户user2 ,要求有家目录,完整的登陆提示符

1
[root@MR home]# useradd user2 -d /home/user2

手工创建用户user9 ,要求没有家目录,不允许登录

1
[root@MR home]# useradd user9 -M -s /sbin/nologin

验证以上两题

1
2
3
4
5
6
7
8
[root@MR home]# ls /home
user1 user2
[root@MR home]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
.....(中间省略)
user1:x:1000:1000::/home/user1:/bin/bash
user2:x:1001:1001::/home/user2:/bin/bash
user9:x:1002:1002::/home/user9:/sbin/nologin

修改user2的登陆shell为nologin ,并测试是否能登录

1
2
3
4
5
6
# 不可以登陆
[root@MR home]# vim /etc/passwd
'i'切换到user2 修改/bin/bash为/sbin/nologin
保存并退出
[root@MR home]# su user2
This account is currently not available.

查看根分区大小,并取出根分区使用率赋值给root_disk变量。例如:root_disk=55%(55%是根分区使用率)

1
[root@zhoulijie ~]# df | grep /$ | awk '{print $5}'

查看/etc/passwd 的6-9行内容

1
[root@zhoulijie ~]# sed -n '6,9p' /etc/passwd

以树状的形式显示/etc/security/目录,提交命令和结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@MR home]# yum -y install tree
[root@MR home]# tree /etc/security/
/etc/security/
├── access.conf
├── chroot.conf
├── console.apps
│   ├── config-util
│   ├── rhn_register
│   └── subscription-manager
├── console.handlers
├── console.perms
├── console.perms.d
├── group.conf
├── limits.conf
├── limits.d
│   └── 20-nproc.conf
├── namespace.conf
├── namespace.d
├── namespace.init
├── opasswd
├── pam_env.conf
├── pwquality.conf
├── sepermit.conf
└── time.conf

4 directories, 17 files

给网卡添加一个临时ip 172.16.12.22/24

1
2
3
图形界面右上角--网卡设置--添加网卡
# 或者
ifconfig ens33:5 172.16.12.22 netmask 255.255.255.0

切换到tty2虚拟终端,并查看当前终端是哪个终端

1
2
3
[root@MR ~]# who
root pts/0 2019-03-08 14:54 (192.168.233.1)
root pts/1 2019-03-08 16:40 (192.168.233.1)

怎样找出fdisk命令的绝对路径

1
2
[root@MR ~]# which fdisk
/usr/sbin/fdisk

通过命令行重启系统有哪些方法

1
reboot

如何在命令行中快速删除光标前的内容?

ctrl+U

如何在命令行中快速删除光标后的内容?

ctrl+K

拷贝/etc/passwd文件到本地,并且设置其权限为属主有读写执行权限,属组有读写权限,其他帐户没有权限

cp /etc/passwd .

chmod 760 passwd

1
2
3
4
5
[root@zhoulijie ~]# cp /etc/passwd .
[root@zhoulijie ~]# chmod 760 passwd
[root@zhoulijie ~]# ls -l
total 11
-rwxrw---- 1 root root 956 Apr 6 23:30 passwd

删除/tmp下所有s开头的文件

rm -rf /tmp/s*

1
2
3
4
5
6
[root@zhoulijie ~]# ls /tmp
Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)> s123
CmsGoAgent.pid ssfasf
[root@zhoulijie ~]# rm -rf /tmp/s*
[root@zhoulijie ~]# ls /tmp
Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)> CmsGoAgent.pid

把/etc目录复制到/tmp下并保持原属性不变

cp -r -p /etc /tmp/

1
2
3
[tom@zhoulijie /]$ cp -r -p /etc /tmp/
[tom@zhoulijie /]$ ls /tmp
Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)> CmsGoAgent.pid etc

把/tmp/etc/man_db.conf移动到/tmp下并改名为test.conf且设置所有人都有读写执行权限

mv /tmp/etc/man_db.conf /tmp/ test.conf

chmod 777 test.conf

1
2
3
4
[root@MR /]# mv /tmp/etc/man_db.conf /tmp/test.conf
[root@MR tmp]# chmod 777 test.conf
[root@MR tmp]# ls -l test.conf
-rwxrwxrwx. 1 root root 5171 3月 18 2014 test.conf

创建用户tom、创建组jerry,修改/tmp/test.conf的属主为tom,属组为jerry

useradd tom

groupadd jerry

chown -R tom:jerry /tmp/test.conf

1
2
3
4
5
[root@MR ~]# useradd tom
[root@MR ~]# groupadd jerry
[root@MR ~]# chown -R tom:jerry /tmp/test.conf
[root@MR ~]# ls -l /tmp/test.conf
-rwxrwxrwx. 1 tom jerry 5171 3月 18 2014 /tmp/test.conf

删除用户tom和组jerry

userdel -r tom

groupdel jerry

1
2
[root@MR ~]# userdel -r tom
[root@MR ~]# groupdel jerry

使用find命令找出当前系统中没有属主或属组的所有文件并打印显示

find -nouser -nogroup

-nouser 查找没有属主的文件

-nogroup 查找没有属组的文件

1
2
3
4
5
6
7
8
9
10
[root@zhoulijie /]# find  -nouser -nogroup
find: ‘./proc/2673/task/2673/fd/6’: 没有那个文件或目录
find: ‘./proc/2673/task/2673/fdinfo/6’: 没有那个文件或目录
find: ‘./proc/2673/fd/6’: 没有那个文件或目录
find: ‘./proc/2673/fdinfo/6’: 没有那个文件或目录
./tmp/test.conf
./home/wangqing
./home/wangqing/.bash_logout
./home/wangqing/.bash_profile
./home/wangqing/.bashrc

统计当前系统中一共有多少帐户

wc -l /etc/passwd

1
2
[root@zhoulijie /]# wc -l /etc/passwd
24 /etc/passwd

查看/etc/passwd的前3行和尾3行内容

head -n 3 /etc/passwd

tail -n 3 /etc/passwd

1
2
3
4
5
6
7
8
[root@zhoulijie /]# head -n 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@zhoulijie /]# tail -n 3 /etc/passwd
wangqing:x:1004:7780:wu liang tian zun:/home/wangqing:/bin/csh
openstack:x:1005:1005::/home/openstack:/bin/bash
runtime:x:1006:1006::/home/runtime:/bin/bash

查看/etc/passwd的第10行内容

awk “NR==10” /etc/passwd

1
2
[root@zhoulijie /]# awk "NR==10" /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin

一条命令创建test/1/2/3/4/5目录

mkdir -p test/1/2/3/4/5

1
2
3
4
5
6
7
8
9
10
[root@zhoulijie ~]# mkdir -p test/1/2/3/4/5
[root@zhoulijie ~]# tree test/
test/
└── 1
└── 2
└── 3
└── 4
└── 5

5 directories, 0 files

如何快速回到当前登录用户的家目录

cd

1
2
3
[root@zhoulijie tmp]# cd
[root@zhoulijie ~]# pwd
/root

如何只查看/etc单个目录的信息并以长格式显示

ll -d /etc

1
2
[root@zhoulijie /]# ll -d /etc
drwxr-xr-x. 76 root root 8192 4月 7 23:35 /etc

查看/etc/所占的磁盘空间

du -sh /etc

1
2
[root@zhoulijie /]# du -sh /etc
20M /etc

结合ls与grep命令打印出/tmp/etc目录下的所有目录文件

1
[root@zhoulijie ~]# ls -l /tmp/etc |grep  ^d

删除/tmp下所有的文件

rm -rf /tmp/*

1
2
3
[root@zhoulijie /]# rm -rf /tmp/*
[root@zhoulijie /]# ls /tmp
[root@zhoulijie /]#

临时设置系统主机名并重启验证

hostname 123

1
2
3
[root@MR ~]# hostname 123
[root@MR ~]# bash
[root@123 ~]#

永久设置系统主机名并重启验证

vim /etc/hostname

输入zhoulijie

保存并退出

1
2
3
[root@MR ~]# vim /etc/hostname
[root@MR ~]# bash
[root@zhoulijie ~]#

将系统时间设置为2008-05-10 00:12:13并验证

date -s “2008-05-10 00:12:13”

1
2
3
4
[root@MR ~]# date -s "2008-05-10 00:12:13"
2008年 05月 10日 星期六 00:12:13 CST
[root@MR ~]# date
2008年 05月 10日 星期六 00:12:44 CST

使用ntpdate同步互联网时间

ntpdate time1.aliyun.com

如果没有就使用yum安装

yum install ntpdate -y

1
2
3
4
[root@zhoulijie ~]#ntpdate time1.aliyun.com
11 Apr 17:37:29 ntpdate[7400]: step time server 119.28.183.184 offset 199144.735638 sec
[root@zhoulijie ~]# date
2019年 04月 11日 星期四 17:37:34 CST

统计出/etc/passwd文件有多少单词和字符

wc -w -c /etc/passwd

-w 只显示单词数

-c 只显示字节数

1
2
[root@MR ~]# wc -w -c /etc/passwd
37 1116 /etc/passwd

添加一个计划任务,在每周6凌晨1点35分备份/etc目录到/tmp目录下,要求备份的文件必须是打包好的,名字为etc.tar.xz

crontab -e 编辑计划任务

crontab -l 查看计划任务

1
2
3
4
5
[root@lzy tmp]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@lzy tmp]# crontab -l
35 1 * * 6 /usr/bin/tar -jcf etc.tar.xz /etc/* && cp -r -p etc.tar.xz /tmp/

Linux如何挂载windows下的共享目录?

1
2
mount.cifs //IP地址/server /mnt/server -o user=administrator,password=123456
linux 下的server需要自己手动建一个 后面的user与pass 是windows主机的账号和密码 注意空格 和逗号

统计linux中TCP各连接状态的数量?

请简述符号链接与硬链接的区别?

如何在文本里面进行复制、粘贴,删除行,删除全部,按行查找和按字母查找?

请简述ftp的主动模式与被动模式工作过程

如何过滤出/runtime中的所有一级目录(不包含子目录,即只能是一级目录)

如何查看/etc/目录下最近更新的5个文件?

1
2
3
4
5
6
7
[root@MR etc]# ls -lt | head -n 6
总用量 1108
----------. 1 root root 361 3月 8 19:55 gshadow
-rw-r--r--. 1 root root 455 3月 8 19:55 group
----------. 1 root root 608 3月 8 19:55 shadow
-rw-r--r--. 1 root root 922 3月 8 19:55 passwd
-rw-r--r--. 1 root root 469 3月 8 19:55 group-

已知apache服务的访问日志按天记录在服务器本地目录/app/logs下,由于磁盘空间紧张,现在要求只能保留最近7天访问日志!请问如何解决?

如何打印配置文件nginx.conf的行号及内容?

调试系统服务时,希望能实时查看系统日志/var/log/messages的更新,如何做?

如何查看/etc/services文件有多少行?

分别使用ifconfig和ip命令取出当前主机的ip地址

如何将/etc/fstab中的权限取出来,以数字644这样的形式打印

打印出/etc/fstab文件中除掉空行和注释的内容

用date命令打印3天前的日期,如:2018-10-10

将目录/etc/a下除了b文件外的所有文件压缩打包放到/tmp/a下,名字为a.gz

什么是umask?umask=022代表什么意思?

ftp、http、https、smtp、pop3、ssh、dns的端口号

如何在不停止进程的情况下清空日志/var/log/a.log?

如何在/usr目录下找出大小超过10MB的文件?

如何在/var目录下找出90天之内未被访问过的文件?

ll | awk ‘{print (3,”owns”,)9}’ 这条命令是在做什么?

给你50台Linux系统如何安装呢?如何实现,步骤是什么?

用虚拟机安装了一台Linux系统,突然想克隆一台服务器,克隆后发现无法上网,如何解决?

Linux网卡配置文件路径是什么?要使服务器上外网,必须满足的条件有哪些?需要配置什么?

查找当前目录下30天以前.log结尾的大于1G的文件,并把它移动到/tmp下

查看某个端口是否已经启动,以及查看端口做占用的PID进程号

LVM磁盘管理

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

lvm的应用场景及其弊端

应用场景:
随着公司的发展,数据增长较快,最初规划的磁盘容量不够用了

弊端:
数据不是直接存放在硬盘上,而是在硬盘的上面又虚拟出来一层逻辑卷存放数据,故而增加了磁盘数据恢复的难度

物理卷、卷组、逻辑卷

物理卷(pv):把常规的块设备(硬盘,分区等可以读写数据的设备)通过pvcreate命令对其进行初始化,就成了物理卷

卷组(VG):把多个物理卷的容量组成一个逻辑整体,可以从里面灵活分配容量

逻辑卷(LV):从卷组中划分部分空间成为一个可以读写数据的逻辑单元。需要对其格式化然后挂载使用

lvm管理

部署lvm

LVM部署有装系统前部署以及装系统后部署,此处仅介绍装系统后部署。

创建lvm步骤:

  • 首先添加物理磁盘

  • 然后创建卷组,将物理卷加入到卷组

  • 然后在卷组中划分逻辑分区

  • 其次执行格式化逻辑卷

  • 最后挂载使用

准备物理磁盘
1
2
3
4
[root@zhoulijie ~]# lsblk | grep sd[bcd]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 20G 0 disk
将磁盘加入pv
1
2
3
4
5
6
7
8
[root@zhoulijie ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.

# 检查pv创建情况
[root@zhoulijie ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- <19.00g 0
/dev/sdb lvm2 --- 20.00g 20.00g
创建名为zhou的卷组
1
2
3
4
5
6
7
8
[root@zhoulijie ~]# vgcreate zhou /dev/sdb
Volume group "zhou" successfully created

# 检查卷组
[root@zhoulijie ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- <19.00g 0
zhou 1 0 0 wz--n- <20.00g <20.00g
创建逻辑卷,分配名称, 以及大小, 指定卷组
1
2
3
4
5
6
7
8
[root@zhoulijie ~]# lvcreate -L 100M -n lv1 zhou 
Logical volume "lv1" created.

#检查逻辑卷
[root@zhoulijie ~]# lvscan
ACTIVE '/dev/rhel/swap' [2.00 GiB] inherit
ACTIVE '/dev/rhel/root' [<17.00 GiB] inherit
ACTIVE '/dev/zhou/lv1' [100.00 MiB] inherit
格式化文件系统
1
[root@zhoulijie ~]# mkfs.xfs /dev/zhou/lv1
挂载使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@zhoulijie ~]# mkdir /opt/lv1
[root@zhoulijie ~]# mount /dev/zhou/lv1 /opt/lv1/
[root@zhoulijie ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 17G 3.2G 14G 19% /
devtmpfs devtmpfs 977M 0 977M 0% /dev
tmpfs tmpfs 993M 0 993M 0% /dev/shm
tmpfs tmpfs 993M 9.1M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sr0 iso9660 3.8G 3.8G 0 100% /mnt/cdrom
/dev/sda1 xfs 1014M 161M 854M 16% /boot
tmpfs tmpfs 199M 12K 199M 1% /run/user/42
tmpfs tmpfs 199M 0 199M 0% /run/user/0
/dev/mapper/zhou-lv1 xfs 97M 5.2M 92M 6% /opt/lv1

在这里我们总结一下lvm部署步骤:

1.添加硬盘

2.初始化硬盘成物理卷

pvcreate /dev/sd{b,c,d}

3.创建卷组

vgcreate VG_NAME /dev/sd{b,c,d}

4.创建逻辑卷

lvcreate -L SIZE -n LV_NAME VG_NAME

5.格式化逻辑卷

mkfs.ext4 /dev/VG_NAME/LV_NAME

6.挂载

blkid

vim /etc/fstab

UUID=” “ /挂载点 文件系统类型 挂载参数 0 0

  • 永久挂载注意事项:

    • 修改配置文件/etc/fstab的挂载参数后不会立即生效,必须卸载并重新挂载或者重启系统才能生效

    • 若想使之立即生效并不重启系统,可使用以下方式进行重新挂载

      mount -o remount,rw 挂载点

7.重读配置文件

mount -a

卷组管理

  • 扩展卷组,将新磁盘加如到卷组中
1
2
3
4
5
6
7
# 新硬盘加入pv
[root@zhoulijie ~]# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.

使用vgextend扩展
[root@zhoulijie ~]# vgextend zhou /dev/sdc
Volume group "zhou" successfully extended
  • 缩减卷组,将指定磁盘从卷组中删除
1
2
[root@zhoulijie ~]# vgreduce zhou /dev/sdc
Removed "/dev/sdc" from volume group "zhou"
  • 数据迁移卷组,同一卷组的磁盘才可以进行在线迁移
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 检查当前逻辑卷VG中pv使用情况
[root@zhoulijie ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- <19.00g 0
/dev/sdb zhou lvm2 a-- <20.00g <19.90g
/dev/sdc lvm2 --- 20.00g 20.00g

# pvmove在线数据迁移至其他pv
[root@localhost ~]# pvmove /dev/sdb
/dev/sdb: Moved: 41.33%
/dev/sdb: Moved: 100.00%

# 检查是否将sdb数据迁移至sdc
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb vg1 lvm2 a -- 2.00g 2.00g
/dev/sdc vg1 lvm2 a -- 2.00g 1.76g

逻辑卷管理

  • 逻辑卷扩展,逻辑卷的扩展取决于卷组中的容量,逻辑卷扩展的容量不能超过卷组的容量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@zhoulijie ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- <19.00g 0
zhou 1 1 0 wz--n- <20.00g <19.90g

1.扩展lv逻辑卷
# 增加800M分配给逻辑卷 {注意: 800M +800M 不一样}
[root@zhoulijie ~]# lvextend -L +800M /dev/zhou/lv1
Size of logical volume zhou/lv1 changed from 100.00 MiB (25 extents) to 900.00 MiB (225 extents).
Logical volume zhou/lv1 successfully resized.
# 分配磁盘池中多少百分比给逻辑卷
[root@zhoulijie ~]# lvextend -l +50%FREE /dev/zhou/lv1
Size of logical volume zhou/lv1 changed from 900.00 MiB (225 extents) to <10.4 4 GiB (2672 extents).
Logical volume zhou/lv1 successfully resized.

2.扩展fs文件系统
# 在这里要看你是什么格式
//xfs扩容
[root@zhoulijie ~]# xfs_growfs /dev/zhou/lv1
meta-data=/dev/mapper/zhou-lv1 isize=512 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 25600 to 2736128

//ext扩容
[root@zhoulijie ~]# resize2fs /dev/zhou/lv1
  • ext4文件系统的逻辑卷裁剪容量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 首先自己创建一个1G的逻辑卷作为裁剪的对象
lvcreate -n uplooking -L 1G finance
mkfs.ext4 /dev/finance/uplooking

mkdir -p /finance/uplooking
mount /dev/finance/uplooking /finance/uplooking/
cp /etc/host* /finance/uplooking/

# 如果已经挂载,就必须先卸载
umount /dev/finance/uplooking

# 裁剪容量,必须是先检测文件系统
e2fsck -f /dev/finance/uplooking
resize2fs /dev/finance/uplooking 512M

# 调整完毕后采取裁剪逻辑卷容量
lvreduce -L 512M /dev/finance/uplooking
WARNING: Reducing active logical volume to 512.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce uplooking? [y/n]: y
1
2
3
4
5
6
7
建议:建议裁剪后,再次进行检测文件系统
# e2fsck -f /dev/finance/uplooking

挂载测试:如果能够挂载,一般说明裁剪成功,文件系统没有被损坏
# mount /dev/finance/uplooking /mnt
...
/dev/mapper/finance-uplooking 472M 1.6M 435M 1% /mnt 而且文件系统容量被刷新了
缩减逻辑卷注意事项

1.不能在线缩减,得先卸载

2.确保缩减后的空间大小依然能存储原有数据

3.在缩减之前应该先检查文件,其确保文件系统处于一致性状态,使用命令:e2fsck -f /PATH/TO/LV

练习

1.如何查看/etc/目录大小

1
2
[root@zhoulijie ~]# du -sh /etc
43M /etc

2.如何查看磁盘使用分区情况

1
2
3
4
5
6
7
8
9
10
11
12
[root@zhoulijie ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─zhou-lv1 253:2 0 10.4G 0 lvm /opt/lv1
sdc 8:32 0 20G 0 disk
sdd 8:48 0 20G 0 disk
sr0 11:0 1 3.8G 0 rom /mnt/cdrom

3.如何查看innode使用情况

1
2
3
4
5
6
7
8
9
10
[root@zhoulijie ~]# df -ih
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/rhel-root 8.5M 119K 8.4M 2% /
devtmpfs 245K 393 244K 1% /dev
tmpfs 249K 1 249K 1% /dev/shm
tmpfs 249K 573 248K 1% /run
tmpfs 249K 16 249K 1% /sys/fs/cgroup
/dev/sr0 0 0 0 - /mnt/cdrom
/dev/sda1 512K 325 512K 1% /boot
tmpfs 249K 16 249K 1% /run/user/0

4.如何查看磁盘block使用情况

5.如何查看分区使用格式

1
2
[root@zhoulijie ~]# blkid |grep /dev/sda1
/dev/sda1: UUID="9183ecd8-76e0-4f42-b256-21032b13dcd6" TYPE="xfs"

6.如何查看一个设备的UUID

1
2
[root@zhoulijie ~]# blkid |grep /dev/sda1
/dev/sda1: UUID="9183ecd8-76e0-4f42-b256-21032b13dcd6" TYPE="xfs"

7.请解释/etc/fstab中每段含义

1
2
/dev/cdrom       /mnt/cdrom       iso9660               defaults        0  0 
uuid(要挂载的) 所挂载的地方 设备类型 挂载选项 备份 磁盘检查

8.一个ext4的文件分区,当使用touch test.file命令创建一个新文件是报错,报错的信息提示磁盘已满,但是采用df –h 命令查看磁盘大小时,只是用了60%的磁盘空间,为什么会出现这个情况,说说你的理由.

磁盘分区方案

在虚拟机中添加一块20GB的SCISI磁盘
在新硬盘中建立一个5GB的分区,一个10G的分区
一个格式化为ext4的文件系统, 一个格式化为xfs的文件系统
新建两个目录站点进行挂载, 要求开机自动挂载该分区

LVM磁盘管理方案

在虚拟机环境中,新添加两块SCISI硬盘设备,完成硬盘检测及分区
建立逻辑卷mbvg, 格式化为ext4文件系统, 分配1G逻辑分区供/box目录使用
第二块逻辑分区, 格式化为xfs文件系统, 分配1G逻辑分区供/xfs目录使用
最后使用扩容方案将/box站点扩展到2.8G磁盘使用空间, 将/xfs目录扩展到2G

  • © 2019-2020 Li Jie
  • Powered by Hexo Theme Ayer
    • PV:
    • UV:

喜欢就打赏吧~

支付宝
微信