操作系统简介
世上本没有路,走的人多了,便变成了路。——鲁迅
这句话真的是鲁迅说的,出自鲁迅的《故乡》,我们可以理解为一个东西用的人多了,自然而然就会把这个东西的使用方式打磨完善了,人类自动获得了智慧开始就掌握了工具的使用方法。众所周知做不同的事情就需要有不同的方法,走不同的路,也就有了不同的工具。
一台机器往往有不同的零件组成,一台电脑也是由很多不同的硬件组成,这么多的硬件设备,就需要有一个系统去代替我们管理好,这个就是操作系统。
操作系统需要完成的任务很简单,就是去学习每个硬件的不同使用方法,专业的术语叫“安装驱动程序”,当操作系统学会了每个硬件的使用方法之后,就会以某种人类可以操作的方式来被人类使用,有的操作系统是图形化界面的,我们可以鼠标点击来操作,有的是命令行的,我们需要输入命令来操作,不管是哪种方式,最终都是让计算机硬件来为我们而工作。
Linux操作系统
不同的人对计算机有不同的操作习惯,不同的使用场景对操作系统有不同的挑战,所以当前就出现了多种多样的操作系统
- Windows
- 收费闭源操作系统,主要用于日常办公、游戏、娱乐多一些
- Linux
- 免费的,开源的,主要用于服务器领域,性能稳定,安全
- Unix
- 用于封闭的硬件环境,企业的应用依赖于定制化开发
Linux图谱
Linux发展到今天出现了大量不同的分支。不同的分支都有不同的发展方向,可以扫描下面二维码,查看Linux发现分支图,或者点开此链接。
Linux名词
- Linux系统内核指的是一个由Linus Torvalds负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。
- Linux发行套件系统是我们常说的Linux操作系统,也即是由Linux内核与各种常用软件的集合产品
linux初始配置:
[root@192 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@192 ~]#systemctl status firewalld //查看防火墙状态
[root@192 ~]# setenforce 1
[root@192 ~]# getenforce
Enforcing
[root@192 ~]# setenforce 0
[root@192 ~]# getenforce
Permissive
[root@192 ~]#systemctl disable firewalld //永久关闭
[root@192 ~]#systemctl enable firewald.service //开机启动
[root@192 ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@192 ~]# source /etc/selinux//config
[root@192 ~]# hostnamectl set-hostname server1
[root@192 ~]# yum install bash-completion
#selinux三种状态
SELINUXTYPE=disable #禁用
SELINUXTYPE=Enforcing #启用。强制模式
SELINUXTYPE=Permissive #宽容模式
初识shell:
shell相当于用户和系统内核之间的一个翻译官角色,shell脚本可以方便地与系统交互,完成系统管理以及批处理任务。shell处于操作系统与应用之间,起到桥梁的作用。
我们可以使用shell实现对Linux系统单的大部分管理,例如:
- 文件管理
- 用户管理
- 权限管理
- 磁盘管理
- 软件管理
- 网络管理
- …
使用shell的两种方式
- 交互式命令行
- 默认等待用户输入命令,输入一行回车后执行一行命令
- 效率低 适合少量的工作
- shell脚本
- 将需要执行的命令和逻辑判断语句都写入一个文件中,一起运行
- 效率高 适合完成复杂,重复性工作
bash shell提示符
登录Linux系统之后,默认进入交互式的命令行界面,在光标前边会出现提示符
[root@localhost ~]#
[用户名@主机名 目录名]权限标识
- 权限标识
- 超级管理员权限就表示为
#
- 普通用户标识为
$
- 超级管理员权限就表示为
这个提示符格式被$PS1
控制,我们可以查看这个变量
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
# \u表示是用户名 \h表示的是主机名 \W表示的当前所在目录 \$是权限标识
[root@localhost ~]# export PS1="{\u@\h}\W \$"
{root@localhost}~ $
# 可以通过export命令修改PS1变量,让提示符可以根据你的习惯变化
shell语法
命令 选项 参数
[root@localhost ~]# cal --year -m 2020
- 命令
cal
是命令,用于查看日历
- 选项
--year
是选项,表示显示一整年,这个是一个长选项,也就是单词都拼全了,需要两条-
符号-m
是短选项,是首字母,表示每个星期的星期一作为第一天- 对于有些命令而言,可以不写选项,这样命令会有个默认的行为
- 短选项可以多个合并在一起,比如上面的命令可以写成
-ym
其中y是year简写,可以和m写在一起,而长选项不支持写在一起
- 参数
2020
是参数,参数是命令作用的对象,表示查看的是2020年的日历
我们也可以查看这个命令的所有选项
[root@localhost ~]# cal --help
用法:
cal [选项] [[[日] 月] 年]
选项:
-1, --one 只显示当前月份(默认)
-3, --three 显示上个月、当月和下个月
-s, --sunday 周日作为一周第一天
-m, --monday 周一用为一周第一天
-j, --julian 输出儒略日
-y, --year 输出整年
-V, --version 显示版本信息并退出
-h, --help 显示此帮助并退出
常用命令
alias
[root@server1 ~]# alias #查看别名
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@server1 ~]# alias wl='cat /etc/sysconfig/network-scripts/ifcfg-ens33' #创建别名
[root@server1 ~]# wl
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
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="f6002c62-9265-4937-8e17-7a9d7a2f8a05"
DEVICE="ens33"
ONBOOT="yes"
[root@server1 ~]# unalias wl #取消别名
[root@server1 ~]# cat ~/.bashrc #配置文件
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
为了让别名永久生效,可以讲修改别名的命令写入bashrc
文件,这个文件中的命令会在每次登陆命令行的时候执行
[root@localhost ~]# echo "alias wl='ip address'" >> /etc/bashrc
ls命令
[root@server1 ~]#ls --help
#用法 ls [选项]...[文件]...
— 选项:
- -a:显示所有文件及目录 (**.**开头的隐藏文件也会列出)
- -l:除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
- -d :仅列出目录本身,而不是列出目录内的文件数据(常用)
- -t:将文件依建立时间之先后次序列出
- -r:将文件以相反次序显示(原定依英文字母次序)
- -A:同 -a ,但不列出 “.” (目前目录) 及 “…” (父目录)
- -F:在列出的文件名称后加一符号;例如可执行档则加 “*”, 目录则加 “/”
- -R:若目录下有文件,则以下之文件亦皆依序列出
- -h:将显示出来的文件大小以合适的单位显示出来
- -i :显示inde号
- -b: 显示备份文件
扩展知识
[root@localhost ~]# ls -ahl
总用量 24K
dr-xr-x---. 3 root root 139 4月 2 14:00 .
dr-xr-xr-x. 17 root root 224 6月 21 2020 ..
-rw-------. 1 root root 128 4月 2 09:37 .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 176 12月 29 2013 .bashrc
-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc
drwxr-xr-x. 2 root root 32 4月 2 14:00 dir
-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc
-rw-r--r--. 1 root root 0 4月 2 14:00 test.txt
- 第一列共10位,第1位表示文档类型,
d
表示目录,-
表示文件,l
表示链接文件,d
表示可随机存取的设备,如U盘等,c
表示一次性读取设备,如鼠标、键盘等。后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。如:-r-xr-x---
的含义为当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可写,其他人没有任何权限。 - 第二列表示链接数,表示有多少个文件链接到inode号码。
- 第三列表示拥有者
- 第四列表示所属群组
- 第五列表示文档容量大小,单位字节
- 第六列表示文档最后修改时间,注意不是文档的创建时间哦
- 第七列表示文档名称。以点(.)开头的是隐藏文档
创建/删除目录mkdir
tree -C /home -L 2 颜色和深度
mkdir [-mpv] 目录名称
-p:递归创建
-v:显示创建过程
-m:配置文件的权限喔!直接配置,不需要看默认权限 (umask)
[root@localhost ~]#mkdir -m 7777 directory //配置文件的权限
[root@localhost ~]#mkdir -m 777 directory //配置文件的权限
[root@localhost ~]# mkdir a/b/c
mkdir: 无法创建目录"a/b/c": 没有那个文件或目录
# 无法直接创建多层目录
[root@localhost ~]# mkdir -p a/b/c
# 加上-p选项之后可以自动创建父级目录
[root@localhost ~]# mkdir -pv dir1/dir2
mkdir: 已创建目录 "dir1"
mkdir: 已创建目录 "dir1/dir2"
# 显示详细的创建过程
rmdir:删除目录
-p:递归删除
-v:显示删除过程
touch(创建新文件)
用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。再次touch改变文件时间戳
-
时间戳:计算机元年到现在的秒数
-
atime:(access time)显示的是文件中的数据最后被访问的时间,比如系统的进程直接使用或通过一些命令和脚本间接使用。(执行一些可执行文件或脚本)
-
mtime: (modify time)显示的是文件内容被修改的最后时间,比如用vi编辑时就会被改变(也就是Block的内容)
-
ctime: (change time)显示的是文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变(即inode内容发生改变和Block内容发生改变时)
touch:
-a;只更改atime
-m:只更改atime
-t:指定更改时
[root@localhost ~]#touch files
rm
- -f :就是 force 的意思,忽略不存在的文件,不会出现警告信息;
- -i :互动模式,在删除前会询问使用者是否动作
- -r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!
cat
用于打开文本文件并显示出来,一次性查看所有内容,文件较大时会占用io
cat [选项]... [文件]...
选项:
-
-n:由 1 开始对所有输出的行数编号
-
-b:和 -n 相似,只不过对于空白行不编号。
-
-s:当遇到有连续两行以上的空白行,就代换为一行的空白行。
-
-A:显示控制字符
**相关命令有tac:**同cat,不同是从文件末尾查看
more
more:一次性加载部分内容,翻页时才会查看其余内容,不会占用io,回车翻一行,空格一页,不支持向上翻页
less:
可以随意浏览文件,支持翻页和搜索,支持向上翻页(pg up)和向下翻页(pg dn)。向下翻页回车翻一行,空格一页,
实例:
[root@localhost ~]# less anaconda-ks.cfg
head
- -c 读取前多少个字节内容
- -n 读前多少行内容,默认十行
- -v:显示文件名
- -q:隐藏文件名,默认是隐藏
实例:
[root@localhost ~]# head -n 6 anaconda-ks.cfg
tail
会把文本文件里的最尾部的内容显示在屏幕上
tail [选项]... [文件]...
选项
- -f:循环读取
- -q:隐藏文件名,默认隐藏
- -v:显示文件名
- -c<数目>:显示的字节数
- -n<行数>:显示文件的尾部 n 行内容
- -s:与-f合用,表示在每次反复的间隔休眠S秒
实例
- 查看文件anaconda-ks.cfg尾部的3行
[root@localhost ~]# tail -n 3 anaconda-ks.cfg
[root@localhost ~]# tail -3 anaconda-ks.cfg
- 查看日志的实时更新情况
[root@localhost ~]# tail -f /var/log/messages
# ctrl+c退出
- 查看文件anaconda-ks.cfg从第10行到结尾
[root@localhost ~]# tail -n +10 anaconda-ks.cfg
stat
##详细查看
stat file #查看文件
wc
1.命令基本格式为:
- wc [选项] 文件 …
2.选项参数主要有:
-
-c 统计字节数。
-
-l 统计行数。
-
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-
-L 打印最长行的长度。
-
-help 显示帮助信息并退出
-
–version 显示版本信息并退出
vim命令
vim是一个纯命令行文本编辑器,很多文本编辑的功能都是通过键盘快捷键的方式完成,所以我们需要记住常用的键位,在vim官方网站上我们可以找到vim键盘图的完整版,不过对于初学者来说,我们只需要知道常用的就可以了
命令模式
-
a:在光标后输入
i:在光标前输入 -
A:在行尾输入入
I:在行首输入
-
O:在光标上一行输入
-
光标跳转
上下左右:kjhl
#command:跳转#个字符,如2k
- 单词跳转
w:下个单词的词首
e:当前单词的词尾
b:当前单词的词首
#command:跳转#个单词
- 行首行尾跳转
^:行首(非空白字符)
0:行首
$:行尾
- 行间移动
#G:跳转第N行 如2G,跳转到第二行
1G:跳转第1行 gg
- 句间/段间移动
x:删除光标处的字符
#x:删除光标处起始的#个字符,光标后的字符
r:替换命令
- 删除命令
d: 删除,配合光标跳转
d^: 删除光标到行首,光标处不删除
d0:删除光标到行首,光标处不删除
d$: 删除光标到行尾
dw:从光标开始删除到当前单词词尾
de:从光标开始删除到当前单词词尾
db:从光标开始删除到当前单词词首
dd: 删除光标所在行
#dd:删除多行
- 保存退出
q: 直接退出
q!:强制退出
x: 保存退出
w: 保存
w /path/to/somefile:另存为
zz; 保存并退出
wq:保存并退出
- 撤销
u:撤销上一次操作
#u:撤销#次操作
citr+r 反撤销
- 复制粘贴
p:粘贴
yy:复制
#yy:从光标开始向后复制#行
行末模式
: /或?可以进行全文搜索
n:查找下一个匹配
N:查找上一条匹配
- 定制定界
N:第N行
N,M:第N行到第M行
N,+M:第N行到第N+M行
.:当前行
$:最后一行
%:全文
/part1/,/part2/:被part1匹配到被part2匹配
使用方式:后跟一个编辑命令
d/y/
r:在指定位置插入指定文件的所有内容
查找替换
[定制定界]s/查找内容/替换内容/修饰符
修饰符:
:/ | ? #查找
1, 5s/查找内容/替换内容/g
:1, 5s/123/456/g #替换
:0, $s/123/456/g #全局替换
:%/s123/456/g #全局替换
i:忽略大小写
g:全局替换,默认情况,只替换每一行第一次出现
#:也可以作为分隔符,此时/不会作为分隔符
:w #保存
:w /路径 #另存为
按ESC键可随时退出末行模式。
简单的说,我们可以将这三个模式的关系用下图来表示:
定制Vim
配置文件:永久有效
全局:/etc/vimrc
个人:~/.vimrc
行末:当前进程有效
行号:
显示:set number,简写为set nu
取消显示:set nonumber,简写为set nonu
括号匹配
匹配:set showmatch,简写为set sm
取消:set nosm
自动缩进
启用:set ai
禁用:set noai
高亮搜索
启用:set hlsearch
禁用:set nohlsearch
语法高亮
启用:syntax on
禁用:syntax off
设置缩进长度:set ts=4
查看历史命令
~/.bash_history
history -a #追加,默认写入~/.bash_history`
history -c #删除所有历史命令
history -d #删除指定历史命令
history -r #将histfiles内容读入到目前shell的history记忆中
help history # 获取帮助
type ls #查看命令类型
whereis ls #查看命令位置,查看到相关所有文件
which ls #查找命令
id zhangsan #判断用户是否存在
echo $? 0成功,非0失败
scp /path root@192.168.30.12:路径 #发送文件
文件链接
软连接:
特点:
不论是修改源文件,还是修改软连接文件,所有文件的内容均会改变
删除软链接文件,源文件不受影响,如果删除源文件,软连接文件会失效,显示红色状态
软连接文件拥有自己的inode节点,在数据块中存储的是源文件的路径
软连接文件可以跨越文件系统(分区)进行建立
软连接可以链接目录
类似windons的快捷方式
硬链接:
特点:
不论修改源文件,还是硬链接文件,所有文件的内容均改变
不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件就可以被访问到
硬链接文件不会建立新的inode节点,也不会更改inode总数,只能为同一个inode节点分配多个文件名
硬链接文件不能跨越文件系统(分区)建立,因为不同的文件系统中inode是会被重新分配的
硬链接文件不能建立目录
读取一个文件,是通过文件名找到inode节点,然后
通过inode节点读取真正的文件内容
ln命令:创建链接文件
-s:建立软连接文件,默认情况是创建硬链接
-f:强制
ln -s 【源文件绝对路径】【链接文件名称】
重定向
文件描述符
在Linux中一切皆文件
每打开或者新建一个文件会有一个文件描述符与之对应
文件描述符是非负整数
读写文件需要使用文件描述符来指定待读写的文件
输入输出
标准输入
标准正确输出1
标准错误输出2
输出重定向
覆盖重定向
正确覆盖重定向: >
错误覆盖重定向: 2>
追加重定向
正确追加重定向: >>
错误追加重定向 : 2>>
合并标准正确输出和标准错误输出为同一个数据流进行重定向
&>: 标准覆盖重定向
&>>: 标准追加重定向
2>&1: 错误流重定向到正确流中
1>&2: 正确流重定向到错误流中
[root@server1 ~]# lln 1>out.right 2>&1
[root@server1 ~]# cat out.right
-bash: lln: 未找到命令
标准输入:
```shell
[root@server1 ~]# cat > file_in << EOF
> 太阳当空照
> 花儿对我笑
> EOF
[root@server1 ~]# cat >> file_in <<EOF
> 小鸟说
> 早早早
> EOF
[root@server1 ~]# cat file_in
太阳当空照
花儿对我笑
小鸟说
早早早
[root@server1 ~]# id zhangsan > /dev/null/
管道
使用方式
命令1 | 命令2 | 命令3
[root@localhost ~]# head /etc/passwd -n 5 | tr 'a-z' 'A-Z' > /root/passwd.out
wc命令
统计
-l:显示行数
-w:显示单词数
-c:显示字符数
cut命令
对文档内容进行分割
-d:指定分割符
-f:指定字段
sort命令
排序
-f:忽略大小写
-r:逆序
-t:字段分割符
-k:以指定字段为标准进行排序
-n:以数值进行排序
-u:排序后去重
uniq命令
去重
-c:显示每行重复出现的次数
-d:仅显示重复过的行
-u:仅仅显示不曾重复过的行
案例
以冒号为分隔符,取出/etc/passwd文件中的第六列至第十列,并将这些信息按照第三个字段的数值大小进行排序,最后仅显示
一个字段,并且统计总字符数
[root@localhost ~]# cut -d: -f6-10 /etc/passwd | cut -d/ -f3 | sort -n| uniq -c
查看centos版本号
[root@localhost ~]#cat /etc/centos-release
[root@localhost ~]#cat /etc/os-release
[root@localhost ~]#dhclient #dhcp重新分配
regedit
ssh
加密:公钥加密的只有私钥能解密
身份验证:私钥加密的公钥也是可以解密的
打比方:你和A通话,A愿意通话才会下载你的公钥,你发送的加密数据,A可以解密,A不要和你通话,就不会主动下载公钥。而A和你通话,别人是无法知道的。公钥验证私钥:验证自己拿到的公钥,是不是对方的。
修改变量
[root@localhost ~]# export LANG="en_US.UTF-8"
# 改回中文是LANG="zh_CN.UTF-8"
vim /etc/locale.conf