1 Linux 简介
狭义来说,Linux实际上指Linux kernel (内核)。内核负责管理硬件,并为上层应用提供接口。
而广义来说,是指以Linux kernel 为基础的,包括OS和各种应用在内的各个Linux版本。
Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。
1.1 Linux的特点
开放性,多用户,多任务,可靠的系统安全,良好的可移植性,具有标准兼容性,良好的用户界面(命令界面,图形界面等),出色的速度性能。
开发者操作的系统。
1、开源 | 不完全免费,因为有些系统中加入了收费的软件,开放源代码 |
---|---|
2、多用户 | 系统可以保证各用户之间的安全、隐私 |
3、多任务 | 同时开启多个应用程序 |
4、良好的界面 | Linux同时具有字符界面(命令行)和图形化界面。DOS当时就是现在的cmd。不存在图形化界面 |
5、支持多平台 | 可以在多种硬件平台上安装和运行,如pc或服务器或嵌入式系统。 |
1.2 Linux 发展史
Linux之父:林纳斯·托瓦兹(Linus Torvalds)
发展史
1.3 Linux 发行版本
各个版本之间也只是大同小异,其差别往往体现在客户群、升级维护和界面等方面。
红帽系列
Red Hat Enterprise: (www.redhat.com) 这个是企业级的linux,主要面向服务器。作为商业版,有比较好的配套软件和技术支持。
Fedora: (http://fedoraproject.org) 由社区维护,去除了一些商业软件。红帽实际上赞助了这个项目,以便以此作为技术测试平台。
CentOS: (www.centos.org) 这个版本不来自红帽的公司,是收集红帽公开的源码组成的免费版本,由社区维护,和红帽完全兼容。
SUSE系列
SUSE Linux Enterprise: (www.suse.com) 和红帽商业版类似,德国的发行版本。
openSUSE: (www.opensuse.org) SUSE的免费版本。
Debian系列
Debian: (www.debian.org) 完全免费,社区维护的Linux版本,有很大的用户群,所以遇到问题,基本都可以找到社区用户的支持。
Ubuntu: (www.ubuntu.com) 由一个基金提供支持的免费Linux版本。 继承自Debian。界面很友好。
1.4 为什么要学linux
linux 是公认的安全、高性能、稳定、内核开源的系统。
大数据阶段的所有组件都要安装和运行在linux。
我们需要通过在windows 安装虚拟机来学会搭建大数据环境。
后续会为大家每人开一个教室集群账号,供大家学习。
下面来学一下如何安装虚拟机吧
2 在虚拟机中安装linux
2.1安装虚拟机VMware12
我们现在使用的是VMware12 Workstation Pro这么一款虚拟机产品,它是收费的,但是我们有注册码,不用担心;
安装工具:
① 右键 "以管理员身份运行" 打开安装包
然后弹出安装权限,点击 是
然后进入开始安装的准备页面
② 在弹出的页面点击下一步
③ 弹出vm的使用歇息条款,选择我接受,下一步
④ 选择安装的位置,可以自己选择,也可以默认不更改,此处建议不要安装在C盘即可,当然如果只有一个盘符的同学就不用在意那些个细节了。下面那个增强性键盘驱动程序,可以把这个勾选去掉,然后下一步
增强型虚拟键盘驱动程序可更好地处理国际键盘和带有额外按键的键盘。然而并没有什么用;
不要有中文目录 !!!!!
⑤ 这一步,两个勾都不选也不会影响虚拟机的使用。第一勾去掉,可以使虚拟机听自己的话,否则虚拟机在运行的时候会自动帮你更新。接着下一步
⑥ 这一步是问你是否要创建快捷方式,建议大家勾选,然后点击 "下一步"
⑦ 这一步,确认好了,就点击安装
等待安装
安装完成,输入许可证
输入许可证,秘钥,密钥
秘钥 : 5A02H-AU243-TZJ49-GTC7K-3C61N
注册好之后点击完成即可
验证是否激活:
双击打开桌面上的VM图标
打开的页面点击 "帮助" --> "关于 VMware Workstation(A)"
查看VM的激活情况
到此VM安装成功!
注意:
如果安装失败,卸载vmware,删除安装目录的数据和注册表信息。
用清理注册表工具,清理掉后,重新启动,再安装。
2.2 在虚拟机中安装Centos7.0
2.2.1 下载镜像
阿里云开源镜像站: http://mirrors.aliyun.com/
选择centos进入 如下图:
如下图:选择centos7
再选择isos(镜像目录)
继续下一步,只有一个目录,进入即可
进去以后如图:
其中,Centos-7-x86_64 表示这个是镜像叫centos,版本号为7,支持64位。
后面的名称,我下面为大家一一介绍下:
DVD:普通安装版,需安装到计算机硬盘才能用。文件比较大,包含一系列常用的软件。适合在虚拟机中安装学习。安装的时候可以选择性的安装。
Everything:包括各种packages。太大,挺多东西暂时用不到,不推荐。
LiveGNOME:GNOME桌面版。
LiveKDE:KDE桌面版。
Minimal:最小安装版。
NetInstall:这个是网络安装的启动盘。
另外,.iso代表着直接下载镜像,.torrent是种子文件。阿里的下载很快的,直接下载iso就行。
2.2.2 创建虚拟机
1)新建虚拟机
2) 选择虚拟机版本
3)选择centos7的镜像文件
4)修改虚拟机的名称与文件位置
5)调整虚拟CPU的核心数
6)设置虚拟内存
7)选择虚拟网络类型,此处选择NAT模式
VMware虚拟机常见的网络类型有bridge(桥接),NAT(地址转换)、host-only(仅主机)3种:
Bridge(桥接模式):
桥接模式可以理解为通过物理主机网卡架设了一座桥梁,从而连入了实际的网络中。
虚拟机可以被分配与物理主机相同网段的独立IP,所有网络功能和网络中的真实机器几乎完全一样。
NAT(地址转换):
NAT模式的虚拟机就是通过宿主机(物理电脑)上网和交换数据的。
所有的虚拟机构成了一个局域网,宿主机就是这些虚拟机的上网网关,宿主机的地址变化了,虚拟机的地址不用改。
Host-only(仅主机):
虚拟机的网卡会连接到宿主机的VMnet1上,但宿主机系统并不为虚拟机提供任何路由服务。
网络适配器这块选择 NAT 模式,因为可以在物理机下虚拟出多台ip地址。
9)选择虚拟硬盘类型 默认即可
9)设置虚拟硬盘大小,此处选择单一文件
10)完成配置开启虚拟机
至此,我们的虚拟机的硬件配置就OK了,直接点击关闭即可!
然后点击完成。
2.2.3 运行虚拟机,安装Centos
注意:在安装过程中,可能会提示修改你本机电脑系统的BIOS设置,请根据自己的电脑自行设置。
问题1:
点击开启此虚拟机之后,提示了一个小错误,根据错误提示,到BIOS里面设置了一下,然后重启继续安装
进入BIOS需要重启电脑,在开机过程中频繁按F1 或 F12,这个根据电脑品牌的不同而不同,可以去网上查如果进入BIOS。
问题2:
虚拟机与Hyper-V冲突
控制面板--应用--程序与功能--启用或关闭windows功能--取消Hyper-V的勾选
问题3:windows更新,去更新中心,卸载安装的内容
问题4:使用高版本的vm,15版本
鼠标点击下虚拟机,让我们进入虚拟机。如果需要跳出来请按 ctrl+alt
此处我们用上下键选择Install Centos7 点击以后,会短暂的黑屏一下。
鼠标移入 点击回车
下面页面继续点击回车
检查磁盘,需要稍等一会儿
选择 语言 中文 --> 简体中文
整体配置页面 需要配置 网络 日期和时间 硬盘格式化
网络选择
注意:
此处需要记住主机的IP信息,因为使用的是NET模式,所以谁和谁的都不一样,要注意这个问题
配置完成之后别忘记点击上方的完成回到主页面配置其他信息
回到主页面选择时间和日期,验证网络配置是否正确,此处我们主要通过添加NTP服务器的方式进行验证
是绿色的对号 说明是可以连接阿里云的,那也就是变相的说明我们的服务器现在是可以连接网络的
接下来调整磁盘
所有配置工作结束 开始完成安装
下一个页面设置root的密码是 000000
因为我们的密码过于简单,所以此处第一次点完成会停顿一下 然后再点一次完成就可以了
等待安装成功之后点击重启按钮 等待进入系统即可
出现如上界面代表安装成功啦!
2.3 安装SecureCRT
(linux的远程操作客户端) SSH协议 本地 连接远程 linux服务器
SecureCRT和SecureFX是VanDyke Software开发的一款商业终端连接工具,公司官网为www.vandyke.com,我们用它远程连接我们的linux。
破解步骤参考《SecureCRT注册步骤明细.pdf》
2.3.1 连接Linux系统
2.3.2 配置CRT样式
2.4 拓展知识
VM中关于网络的重要配置
NET模式使用的VM8网卡,如果没有了它我们的虚拟机就连接不上了
虚拟网络编辑器
网卡类型 VM8 如果有的同学没有VM8那就说明现在不是管理员身份运行,点击切换一下就有
DHCP的设置 网卡IP起始段设置,因为是虚拟的所以谁的和谁的都不一样,要记住自己的
网关和DNS参数,一定要记住要不然你上不了网
3 配置静态网卡
3.1 为什么要修改静态IP
因为如果采用DHCP来自动获取IP的话,只要一断网,VM就会重新获取当前IP的下一个IP,所以必须改成静态的来防止这种现象。
DHCP : 自动获取IP, 只要你的网络出现波动 ,它就会自动向VM申请一个IP地址
比如:192.168.92.11 断网 192.168.92.12
DHCP:Dynamic Host Configuration Protocol,动态主机配置协议,在指定的ip段内生成ip地址
3.2 配置步骤
3.2.1 获得自己的真实网卡
问题 : 怎么看哪个是真实网卡呢?
很简单, 上面的 lo 是127.0.0.1, 这是本机的环路IP, 所以下面的ens33才是真实IP
[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e8:76:84 brd ff:ff:ff:ff:ff:ff
inet 192.168.92.38/24 brd 192.168.92.255 scope global noprefixroute dynamic ens33
valid_lft 1188sec preferred_lft 1188sec
inet6 fe80::2839:870b:b85b:c218/64 scope link noprefixroute
valid_lft forever preferred_lft forever
在这个配置中需要记录 inet 后面的IP地址 此处是192.168.92.38 记住它
3.2.2 修改ens33这个网卡的配置
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vi ifcfg-ens33
vi编辑器小知识:
在命令模式下:
i:进入编辑模式
q!:不保存,强制退出
wq:保存后退出
在编辑模式下:
esc: 离开编辑模式,进入命令模式
原来的内容是这样的 :
TYPE="Ethernet" -- 网络类型(通常是Ethemet代表以太网)
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp" -- IP的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
DEFROUTE="yes" -- 启动默认路由
IPV4_FAILURE_FATAL="no" -- 不启用IPV4错误检测功能
IPV6INIT="yes" -- 启用IPV6协议
IPV6_AUTOCONF="yes" -- 自动配置IPV6地址
IPV6_DEFROUTE="yes" -- 启动默认路由
IPV6_FAILURE_FATAL="no" -- 不启用IPV6错误检测功能
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33" -- 网卡别名
UUID="45741c09-63f3-44ad-b4f9-6bcdd2e5d4f0" -- 网卡唯一标识
DEVICE="ens33" -- 网卡硬件设备名称
ONBOOT="yes" -- 是否开机自动启动
现在修改成这样的 :
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="192.168.186.50"
NETMASK="255.255.255.0"
GATEWAY="192.168.186.2"
DNS="192.168.186.2"
NM_CONTROLLED="no"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="ens33"
UUID="4cf28123-ee90-4805-9a9e-6f6285c13fea"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.92.10" -- IP地址
NETMASK="255.255.255.0" -- 子网掩码
GATEWAY="192.168.92.2" -- 默认网关
DNS="192.168.92.2" -- DNS
NM_CONTROLLED="no" -- 关闭网卡信息修改后自动生效的配置(不关闭 我们会上不了网)
配置好的效果 但是请不要粘贴复制 因为需要修改IP地址和网关信息
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="3eb24482-4c4c-4560-ae22-da0346d009a1"
DEVICE="ens33"
ONBOOT="yes"
BOOTPROTO="static"
IPADDR="192.168.186.152"
NETMASK="255.255.255.0"
GATEWAY="192.168.186.2"
DNS="192.168.186.2"
NM_CONTROLLED="no"
3.2.3 停止 NetworkManager 服务
这样才能上网
停止服务
[root@localhost network-scripts]# systemctl stop NetworkManager.service
移除自动启动
[root@localhost network-scripts]# systemctl disable NetworkManager.service
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
3.2.4 编辑/etc/resolv.conf 文件
[root@localhost network-scripts]# vi /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.92.2
nameserver 192.168.92.2 这个是新添加的内容
3.2.5 重启网络服务
[root@localhost network-scripts]# systemctl restart network.service
servcie network restart
3.2.6 验证是否可以正常上网
查看网卡配置
[root@localhost network-scripts]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e8:76:84 brd ff:ff:ff:ff:ff:ff
inet 192.168.92.38/24 brd 192.168.92.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee8:7684/64 scope link
valid_lft forever preferred_lft forever
ping一下百度 看一下是否可以正常上网
4 linux目录结构
Linux系统的目录结构图:
我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /。
其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。
- 绝对路径:
路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。
- 相对路径:
路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法啦
(家)目录 | /root,/home/{UserName} |
---|---|
普通用户可执行文件 | /bin,/usr/bin,/usr/local/bin |
系统管理员可执行文件 | /sbin,/usr/sbin,/usr/local/sbin |
配置文件目录 | /etc |
临时文件目录 | /tmp |
存放应用程序和文件 | /usr |
获取命令帮助:
man | man 命令,优点是,内核自带,缺点,大部分的帮助都是英文 |
---|---|
--help | 命令 --help 优点是:部分命令提供中文,缺点:不是所有的命令都有这个帮助文件 |
命令大全手册 | |
问度娘 |
5 和目录相关的命令
5.1与目录相关的命令:
pwd | 用于显示当前所在的完整路径 |
---|---|
mkdir | 用于创建一个目录。 -p 该选项用于创建多级目录。 |
cd | 用于切换目录 | 路径 . 表示当前目录 .. 表示上级(父级)目录 ~ 表示用户的家目录,如果在~跟用户名,就表示要去到该用户的家目录。 "-" 表示与上次所在目录进行切换。 相对路径:相对于当前所在位置而出发的路径。 绝对路径:以/(根目录)开始的路径。 |
ls | 用于显示目录 | 文件的信息 -a:显示所有的文件夹内容(包括隐藏) -l:用于显示文件/夹的详细信息 -h:与-l配合使用,可以显示文件的体积大小(自适应单位b,k,m,g ...) -d:跟上指定的目录时,就会显示该目录的信息,不会显示目录下的文件 |
cp | 语法:cp [path]/file1 [path]/file2 用于copy(拷贝)文件/夹的命令 如果拷贝的是一个文件夹时,需要配合选项-r来使用 |
mv | 语法:mv [path]/file [path]/ 改名:mv fileName1 fileName2 |
touch | 用于创建一个空白的文本文件,也可以修改文件/夹的时间戳 |
rm | -r 表示递归处理 -f 表示强制执行 |
rmdir | 用于删除目录使用,但只能删除空目录。 |
5.1 查看文件内容
查看小文件: cat、head、tail
查看大文件:less
5.1.1 查看小文件:cat
适合查看一个屏幕以内数据
命令格式:cat [参数] 文件名
其中参数:
-n:对输出的所有行编号,由1开始对所有输出的行数编号
# 查看文件内容
cat f1
# 查看文件内容,同时输出行编号
cat -n f1
5.1.2 查看文件开头:head
查看文件开头几行,默认是前10行
命令格式:head [参数] 文件名
其中参数: -n 数字:查看前 数字行
# 查看文件前10行内容
head f1
# 查看文件前5行内容
head -n 5 f1
5.1.3 查看文件结尾:tail
1)查看文件结尾
查看文件后几行,默认是后10行
命令格式:tail [参数] 文件名
其中参数: -n 数字:查看后 数字行
# 查看文件后10行内容
head f1
# 查看文件后5行内容
head -n 5 f1
2)实时查看更新的文件内容
用 tail -f 文件名 方式实时监控文件内容是否更新,如果更新,则输出更新的内容。此种方式需要 ctrl+v 退出。
示例:
在客户端1用 tail -f 命令查看实时日志
在客户端2 用 echo “xxx” >> f3!
客户端1就能实时的查看到追加进来的数据
tail -f 通过ctrl + c 结束
5.1.4 查看大文件:less
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。
可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
命令格式:less [-参数] 文件
命令功能:
使用 less 可以随意浏览文件,而且 less 在查看之前不会加载整个文件。
参数:
-m 显示文件的百分比
-N 显示每行的行号
在文件内的操作命令:
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
j:向下滚动一行
k:向上滚动一行
G:跳转到文件尾
g: 跳转到文件头
q:退出
5.2 筛选文件内容
5.2.1 行筛选:grep
grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
命令格式:grep [参数] '搜寻字符串' 文件名
其中:
参数:
-i:不区分大小写
-v: 反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
-n: 顺便输出行号
搜寻字符串:
可以完全匹配字符串
也可以使用正则字符串,利用正则匹配
正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的行首。
$: 匹配正则表达式的行尾。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
. :表示任意单个字符,如 a..b,a12b、aabb都可以。
* :表示有0个或多个 某个字符,如 ab,a必须有,但b可以有0到多个;a,a可以有0到多个,也就是所有。
示例:
# 创建grepf1文件, 内容如下
[root@localhost ~]# vim grepf1
aabbccaa
ddaamm
bbddee
hello world
one world
one dream
# 筛选带有aa的行
[root@localhost ~]# grep aa grepf1
aabbccaa
ddaamm
# 筛选不带有aa的行
[root@localhost ~]# grep -v aa grepf1
bbddee
hello world
one world
one dream
# 筛选以a开头的行
[root@localhost ~]# grep ^a grepf1
aabbccaa
# 筛选以a结尾的行
[root@localhost ~]# grep a$ grepf1
aabbccaa
# 筛选a-c范围的行
[root@localhost ~]# grep [a-c] grepf1
aabbccaa
ddaamm
bbddee
one dream
[root@localhost ~]# grep a.b grepf1
aabbccaa
[root@localhost ~]#
[root@localhost ~]# grep ab. grepf1
aabbccaa
[root@localhost ~]# grep a*b grepf1
aabbccaa
bbddee
[root@localhost ~]# grep ab* grepf1
aabbccaa
ddaamm
one dream
5.2.2 列筛选:awk
awk 是可以根据指定分隔符来筛选列的数据
命令格式:awk [-F '分隔符'] '{print $n[, $n]}' 文件名
其中:
分隔符:默认分隔符是"空白键" 或 "[tab]键",可以不用 -F 指定
按照指定的$n 来获取指定列的数据,$n 如下:
$0:表示所有列;
$1:表示第一个列;
$n:表示第n个列;
# 创建awkf2文件, 内容如下
[root@localhost ~]# cat awkf2
-rw-------. 1 root root 953 6月 20 2018 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 8月 11 11:29 dir1
drwxr-xr-x. 4 root root 30 8月 11 11:30 dir2
-rw-r--r--. 1 root root 3 8月 11 15:55 f1
# 筛选 awkf2文件中 第1列数据
# 分隔符是\t([tab]键)
[root@localhost ~]# awk '{print $1}' awkf2
-rw-------.
drwxr-xr-x.
drwxr-xr-x.
-rw-r--r--.
# 筛选 awkf2文件中 第1列、第9列数据
[root@localhost ~]# awk '{print $1, $9}' awkf2
-rw-------. anaconda-ks.cfg
drwxr-xr-x. dir1
drwxr-xr-x. dir2
-rw-r--r--. f1
# 筛选awkf2文件中所有列
[root@localhost ~]# awk '{print $0}' awkf2
-rw-------. 1 root root 953 6月 20 2018 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 8月 11 11:29 dir1
drwxr-xr-x. 4 root root 30 8月 11 11:30 dir2
-rw-r--r--. 1 root root 3 8月 11 15:55 f1
5.2.3 管道符合:|
利用Linux所提供的管道符 “|” 将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
command1正确输出,作为command2的输入,然后comand2的输出作为,comand3的输入,comand3输出就会直接显示在屏幕上面了。
通过管道之后:comand1,comand2的正确输出不显示在屏幕上面。
注意:
1)管道命令只处理前一个命令正确输出,不处理错误输出。
# 筛选 ll 命令的结果中包含dir的行
[root@localhost ~]# ll | grep dir
drwxr-xr-x. 2 root root 6 8月 11 11:29 dir1
drwxr-xr-x. 4 root root 30 8月 11 11:30 dir2
[root@localhost ~]#
# 筛选 ll 命令的结果中第9列
[root@localhost ~]# ll | awk '{print $9}'
anaconda-ks.cfg
awkf2
dir1
dir2
f1
# 筛选ll命令的结果中包含dir的文件名
# 先筛选列,后筛选行
[root@localhost ~]# ll | awk '{print $9}' | grep dir
dir1
dir2
5.2.4 输入输出重定向
5.2.4.1 输出重定向
对于任何一条linux 命令执行,它会是这样一个过程:
一个命令执行了:
先有一个输入:输入可以从键盘,也可以从文件得到。
命令执行完成:成功了,会把成功结果输出到屏幕:standard output默认是屏幕
命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕
如果想把命令的结果输出的文件,则需要输出重定向符号:
> : 输出重定向到文件,覆盖写入文件;
>>:输出重定向到文件,追加写入文件;
三种输入输出的代码分别是:
1)标准输入(stdin);代码为 0 ;
2)标准输出(stdout):代码为 1,不写默认标准输出;
3)错误输出(stderr):代码为 2 ;
下面就有如下输出方式:
> : 标准输出覆盖写入文件
>> : 标准输出追加写入文件
2> : 错误输出覆盖写入文件
2>> : 错误输出追加写入文件
系统输出位置:
# 将上面的命令的结果覆盖写入文件 s1
[root@localhost ~]# ll | awk '{print $9}' | grep dir > s1
[root@localhost ~]# cat s1
dir1
dir2
# 将上面的命令的结果追加写入文件 s1
[root@localhost ~]# ll | awk '{print $9}' | grep dir >> s1
[root@localhost ~]# cat s1
dir1
dir2
dir1
dir2
# 命令报错,错误信息输出到控制台
[root@localhost ~]# ls saf > s2
ls: 无法访问saf: 没有那个文件或目录
[root@localhost ~]# cat s2
# 命令报错,错误信息输出到文件
[root@localhost ~]# ls saf 2> s2
[root@localhost ~]# cat s2
ls: 无法访问saf: 没有那个文件或目录
[root@localhost ~]#
5.2.4.2 输入重定向
将标准从键盘输入改为从文件输入。
cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从
标准输入读取内容并显示,它常与重定向符号配合使用。
下面简单说明几种使用方式和作用
1)cat << EOF,以EOF输入字符为标准输入结束:
2)cat > filename,创建新文件,并把标准输入输出到filename文件中,以ctrl+d作为输入结束:
3)cat > filename << EOF,以EOF作为输入结束,其中EOF可以是任何字符串,和ctrl+d的作用一样:
![file](http://www.hainiubl.com/uploads/md_images/202301/06/17/<img src="image-20230105112638948.png)
一种应用方式:
# 切换到目标用户后执行相应命令并退出, 一般用在shell编程中
su - user3 << EOF
mkdir www
touch wwwf
EOF
5.3 搜寻替换文件内容
5.3.1 搜寻文件内容
sed 搜寻文件语法格式如下:
# 搜寻文件中第N行的数据
sed -n 'Np' 文件名
# 搜寻文件中第N1到N2行的数据
sed -n 'N1,N2p' 文件名
# 搜寻文件中包含字符串sss 的行的数据
sed -n '/sss/p' 文件名
示例:
# 将ip add的命令结果覆盖写入 ip_file
[root@localhost ~]# ip add > ip_file
[root@localhost ~]# cat -n ip_file
1 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3 inet 127.0.0.1/8 scope host lo
4 valid_lft forever preferred_lft forever
5 inet6 ::1/128 scope host
6 valid_lft forever preferred_lft forever
7 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
8 link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
9 inet 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
10 valid_lft forever preferred_lft forever
11 inet6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
12 valid_lft forever preferred_lft forever
# 搜寻文件中第5行的数据
[root@localhost ~]# sed -n '5p' ip_file
inet6 ::1/128 scope host
# 搜寻文件中第3到5行的数据
[root@localhost ~]# sed -n '3,5p' ip_file
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
# 搜寻文件中包含 link 的行的数据
[root@localhost ~]# sed -n '/link/p' ip_file
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
# 搜寻文件第3到5行中,包含 inet 的行的数据
[root@localhost ~]# sed -n '3,5p' ip_file | sed -n '/inet/p'
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
5.3.2 搜寻替换文件内容
sed 搜寻替换文件语法格式如下:
#-----模拟替换-----
# 全局搜寻对应的字符串进行替换,并将替换后的内容输出到屏幕(不修改文件内容)
sed 's/搜寻的字符串/替换的字符串/g' 文件名
# 搜寻N1到N2行中对应的字符串进行替换,并将替换后的内容输出到屏幕(不修改文件内容)
sed 'N1,N2 s/搜寻的字符串/替换的字符串/g' 文件名
#-----真正替换-----
# 全局搜寻对应的字符串进行替换,文件内容修改
sed -i 's/搜寻的字符串/替换的字符串/g' 文件名
# 搜寻N1到N2行中对应的字符串进行替换,文件内容修改
sed -i 'N1,N2 s/搜寻的字符串/替换的字符串/g' 文件名
示例:
# 【模拟替换】全局搜寻inet替换为hhhh,并将替换后的内容输出到屏幕, ip_file文件内容不变
[root@localhost ~]# sed 's/inet/hhhh/g' ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
hhhh 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
hhhh6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
hhhh 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
hhhh6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost ~]#
# ip_file文件内容不变
[root@localhost ~]# cat ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
inet 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 【真正替换】 ip_file文件内容改变
[root@localhost ~]# sed -i 's/inet/hhhh/g' ip_file
[root@localhost ~]# cat ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
hhhh 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
hhhh6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
hhhh 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
hhhh6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 【模拟替换】 搜寻1到2行中link替换为mmmm,并将替换后的内容输出到屏幕
[root@localhost ~]# sed '1,2 s/link/mmmm/g' ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
mmmm/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
hhhh 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
hhhh6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
hhhh 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
hhhh6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 文件并没有改变
[root@localhost ~]# cat ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
hhhh 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
hhhh6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
hhhh 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
hhhh6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 【真正替换】 文件内容改变,但也只改变强两行符合条件的数据
[root@localhost ~]# sed -i '1,2 s/link/mmmm/g' ip_file
[root@localhost ~]# cat ip_file
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
mmmm/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
hhhh 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
hhhh6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e3:58:3f brd ff:ff:ff:ff:ff:ff
hhhh 192.168.142.177/24 brd 192.168.142.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
hhhh6 fe80::20c:29ff:fee3:583f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
5.4 查找文件或目录:find
在目录中递归查找文件或目录。
命令格式: find [目录] -name 文件或目录名
示例:
# 创建目录lib
[root@worker-1 ~]# mkdir -p xinniu/lib
# 创建目录lib2
[root@worker-1 ~]# mkdir -p xinniu/lib2
# 给lib目录添加文件
[root@worker-1 ~]# touch xinniu/lib/ff1
[root@worker-1 ~]# touch xinniu/lib/ff2
[root@worker-1 ~]# touch xinniu/lib/fm1
[root@worker-1 ~]# touch xinniu/lib/maf
# 给lib2目录添加文件
[root@worker-1 ~]# touch xinniu/lib2/ff3
# 筛选 xinniu目录下文件名包含f的文件路径名(相对路径)
[root@worker-1 ~]# find xinniu -name '*f*'
xinniu/lib/ff1
xinniu/lib/ff2
xinniu/lib/fm1
xinniu/lib/maf
xinniu/lib2/ff3
# 筛选 xinniu目录下文件名包含f的文件路径名(绝对路径)
[root@worker-1 ~]# find /root/xinniu -name '*f*'
/root/xinniu/lib/ff1
/root/xinniu/lib/ff2
/root/xinniu/lib/fm1
/root/xinniu/lib/maf
/root/xinniu/lib2/ff3
注意:find 要查找的目录不能是链接。
[user3@bogon ~]$ ll
drwxrwxr-x. 3 user3 user3 17 4月 7 09:45 m1
lrwxrwxrwx. 1 user3 user3 23 4月 7 09:47 mlink -> /home/user3/m1/m11/m111
#
[user3@bogon ~]$ find -name m111
./m1/m11/m111
# mlink是链接,所以查不出来
[user3@bogon ~]$ find mlink -name m111
5.2 其他网络命令
从本机拷贝数据到远程的服务器上
要求:必须知道对方的账户和密码,且具备相应的权限。
语法:scp [-r] 要拷贝的文件 用户名@主机ip:目标位置
例如:
scp /root/install.log root@192.168.89.128:/home
从远程服务器上拷贝数据到本机:
scp 用户名@主机ip:目标文件 本机位置
例如:
scp root@192.168.89.128:/home/install.log /root
登录远程服务器:
ssh {UserName}@Host_IP
例如:
ssh root@192.168.89.128
回车之后,如果首次访问,会提示是否继续连接。接下来要求输入远程服务器的密码。
6 免密码登录
Linux免密登录使用的RSA算法。
RSA本身是一种非对称加密算法,会生成公钥和私钥。
公钥 | 使用公钥对内容进行加密 | 天王盖地虎 |
---|---|---|
私钥 | 持有私钥的PC才能正常访问公钥加密的内容 | 宝塔镇河妖 |
只要持有私钥就能访问公钥加密的内容,这种事情本身就是存在风险的。一旦私钥丢失,那么服务器上的数据就存在被窃取的风险。
但是Linux生成公钥和私钥的时候支持对私钥证书文件添加密码。
6.1 证书的生成:
ssh-keygen
第一次提示:你的证书文件存放位置
第二次提示:对私钥加密,输入密码。如果不需要输入密码,直接回车。
第三次提示:私钥证书的密码确认操作。
证书文件会存放在当前账户的家目录下的隐藏目录".ssh"目录下,在该目录下会有以下4个文件:
id_rsa | 私钥 | 执行证书生成命令才会有 |
---|---|---|
id_rsa.pub | 公钥 | 执行证书生成命令才会有 |
known_hosts | 曾经访问过的服务器信息 | 每次ssh、scp、ssh-copy-id到远程服务器时就会保存记录到此文件中,以后再此访问该服务器时就不会再提示那一句"你确定要继续访问吗 yes/NO?" |
authorized_keys | 记录来访服务器的公钥文件内容 | 该文件会记录访问本机的远程服务器的公钥证书文件内容,只有对应的私钥才能进行验证。 |
6.2 证书注册:
将本机的公钥证书文件注册到远程服务器上,此后就可以使用私钥证书进行登录。
ssh-copy-id {UserName}@Host_IP
执行此命令,会要求输入远程服务器的对应账户的密码。
这一步就是向远程服务器注册本机的id_rsa.pub文件(公钥)内容。此后只有本机上与公钥文件共同生成的私钥才能够进行免密登录。
7 进程管理
7.1 概念
进程通俗来说,运行中的程序,在linux下,知道程序要运行,首先就是将磁盘中相应的可执行文件加载到内存中。
程序被加载为进程的示意图:
1)用户执行程序。
2)程序加载到内存中。
a)给程序一个临时的pid;
b)查看执行的权限,如果用户没有执行权限,那么拒绝操作,如果有,开始加载程序执行的相关资料;
c)确认临时的PID;
7.2 静态查看进程:ps
Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程.。
要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
命令格式:ps [参数]
命令功能:
用来显示当前进程的状态。
示例:
1)列出目前所有的正在内存当中的程序
#查看系统中所有的进程,使用Linux标准命令格式(带父ID)
[root@localhost ~]# ps -ef
#查看系统中所有的进程,使用BS操作系统格式(带CPU和内存信息)
[root@localhost ~]# ps -aux
2)ps -aux 命令说明
每个字段的详细说明:
3)ps -ef 命令说明
其中各列的内容意思如下:
UID :用户ID、但输出的是用户名
PID :进程的ID
PPID :父进程ID
C :进程占用CPU的百分比
STIME :进程启动的时间
TTY :该进程在那个终端上运行,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。
TIME:进程已经占用的CPU的时间
CMD :命令的名称和参数
4)ps 与grep 常用组合用法,查找特定进程
7.3 终止进程:kill
Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。
通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/top等工具获取进程PID,然后 使用kill命令来杀掉该进程。
# 等待执行完后并终止进程(不强制),这种方式如果程序死循环则无法退出
kill 进程号
# 强制终止进程
kill -9 进程号
示例:
1)查看指定进程,并终止进程
ps -aux | grep xxx
kill 查出来的指定进程号
2)查看指定进程,并强制终止进程
ps -aux | grep xxx
kill -9 查出来的指定进程号
7.4 实时监控进程:top
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。比较准确的说,top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU最“敏感”的任务列表。
该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。
命令格式:top
命令功能:
显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等。
示例:
**1)显示进程信息
说明:前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。
第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:1)当前系统时间2)系统运行时间3)当前登录系统用户数4)load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行,Tasks — 任务(进程),具体信息说明如下:
1)系统现在总进程数
2)处于运行中的进程数
3)处于休眠的进程数
4)处于停止状态的进程数
5)处于僵尸状态的进程数
第三行,cpu状态信息,具体属性说明如下:
5.9%us — 用户空间占用CPU的百分比。
3.4% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
90.4% id — 空闲CPU百分比0.0%
wa — IO等待占用CPU的百分比0.0%
hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.2% si — 软中断(Software Interrupts)占用CPU的百分比
第四行,内存状态,具体信息如下:
1)物理内存总量(32GB)
2)使用中的内存总量(14GB)
3)空闲内存总量(18GB)
4)缓存的内存量 (169M)
第五行,swap交换分区信息,具体信息说明如下:
1)交换区总量(32GB)
2)使用的交换区总量(0K)
3)空闲交换区总量(32GB)
4)缓冲的交换区总量(3.6GB)
第六行,空行。
第七行以下:各进程(任务)的状态监控,项目列信息说明如下:
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
2)高亮显示当前运行进程
敲击键盘“b”(打开/关闭加亮效果)
3)进程字段排序
默认进入top时,各进程是按照CPU的占用量来排序的,敲击键盘“x”(打开/关闭排序列的加亮效果)
通过”shift + >”或”shift + <”可以向右或左改变排序列
8 查看内存情况
free:
可以查看系统内存和 swap 交换分区的使用情况,其输出和 top 命令的内存部分非常相似。
命令格式:free [参数]
其中:
参数如下:
-b:以字节为单位显示;
-k:以 KB 为单位显示,默认显示;
-m:以 MB 为单位显示;
-g:以 GB 为单位显示;
例如:
[root@localhost data]# free
total used free shared buff/cache available
Mem: 995892 143696 698852 7816 153344 682556
Swap: 2097148 0 2097148
其中:
- 第一行:total 是总内存数,used 是已经使用的内存数,free 是空闲的内存数,shared 是多个进程共享的内存总数,buffers 是缓冲内存数,cached 是缓存内存数。默认单位是 KB。
- 第二行:-/buffers/cache 的内存数,相当于第一行的 used-buffers-cached。+/buffers/cache 的内存数,相当于第一行的 free+buffers+cached。
-
第三行:total 是 swap 交换分区的总数;used 是已经使用的 swap 交换分区数,free 是空闲的 swap 交换分区数。默认单位是 KB。
一般free命令可以查看现在内存的使用量,此时大家需要注意一个问题就是交换区内存的使用,一般情况下交换区的内存都是不会使用的,除非物理内存已经被占满才会使用交换区内存,那么这个时候你就需要使用进程管理工具 ps 或者 top 来查看到底是谁占用了大量内存资源,然后通过 kill命令来杀死进程,释放资源(当然杀死之前需要判断是否为