Linux
Linux
- ⚙️操作系统发展史
- ⚡️Linux介绍
- 💥Linux命令的使用
- 🔥Shell的拓展
操作系统发展史
Unix
1965年左后由贝尔实验室、麻省理工学院 以及 通用电气共同发起了Multics项目,想让大型主机支持300台终端
1969年前后这个项目进度缓慢,资金短缺,贝尔实验室退出了研究
1969年从这个项目中退出的Ken Thompson当时在实验室无聊时,为了让一台空闲的电脑上能够运行“星际旅行”游行,在8月份左右趁着其妻子探亲的时间,用了1个月的时间编写出了 Unix操作系统的原型
1970年,美国贝尔实验室的 Ken Thompson,以 BCPL语言 为基础,设计出很简单且很接近硬件的 B语言(取BCPL的首字母),并且他用B语言写了第一个UNIX操作系统。
因为B语言的跨平台性较差,为了能够在其他的电脑上也能够运行这个非常棒的Unix操作系统,Dennis Ritchie和Ken Thompson 从B语言的基础上准备研究一个更好的语言1972年,美国贝尔实验室的 Dennis Ritchie在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言
1973年初,C语言的主体完成。Thompson和Ritchie迫不及待地开始用它完全重写了现在大名鼎鼎的Unix操作系统
Minix
由于Unix的私有化,Andrew S. Tanenbaum(塔能鲍姆)教授自行开发与UNIX兼容的操作系统,为了避免和Unix版权上的争议,起名为mini-unix,即Mixin
Linux
因为Minix只是教学使用,因此功能并不强,因此Torvalds利用GNU的bash当做开发环境,gcc当做编译工具,编写了Linux内核-v0.02,但是一开始Linux并不能兼容Unix,即Unix上跑的应用程序不能在Linux上跑,即应用程序与内核之间的接口不一致因为Unix是遵循POSIX规范的,因此Torvalds修改了Linux,并遵循POSIX(Portable Operating System Interface,他规范了应用程序与内核的接口规范); 一开始Linux只适用于386,后来经过全世界的网友的帮助,最终能够兼容多种硬件
<p id="2"></p> |
Linux介绍
Kernel(内核)
内核分为两个版本
- 稳定版:长期稳定版
- 开发版:变更很快
发行版
市面上比较常见的有
- Ubantu
- Centos
- Debain
- SuSe
- RedHat
类Unix系统目录结构
Linux目录结构
- / : Linux下只有一个根目录,指的就是/home
- /bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等 实际存储于usr/bin
- /boot: 启动时用到的一些文件 如Linux的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub。
- /dev: 存放linux系统下的设备文件 常用的是挂载光驱 mount /dev/cdrom /mnt。
- /etc: 系统配置文件存放的目录
- /home: 系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下
- /lib: 系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。
- /lost: 系统异常产生错误时,会将一些遗失的片段放置于此目录下。
- /mnt /media: 光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。
- /opt: 给主机额外安装软件所摆放的目录。
- /proc: 此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间
- /root: 系统管理员root的家目录
- /sbin: 放置系统管理员使用的可执行命令,如fdisk、shutdown、mount 等。与 /bin 不同的是,这几个目录是给系统管理员 root使用的命令,一般用户只能”查看”而不能设置和使用。
- /tmp: 一般用户或正在执行的程序临时存放文件的目录
- /srv: 服务启动之后需要访问的数据目录
- /usr: 应用程序存放目录
- /var: 放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下
- /sys:存放系统硬件相关信息
文本编译器VIM
Vim和VI是什么
VI 是Unix和类Unix操作系统通用的文本编译器
**VIM ** 是由VI发展过来更加强大的文本编译器
两者完全兼容
VIM的模式
一般模式(可执行操作:撤销,复制,删除)
撤销: u
复制: yy
复制光标及当前行以后的内容
y + $
复制光标及当前行之前的内容
y + ^
复制某一个单词
y + w 按下w可以跳转到下一个单词粘贴: p
粘贴多行
Linux Learning
ex: 加入我想粘贴Linux Learning粘贴这一行三次
进入一般模式按下数字再按下p即可完成这部操作删除: dd
删除多行
数字+dd
删除一个单词
d + w
当光标在当前词的最前面删除的是整个单词
当光标在单词中会删除拆解出来的单词及后面的空格
删除光标前的内容
d + $
删除光标后的内容
d + ^
剪切光标处在的位置
x
一般模式下的退格键
大写X切换文字大小写(~)
替换
shift + r进入替换模式
快速跳转
跳转行头
shift + 6
跳转行尾
shift + 4
跳转至下一个单词
w
跳转至上一个单词
b
跳转至文档开始的地方
gg 或者 H
跳转到文档行尾
G 或者 L
跳转文档开始和结束可以结合数字
编辑模式
- i 在光标前进行编辑
- a 在光标后进行编辑
- o 在光标下一行进行编辑
- I 跳转到当前行头并进行编辑
- A跳转到当前行尾进行编辑
- O跳转到当前行的上一行进行编辑
指令模式
进入方式: : or /
:w 保存
:q 退出
:wq 保存并退出
:q! 不保存强制退出
:set nu 显示行数
:set nonu 关闭行数
/ + 关键字 = 查找 按n查找下一个 N查找上一个
取消高亮 :noh
替换关键词
替换当前行第一个关键词
:s/想替前的词/替换后的词
替换当前行全部关键词
:s/想替前的词/替换后的词/g
替换每一行第一个关键字
:%s/想替前的词/替换后的词
替换整篇文档全部的关键字
:%s/想替前的词/替换后的词/g
主机与虚拟机的联系
测试是否主机和虚拟机之间是否能ping通
window
ipconfig查询本机ip
Linux虚拟机
对应系统执行相应ip
inet : 网络地址
broadcast : 专门用于同时向网络中所有工作站进行发送的一个地址VMware提供三种网络连接方式
桥接模式
原理: 路由连接外网,通过DHCP服务器,动态分配ip地址,这些设备形成的网络叫做局域网
VM虚拟机连接外网方式:路由器通过PC虚拟出来的网桥连接到交换机,再通过交换机来分配多台vm设备
缺点: 没有隐私性,当前网络段下的pc设备都能访问其隐私,占用ip
NAT模式(vmnet8)
原理: PC连接到虚拟机虚拟出来的路由,虚拟路由动态分配ip给每一台vm设备形成一个虚拟局域网(这就是为什么虚拟机ip可以和本机ip不在一个网段上的原因,位于两个不同的局域网)
vmnet8: 但是如果想要PC连接到vm设备就好比外网连接PC,只能获取到简单的路由ip而不能准确定位到你本机ip,于是vmware虚拟出来一张虚拟网卡供PC使用来确定是哪一台vm设备,也就是所谓的vmnet8
仅主机模式(vmnet1)
原理: PC通过虚拟网卡连接交换机,并且与其余vm构建局域网,由于是交换机与pc打交道所以vm设备无法访问到外网
总结
虚拟路由通过NAT转址为本机ip,本机访问外网同理通过路由转址为外网ip进行访问
指定修改静态ip
进入局域网段里ens160(mac) or ens33(window)
vim /etc/sysconfig/network-scripts/ifcfg-ens160
修改内容:
Bootproto: static
IPADDR: 相同网段
GATEWAY: 于虚拟及NAT设置网关相同
DNS1: 与GATEWAY一致
保存
:wq
重启
service network restart修改IP出现的问题
主机能ping通虚拟机而虚拟机ping不通主机
可能是主机防火墙干扰
虚拟机可以ping通主机但是连不上外网
DNS设置出错
检查是否子网ip和NAT网关存在一个网段上
如果以上方法都不行可以选择关闭NetworkManager
systemctl stop NetworkManager //停止服务
systemctl disable NetworkManager //禁止服务
修改主机名
VIM到当前目录下
vim /etc/hostname
重启服务
hostnamectl set-hostname 需要修改的名设置 主机-ip
进入hosts
vim /etc/hosts修改本机hosts文件夹
172.20.10.12 sparking2
172.20.10.13 sparking3
172.20.10.14 sparking4
172.20.10.15 sparking5
172.20.10.16 sparking6
目的:实现对服务器的远程操作和连接ssh远程登陆
远程连接
window Xshell mac iTem2
ssh root@host名/ip地址
远程下载或者上传
window xftp mac FileZilla
service 服务管理
服务:常驻内存中的进程
进程:正在执行的程序和命令
以d为结尾的目录为守护进程
Centos6
service + start/stop/status/restart
重启服务
service network restartCentos7
systemctl + start/stop/status/restart
服务管理文件目录
ls /usr/lib/systemd/system
重启服务
systemctl restart network
建议在network和NetworkManager里选择一个进行保留Linux运行级别
查看默认级别 vim /etc/inittab
运行步骤: 开机->BIOS->/boot->/init进程->运行级别->运行级别对应的服务
级别0: 系统停机状态
级别1: 只允许root登陆 不支持远程登录
级别2: 多用户状态 无NFS 但没网
级别3: 完全多用户状态 有NFS 相当于命令行模式
级别4: 保留未使用
级别5: GUI窗口化模式
级别6: 重启
Centos7将级别三服务简化为multi-user.target
将级别5简化为graphical.target
查看当前级别
systemctl get-default
如果有graphical.target和multi-user.target两个级别
可以通过init + 级别进行切换Centos6启动服务前先启动init文件 单线程启动
启动Centos6 SysV服务
chkconfig --list
关闭开启network开机自启动服务
chkconfig network off/on
针对单个级别进行关闭
chkconfig --level 3 network off
防火墙
iptablesCentos7启动服务前先启动systemd文件 并行启动
调整开机自启动状态
setup 进入服务面板
开启/关闭开机自启动服务
systemctl disable/enable 某一个服务
列举所有单元
systemctl list-unit-files
enable代表开机自启动 disable反之 static代表无法确定
查看防火墙状态
systemctl status firewalld
关闭防火墙
systemctl stop firewalld关机重启操作
一分钟后关机(default)
shutdown
shutdown + number 几分钟后关机
shutdown + 具体时间 某一时间关机
停止关机操作
shutdown -c
立刻关机
shutdown now
将缓冲区的数据立刻读取到硬盘中
sync
关闭系统但不断电
halt
关闭系统且断电
poweroff
重启
reboot
<p id="3"></p> |
Linux命令基本使用
基本介绍
Shell 是一个应用程序,它连接了用户和Linux 内核,让用户能够更加高效、安全、低成本地使用Linux 内核
拓展
命令行的打开都是基于/bin/sh
Unix 最原始的shell是Bourne shell 不过用户交互性较差
Linux基于Unix 开发出Bourne Again shell 即bash
Debian系列搭载的shell是dash
帮助型命令
man查看命令手册
man + 你想要查看的命令
内嵌命令:内嵌在bash里面 ex:cd/exit/history
type查看命令类型
如果想要查看内嵌命令 里面可能会有不同版本的解释
man -f + 内嵌命令
man + 版本 + 内嵌命令 查看当前版本的解释
help查看内嵌命令
help + 内嵌命令
help查看外部命令
外部命令 --help常用快捷键
Ctrl + c 停止进程
Ctrl + l 清屏
reset 重新启动shell
上下键快速补齐之前的命令
文件目录类
pwd显示当前绝对路径
绝对路径
从根目录开始定位到当前目录的整体路径
ex: 我在中国哪个省哪个市。。。
相对路径
从现在的位置去定位目标位置
ex: 我在北京我要去哪个市 基于北京直接cd这个市
../返回上一级目录
cd -返回上一次定位的目录
cd直接回到主文件夹
Ex: cd /home/hello cd=>/home
切换用户
su + 用户名
当前根目录随之发生改变
列举文件
ls-a
显示当前目录下所有文件包括隐藏文件
ls -l / ll
显示当前目录可视化文件的全部信息 包括权限创建时间文件名等等
上两者可以合并 ls -al
创建目录
mkdir + 文件名 //在相对路径下创建一个或多个文件
ex: mkdir a mkdir /a mkdir a a/b a/b/c删除空文件
rmdir + 文件名
注意: 如果删除的文件下面还有文件则删除失败
如果想要删除一个嵌套文件夹
rmdir -p a/b/c 删除c若发现b目录文件夹下为空则再删除b创建一个空的文件夹
touch + 文件夹名
touch + 具体路径/文件夹名复制文件到指定路径下
cp 当前目录下的文件名 目标路径
如果后面填写的是一个文件会对其进行覆盖
或者虽然是目标路径但是里面已经有你想cp的文件也会出现覆盖选项
如果想要直接对其进行覆盖在cp前加上\复制目录到指定路径下
cp -r 目录 复制到的目标路径 //-r递归复制目录下的所有文件
删除文件
rm本质上操作相当于是rm -i 交互式
rm + 文件名
强制删除
rm -f + 文件名
删除目录
rm -r + 目录名
直接删除目录且没有提示
rm -rf + 目录名
删除当前目录及以下的所有文件(小心使用)
rm -rf /
删除当前目录下的所有文件
rm -f ./*移动文件
mv 当前文件 目标路径
mv 当前文件 目标路径/重命名
如果处于root文件夹下
mv 文件名 重命名后的名 可以直接实现重命名查看文件内容
cat 文件名
cat -n 文件名 //显示每一行的行号
more 文件名 //全屏查看 空格下一篇 enter下一行 b上一行 :f显示当前行数 q直接退出
less 文件名 //比more更强大的查看方式输出重定向
echo + 想要输出的内容
想要显示多空格
echo + "想要输出的内容"
支持转义
echo -e "想要输出的内容"
通过echo写入将内容写入到文件中
ll > info //将ll里的内容写入到info下
ls > info //由于info里面有内容所以将ls里的内容覆盖info
如果想要追加内容
echo "hello world" >> info
查看环境变量
echo $环境变量名
环境变量概念: 当前目录下通过环境变量调用指定命令可以直接输出结果head显示头部内容
head 文件名 //显示文件的前十行
head -n 显示的行数 文件名 显示文件的前n行tail显示尾部内容
tail 文件名 //显示文件的前后十行
tail -n 显示的行数 文件名 显示文件的后n行
tail -f 文件名 //对该文件内容进行监测 ctrl+暂停监控
监控是通过每一个文件的索引号来实现的
ls -i 文件名 查看该文件的索引号
vim 对文件操作实质上索引号发生了改变软链接
概念: 和桌面快捷方式一致,点击会去连接到某一路径下的某个程序,/bin =>/usr/bin
创建或删除软链接
ln -s /想链接的文件或者是路径 软链接名称或者某个路径下软链接名称
vim软链接,之前文件的内容也会发生改变
如果在软链接下想要看到物理路径
pwd -P
删除软链接
rm + 软链接名称 不会删除原文件
删除原文件夹下的所有文件
rm -rf 软链接名 + /
如果把原文件删除 那么软链接将不复存在硬链接
原文件和其他链接去连接innode元信息,元信息再去内存中进行查找,就算原文件删除了还是能通过别的链接获取内存数据
历史记录
history 查看所有输入过的历史记录
history + 数字 显示刚刚输入的n条命令
!行数 显示在这一行所输入的命令
history -c 清空历史记录
时间日期类
date
date 显示所有时间信息
date +%Y //显示当前年份
date +%y //显示当前年份后两位
date +%m //显示当前月份
date +%d //显示当前天数
date +%s //显示时间戳
date -d "1 days ago" //显示明天这个时间
date -s "系统时间" //设置系统时间
npdate可以同步国家系统时间cal
cal 查看日历
cal -数字 查看临近的几个月
cal -m 将周一放到第一天
cal 年份 查看当年的全部信息
用户管理类
添加用户
默认情况下有两个用户 root管理员用户 普通用户存放于/home下
添加用户
useradd 用户名
更改home下用户名的主文件夹名 用户名还是david
useradd -d /home/dava david
添加用户的同时添加组
useradd -g 已有的组名 用户名
为用户设置密码
passwd 用户名查询用户
查询用户是否存在
id 用户名 uid用户id gid组id
想要查看所有用户
cat /etc/passwd切换用户
su 用户名
exit退出到上一级用户查看自己是哪一用户
who am i //返回结果为根用户
whoani //返回当前用户sudo临时赋予最高管理员权限
想要使用sudo命令需要添加至sudoers
su root 1/
vim /etc/sudoers
Y到最后 复制root添加权限那行
粘贴修改用户名为你创建的普通用户
:wq!强制保存
现在你就在你添加的用户里可以使用sudo
sudo + 想要执行的命令删除用户
userdel + 用户名 //用户删除但是文件夹残留
userdel -r 用户名 //用户和用户文件夹全部删除查看组别信息
cat /etc/group
创建组
groupadd 组名
修改用户所处的组
usermod -g 组名 用户 //将用户添加到这组
修改组名
groupmod -n 新的组名 旧的组名
删除组
groupdel 组名
wheel组
wheel组属于管理组 可以使用sudo命令
文件属性和权限
ls -l 或者ll 一个文件的属性
查看属性显示的内容依次是
文件类型-属主权限-属组权限-其他权限 number
属主权限(u): root权限
属组权限(g): 当前组下的权限
其他权限(o): 别人访问时候的权限
a: 代表所有权限
number: 代表硬链接的数量至少要一个
mkdir创建出来的目录至少有两个硬链接一个是本身还有一个是父目录作用到文件
- r可以对文件进行读取
- w可以对文件进行修改
- x可以cd该文件
作用到目录
- r可以读取查看文件内容
- w可以对文件进行增删改查的目的
- x可cd到该目录
更改用户权限
chmod (u/g/o/a)(=+-)(r/w/x) 文件名
分别添加权限技巧
x: 1 w:2 wx: 3 r: 4 rx:5 rw:6 rwx:7
相当于是二进制 111 => 7 rwx
Chmod 777 指定文件 开启全部权限
一般设置文件都设置为644 rx-r–r–
chmod -R 777 文件 将当前目录下的所有文件都设置为777
更改所属主和所属组
更改所属主
chown 想要修改的用户 文件名/目录
+R 遍历目录下所有文件更爱所属组
chgrp 想要修改的组别 文件团队合作流程
创建一个组两个人同时链接这个组
通过权限的开与关从而实现数据交互性
如果要给外人传递数据开放其他权限即可
搜索查找类
find查找(从硬盘上去查找)
find -name 文件名 //查找当前目录及下的所有文件
find 路径 -name 文件名 //查找该路径下的所有文件
find -name "*.cfg" //查找其下的所有带有cfg的文件
find /home -user 用户名 //查找所有与该用户相关的文件
ls -lh 查看文件时文件大小显示的更加详细
find /root -size +2M //查看当前目录下大小超过2M的文件locate查找(快速从数据库内进行查找)
实时更新
updatedb
查找
locate 关键字
查找命令真实路径
which + 命令名
where + 命令 相比于which更加详细grep查找
grep -n 关键字 文件名 -n显示行号
灵活运用|来进行筛选
ls | grep .cfg //将ls返回的结果作为后面语句的参数
wc可以用来得到一个文件的详细信息
wc 文件 得到的结果分别是总行数 总单词数 总字节数
解压缩类
gzip
gzip 文件 压缩
gunzip 文件 解压
特点
可以同时解压多个文件但是都是单独生成的
不会保留原来的文件
不能压缩目录zip
zip -r total.zip 要压缩的文件或者是目录
unzip -d 指定路径 解压的文件tar
-c 产生.tar文件
-z 打包并压缩
-v 显示详细信息
-f 指定压缩后的文件名
-x 解包
-C 解包指定目录
打包
tar -zcvf 文件名.tar.gz 打包的文件可以是多个
解包
tar -zxvf 文件名 -C 解包路径
磁盘查看和分区类
查看磁盘占用情况
du 目录/文件
-a 查看子目录大小和文件大小
-h 将大小转化为KB MB
-c = -ah
-s 只显示总量
--max-depth = n //n代表文件的深度查看磁盘空间的占用情况
df -h
硬盘分类默认分为3个区 swap/boot/根目录查看内存占用情况
free -h
Mem: 物理内存
Swap: 虚拟内存查看设备挂载情况
lsblk
硬盘分类
IDE 老式硬盘 => hda
SATA 容量大 成本低
SCSI 拓展性广 传输速度快
sata和scsi对应的都是sda
显示文件系统信息
lsblk -f挂载卸载
挂载
mount /dev/cdrom /mnt/cdrom //将dev下的光盘挂载到mnt下
卸载
umount /dev/cdrom 同时也卸载了mnt/cdrom里的内容
开机自启动
vim /etc/fstab //进入到挂载区域
在新的一行填写
想要挂载谁 挂载到谁身上 文件系统类型(默认iso9660) defaults 0 0fdisk分区
查看分区信息
fdisk -l
对磁盘进行管理
fdisk 磁盘目录(可以通过fdisk -l来查看)
m进入 n划分新磁盘 p查看磁盘分区 w保存磁盘设置并退出
初始化新磁盘信息
mkfs -t xfs 磁盘的那一块分区
将磁盘进行挂载
mount /dev/sda1 /home/用户
//卸载
umount /home/用户
df -h没有新磁盘的数据
lsblk -f还保留着
进程管理类
ps
ps //列出当前用户进程状态
-e 列出所有进程
-u 列出某个用户所有进程
-f 显示完整格式的进程列表
ps aux 查看所有用户的所有进程
VSZ:虚拟内存 长时间未使用的命令就会放到其中
RSS:物理内存 经常使用的
TTY:代表哪一个终端 tty1图形化终端 tty2-6黑屏 pts/ 虚拟终端
STAT:S睡眠 T暂停 Z僵尸 s子进程 l多线程 +前台显示
ps -ef 显示标准用户进程
PIDD 副进程需要父进程先启动才能启动该进程
ps aux 用来查看资源占用率
ps -ef 用来查看父子进程关系查看远程登录进程
ps -ef | grep sshd
/usr/sbin/sshd -D是sshd远程登录的父进程
grep --color=auto sshd所运行的进程的父进程是bash的主进程终止进程
kill + PID/PPID
如果终止的是守护进程 那么远程服务器就链接不到了 但是不影响已经登录上来的进程,需要在已登陆的进程上开启sshd服务
systemctl start sshd
如果想要kill 正在运行的bash终端 需要强制删除
kill -9 PID
删除所有与关键字有关的服务
killall 关键字查看进程树
安装
yum install psmisc #using psmisc package for pstree
使用
pstree //查看进程树
pstree -p //带有PID
pstree -u //带有用户信息top实时监视系统状态
top -d 秒数 几秒刷新一次
top -i 不显示闲置或者是僵死转台的数据
top -p PID 监视单个进程
u 指定监视的用户
k 指定杀死用户netstat显示网络状态和端口占用信息
套接字: iP + 端口
netstat -anp 查看网络状态
netstat -alp 查看端口状态crontab定时任务管理
前提: 需要将crond 打开
systemctl start crond
操作
-l 查看定时任务
-e 编辑定时任务
-r 删除定时任务参数说明
* * * * * + 命令
第一个:一小时的哪一分钟
第二个:一天的哪一个小时
第三个:哪一天
第四个:哪一个月
第五个:星期几
tail -f 文件名 //用来监视后添加的文本
软件包管理
RPM概念
RedHat软件包管理工具,
查询安装过的RPM包
rpm -qa
rpm -qi 软件名 //查看安装软件的详细信息卸载软件
rpm -e RPM包
rpm -e --nodeps 软件包 //不检查依赖直接卸载安装软件
rpm -i RPM包全名 需要到cdrom package里去查找 可能会由于没有依赖而安装失败
yum
语法说明
yum [需要进行的操作] 软件包名称
删除rpm包
yum remove rpm包
yum install rpm包
yum list rpm包 //查看安装完的所有包修改镜像源
文件目录为/etc/yum.repos.d/CentOS-Base.repo
步骤一
yum install weget
步骤二
wget aliyun/网易国内Centos.repo文件
步骤三
替换: cp 下载下来的文件 原来centos文件备份
克隆虚拟机
到达虚拟机资源库右键克隆完整虚拟机
vim 到ens160下修改ip地址
注意 此ip和之前在本机host文件配置某一ip一致
下面设置主机名需要与该ip进行匹配NetworkManager是网络通信的关键所以可以暂停network服务
systemctl stop network
systemctl restart NetworkManager
ping 本机
ping 外网
ping通开始下一步更改主机名
hostnamectl set-hostname 需要修改的名
<p id="3"></p> |
Shell拓展
Shell巩固(命令解释器)
Shell最初的版本是Unix的BourneShell
最底层是硬件,操作系统内核来操作硬件,用户处于应用层,由于内核不能理解用户的各项操作,所以衍生出Shell来为用户的操作做出解释
查看Linux提供的命令解释器
cat /etc/shells
查看现在应用的shell
echo $SHELL
Shell脚本
Shell脚本
脚本格式
#!/bin/bash
创建一个脚本
mkdir scripts
cd scripts
touch hello.sh
vim hello.sh
添加如下内容
#!/bin/bash
echo "hello world"
通过bash或者是sh来执行脚本
bash/sh hello.sh
通过路径直接来执行脚本(前提:需要开放执行权限 chmod u+x 文件)
通过source来执行脚本 来源于cshell
source hello.sh
通过. 命令执行 .本质上是bashshell
bash,sh,路径都是在bash内部创建子shell来执行脚本
source, . 不需要bash嵌套直接生效变量
系统环境变量($HOME,$SHELL…)
查看所有全局变量
env / printenv
查看某个全局变量
echo $变量名
printenv 全局变量名判断是否为全局变量
bash创建一个子bash 判断是否可以查看外部变量
查看所有变量
set
输入执行自定义脚本
echo $PATH
将脚本放到如下路径下即可执行
自定义变量
基本使用
定义一个a变量
a=1
打印该变量
echo $a将创建出来的局部变量提升为全局
由于我们在子shell里面拿不到自定义变量所以来到shell
export 自己定义的变量注意事项
- 在子shell里面讲变量进行修改返回父shell是监测不到的,但是反过来是行的
- echo定义的变量是类型是字符串如果想要添加计算属性$[] / $(())
- 定义变量的时候不能包含空格
- 定义变量名不能以数字开头
创建只读变量
readonly a=2
撤销变量
unset 变量名
//只读变量不能撤销特殊变量
语法
echo $0 //代表脚本的名称
echo $1-9 //代表脚本传入的参数
echo {10} //当传入参数大于10个需要使用花括号使用
echo $1 //代表输入的第一个参数
echo $# //统计输入参数的个数
echo $* //查看参数
echo $@ //将参数以数组的形式进行包装
echo $? //返回最后一次命令的状态 0代表正常
运算符
语法结构
expr 参数一 参数二 参数三
echo $[1+2]赋值操作
a=$(expr 2 + 4)
a=$((1+3)) / a=$[1+2]
条件判断
基本条件判断
test $a = hello // [ $a = hello ]
echo $?
如果[]中间没有空格 那么返回结果永远都是0,如果里面有空格且为空值,返回结果为1大小判断
-lt 小于
-gt 大于
-eq 等于
-ne 不等于
-le 小于等于
-ge 大于等于判断权限
[ -r/w/x 文件名]
echo $?判断文件类型
[ -e /home/satrol/info ] //判断文件是否存在
[ -f 文件 ] //判断是否是一个文件
[ -d 文件 ] //判断是否是一个目录逻辑运算符
与三目操作符相似
[ hello ] && echo OK || echo Error
if条件分支语句
单分支
语法
if [ 条件判断语句 ]; then echo "正确返回的结果"; fi
结合逻辑判断
if [ $a -lt 20 ] && [ $a -gt 17 ]; then echo "congratulation"; fi
如果想要将两个数组合并
if [ $a -lt 20 -a $a -gt 17 ]; then echo "congratulation"; fi
双分支
if [ $2 -lt 18 ];
then echo "未成年";
else echo "成年";
fi多分支
if [ $3 -lt 18 ];
then echo "未成年";
elif [ $3 -lt 40 ];
then echo "中年人";
else echo "老年人";
fi
case分支语句
case $1 in
1)
echo "first"
;;
2)
echo "second"
;;
3)
echo "thrid"
;;
*)
echo "other"
;;
esacfor循环
第一种写法
//在双小括号里面可以书写运算符号
for(( i=1; i<=$1; i++ ))
do
sum=$[$sum+$i];
done
echo $sum;第二种写法
for os in Linux windows macos;do echo $os;done
//两种写法结合
for i in {1..100}; do sum=$[$sum+$i]; done; echo $sum$@ 和$*区别
echo '========$*======'
for param in "$*"
do
echo $param
done
//返回结果一行显示
echo '=======$@======='
for parm in "$@"
do
echo $parm
done
//显示结果多行显示
while循环
示范
a=1
while (($a<=$1))
do
# sum2=$[$sum2+$a];
# a=$[$a+1]
let sum2+=a
let a++
done
echo $sum2
读取控制台输入
选项
-t 代表延迟时间
-p 代表提示信息代码演示
read -t 10 -p "你的姓名是"name
echo "Hello,$name"
函数
系统函数
$()命令替换
对于系统函数的调用
basename
basename + 路径 //返回结果为路径最后一位
basename + 路径 + 后缀 //可以切除后缀dirname
dirname + 绝对路径 //截取到的是除最后一位其余的路径
将相对路径转化为相对路径
echo "script path":$(cd $(dirname $0);pwd)自定义函数
简单的加法运算
function add(){
s=$[ $1+$2 ]
echo "和为:"$s
return $s //return
return返回的结果必须是数字
}
read -p "第一个参数为:" a
read -p "第一个参数为:" b
add $a $b
echo "和: $?"
return返回的值是在0-255范围内的返回值且结果不受限函数
function add(){
s=$[ $1+$2 ]
echo $s
}
read -p "第一个参数为:" a
read -p "第一个参数为:" b
sum=$(add $a $b)
echo "合为: $sum"归档文件
tar -c代表归档
tar -z代表压缩
//归档参数必须只能为1个
if [ $# -ne 1 ];
then
echo "输入的参数个数不正确";
exit
fi
//第一个参数必须为目录
if [ -d $1 ];
then
echo;
else
echo;
echo "输入的不是目录"
echo;
fi
DIR_NAME=$(basename $1);
DIR_PATH=$(cd $(dirname $1); pwd);
DATE=$(date +%y%m%d);
FILE=archieve_{$DIR_NAME}_{$DATE}.tar.gz;
DEST=/root/archieve/$FILE
# 开始归档
echo "开始归档....."
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ];
then
echo
echo "归档成功"
echo "归档成功的文件为$DEST"
else
echo "归档失败"
fi
exit
正则表达式
特殊字符
^ 以谁开头
^a //以a开头
$ 以谁为尾
bash$ //以bash结尾
^$代表空行
cat 文件 | grep -n ^$ //查看空行位置
通配符
r..t //可以匹配到rt中间两位的数字
r*t //可以匹配到rt中间无数个重复的字母
.* //任意字符都可以进行匹配字符区间
[a-z]: 匹配a-z内的单个字符
[a-z]*: 匹配任意长度a-z内的任意字符字符转意
cat archieve_test.sh | grep $ //由于$匹配的是结尾所以不转意会全部输出
cat archieve_test.sh | grep '\$' //输出带有$手机号正则匹配
echo "12256483942" | grep -E ^1[3-8][1-9]{9}$
文本处理工具
选项参数说明
-d 按照指定分隔符分割列
-f 提取第几列 截取多列逗号分隔代码展示
cut -d "分隔符" -f 第几列 文件名
提取列数可以简写
提取1-4列
cat /etc/passwd | grep bash$ | cut -d "分隔符" -f 1-4
提取4列后
4-
提取4列前
-4切割ip地址
ifconfig ens160 | grep netmask | cut -d " " -f 10
awk
选项参数
-F 分隔符 默认情况下为空格
-v 赋值用户定义的变量代码
使用grep + cut进行筛选
cat /etc/passwd | grep ^root | cut -d ":" -f 7
使用awk进行筛选
cat /etc/passwd | awk -F ":" '/^root/ {print $7}'
使用逗号进行分割 由于筛选列数是代码块可以使用逗号进行分割
cat /etc/passwd | awk -F ":" '/^root/ {print $1","$7}'
在筛选结果的最前面和最后面添加一句话
cat /etc/passwd | awk -F ":" 'BEGIN{print "usershell"}{print $7}END{print "end of file"}'将passwd用户的id都加上1
cat /etc/passwd | awk -F ":" '{print $3+1}'
-v定义的值为一个变量可供后面使用
cat /etc/passwd | awk -v i=1 -F ":" '{print $3+i}'awk的内置变量
FILENAME: 文件名
NR: 行的个数
NF: 切割后列的个数
代码示范
awk -F ":" '{print "文件名: " FILENAME " 行数: "NR " 列数: " NF}' /etc/passwd
awk提取空行
ifconfig | awk '/^$/ {print NR}'
awk截取ip地址
ifconfig | awk '/netmask/ {print $2}'
巩固
who //查看所有已登陆的用户
mesg //查看是否打开消息功能
who -T //查看用户是否打开消息功能
mesg n //关闭消息功能
mesg y //打开消息功能
write 用户名 终端窗口号 //发送消息