linux学习笔记

322 阅读15分钟

linux操作系统

冯若依曼体系

  1. 运算器
  2. 控制器
  3. 存储器
  4. 输入
  5. 输出

RAM

逻辑io

速度快,容量小

断电会丢失数据

ROM

只读内存

容量大,速度慢

长久保存,物理IO

CPU

控制器&运算器

ROM两种

机械&固态硬盘

机械原理(HDD)

磁片,被磁化为1,未磁化0

怕摔

固态硬盘(SSD)

闪存颗粒(固态电子存储芯片阵列)

2.网络连接概念

  1. IP地址
  2. 子网掩码
  3. 默认网关(不需要外网可以省略)
  4. DNS适配器(不需要外网可以省略)

1.IP地址是一种逻辑地址,用来标识网络中的一个个主机

  • IP地址=网络地址+主机地址
  • IP地址是4*8bit(IP4协议)

2.子网掩码

把IP地址分成网络地址和主机地址

image-20220326104453066

3.网关

相当于海关,向更高一级如外网的请求都需要由网关代理转发

4.DNS域名解析

3.网络连接模式

bridged(桥接模式)

  • ​ vm也能访问外网,外网也能访问vm
  • ​ 缺点容易IP地址冲突

NAT(网络地址转换模式)

  • ​ vm能访问外网,外网不能访问vm

image-20220326111614940

软件分类

1.应用软件

只负责业务

调系统接口来与硬件打交道

2.系统软件

与硬件打交道

GNU/linux

托瓦兹.林纳斯

Linux

  1. redhead
    • centos
  2. diebian
    • ubantu

直接百度linux.org进行下载

image-20220326154927040

第二个相当于迷你版本的linux

配置网络文件

image-20220327093701097

进入vi编辑状态

ctrl+s锁屏

Ctrl+Q解锁

锁屏就是视窗不动,但输入的东西实际存在

键入 ip addr 查看IP信息

host:basenode

键入reboot重启

3.修改网络配置

修改etc/sysconfig/network-scripts/ifcfg-ens33

先删除UUID

然后把boot修改为static

然后添加IPADDR=192.168.188.100

NETMASK=255.255.255.0

GATEWAY=192.168.188.2

DNS1=114.114.114.114

键入 systemctl restart network.service重启网络服务

4.配置防火墙

1.本次服务内禁用防火墙

systemctl stop firewalld

2.查看防火墙状态

systemctl status firewalld

3.禁用防火墙(永久,下次重启开始生效)

systemctl disable firewalld

5.软件安装限制

文件位置:/etc/selinux/config

vi config

改成SELINUX=disabled

6.关机&重启

键入 poweroff

键入 shutdown -h now

键入reboot

7.拍摄快照/克隆

完整克隆就是全部克隆

链接克隆只是克隆不同的地方

8.修改主机名

长久修改

文件路径:/etc/hostname

或者键入

临时修改

hostname 想要改成的名字

9.登出

键入exit

结论:配置文件基本上都在etc文件夹里

10.xshell

在默认窗口键入

ssh ip addr

即可连接主机

11.查找包命令

yun search ifconfig

12.判断命令是自带的还是应用

type cd

[root@basenode ~]# type cd cd is a shell builtin [root@basenode ~]# type for for is a shell keyword [root@basenode ~]# type ping ping is /usr/bin/ping

如果是内置命令

可以键入help查看文档

如果是外部命名

可以键入man查看文档

13.查找该命令在哪个位置

whereis ping

[root@basenode ~]# whereis ping ping: /usr/bin/ping /usr/share/man/man8/ping.8.gz

14.查看文件类型

file /usr/bin/ping

[root@basenode ~]# file /usr/bin/yum /usr/bin/yum: Python script, ASCII text executable

15.查看当前用户

who

[root@basenode ~]# who root pts/0 2022-03-27 06:46 (192.168.188.1)

whoami

我是谁

16.查看当前所在文件夹位置

pwd

[yeshifu@basenode ~]$ pwd /home/yeshifu

[root@basenode ~]# pwd /root

17.查看内核信息

uname -a

[root@basenode ~]# uname -a Linux basenode 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

18.打印echo 清屏 clear

输出彩色文字

给输出的字符指定颜色

一般格式\033[3x;4xm输出内容\033[0m

前后都有**\033[xm**

echo -e "\033[33mthis is yellow \033[0m"
echo -e "\033[32;47mhello world\033[0m"
echo -e "\033[32;45mhello world\033[0m"
echo -e "\033[3mhello world\033[0m"
echo -e "\033[1;3;4;5;31;47mhello world\033[0m"

30表示黑色31表示红色32表示绿色33表示黄色34表示蓝色35表示紫色36表示浅蓝色37表示灰色

给输出的字符指定背景颜色

40表示背景为黑色。 41表示背景为红色。 42表示背景为绿色。 43表示背景为黄色。 44表示背景为蓝色。 45表示背景为紫色。 46表示背景为浅蓝色。 47表示背景为灰白色。

其它常用的ANSI控制码

\033[1m让输出的字符高亮显式 \033[3m输出斜体字 \033[4m给输出的字符加上下划线 \033[5m让输出的字符闪烁显式 \033[7m设置反显效果,即把背景色和字体颜色反过来显示

19.history敲命令的历史

history -c清除历史

2.常用文件标识符

1..表示隐藏文件

一个点接文件名是隐藏文件

一个点表当前目录

两点表上级目录

2.$表示环境变量

[yeshifu@basenode ~]name=liqingzao[yeshifu@basenode ] **name=liqingzao** [yeshifu@basenode ~] echo name name [yeshifu@basenode ~]echo**echoname**

liqingzao

3.*通配符

[yeshifu@basenode ~]$ ll -a /etc/a*

把所以符合a开头的结果返回

[yeshifu@basenode ~]$ ll /etc/*d

把所有符合d结尾的返回

4.~家目录

超级管理员家目录在/root

普通用户家目录在/home/username

5./整个linux的根目录

[root@basenode /]# cd / [root@basenode /]# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

6.命令参数

如果是一个单词就双杠

yum --help

如果是一个简写就单杠

yum -h

3.linux文件系统

1.挂载磁盘

mount /dev/disk1 /usr/download

2.查看进程

ps -ef

$$表示当前进程编号

echo $$查看当前进程编号

3.二级目录的作用

image-20220328093847908

  • bin 可执行文件目录
  • boot 引导分区
  • dev 设备信息
  • etc 配置文件
  • home 普通用户的家目录
  • lib 类库,库文件目录
  • media 多媒体
  • mnt 硬盘默认挂载位置
  • opt 软件安装位置
  • proc 进程信息
  • root root用户的家目录
  • run 运行时的系统环境变量
  • sbin 管理员可执行的命令
  • srv 系统运行时的临时变量
  • sys 系统内核信息
  • tmp 临时文件目录(关机会清除)
  • var 临时文件目录(关机不会清除)
  • usr 用户共享信息

4.文件夹操作

1.切换目录

cd

2.显示当前目录下的文件

ll 详细信息

ls 简略信息

前缀信息

  • -文件
  • d目录
  • l快捷方式

例子:

-rw-r--r-- 表示文件可操作权限

drwxr-x--- 表示目录

lrwxrwxrwx 表示快捷方式

3.创建&删除文件夹

mkdir

[root@basenode ~]# mkdir a/b/c mkdir: cannot create directory ‘a/b/c’: No such file or directory

mkdir -p 当父级目录不存在时会根据需要创建

mkdir -p poet/shiren{libai,dufu}

**shiren{libai,dufu}**创建两个或多个目录包含{}的前缀

mkdir -p poet/{libai,dufu}

rmdir

仅仅只能删除空文件夹

不能删除有数据的文件夹,也不能删除文件

5.文件操作

1.复制文件

cp 源文件路径 目标路径

参数:

  • -a 拷贝全部
  • -r 拷贝文件夹

[root@basenode ~]# cp -r poet /opt*

2.剪切文件

mv 源文件路径 目标路径

3.重命名

mv 目标文件 重命名

[root@basenode opt]# mv a abc

4.删除文件

rm -rf

参数:

  • -f 强制删除
  • -r 删除文件夹(递归的删除)

rm -rf /*

这是一个非常危险的操作适合提桶跑路

5.创建文件

touch 文件名

**stat ** 文件名 文件元数据

cat 查看文件内容

6.链接

ln 文件名 链接名

重点:最好链接绝对地址

参数:

  • -s 创建软链接,原文件丢失则失效

例子:

软链接

[root@basenode ~]# ln -s libai slink [root@basenode ~]# ll total 8 -rw-------. 1 root root 1559 Mar 27 06:11 anaconda-ks.cfg -rwxr-xr-x 1 root root 66 Mar 27 23:39 libai drwxr-xr-x 5 root root 46 Mar 27 23:13 shiren lrwxrwxrwx 1 root root 5 Mar 27 23:41 slink -> libai [root@basenode ~]# cat slink 天生我才必有用 昨日之日不可留 今日之日多烦忧

硬链接

[root@basenode ~]# ln libai hlink [root@basenode ~]# ll total 12 -rw-------. 1 root root 1559 Mar 27 06:11 anaconda-ks.cfg -rwxr-xr-x 2 root root 66 Mar 27 23:39 hlink -rwxr-xr-x 2 root root 66 Mar 27 23:39 libai drwxr-xr-x 5 root root 46 Mar 27 23:13 shiren lrwxrwxrwx 1 root root 5 Mar 27 23:41 slink -> libai

image-20220329093445511

总结:

软连接不添加link数目

硬链接添加

原文件删除软连接不能访问

硬链接直接引用内存地址

软连接引用变量值

硬链接可以保护文件不被恶意删除

7.查看文件

cat 文件路径

[root@basenode ~]# cat lslink 天生我才必有用 千金散尽还复来 昨日之日不可留 今日之日多烦忧

tac 文件路径

按行号倒序输出

[root@basenode ~]# tac lslink 今日之日多烦忧 昨日之日不可留 千金散尽还复来 天生我才必有用

more 文件路径

  • 按回车一行一行的翻
  • 按空格一页一页的翻
  • 按B回退
  • 按H提供帮助相当于--help
  • 按q直接退出

less 文件路径

  • 按回车一行一行的翻
  • 按空格一页一页的翻
  • 按B回退
  • 按H提供帮助相当于--help
  • 按q直接退出

理论上来说用more和less没啥区别

head -行数 文件路径

显示文件前几行

[root@basenode ~]# head -10 profile

tail -行数 文件路径

显示文件后几行

[root@basenode ~]# tail -1 profile

head 与 tail 组合通过管道运算符

可以只显示第多少行

[root@basenode ~]# head -8 profile | tail -1

/etc/profile.d/ to make custom changes to your environment, as this

重要

tail -F 文件名

可以监控文件变化

tail -f 文件名

功能有限,根据Inode进行监控

tail -F则根据文件名进行监控

8.搜索文件

find 查找范围 -name 文件名

这种差不多够用

[root@basenode ~]# find / -name libai /root/shiren/libai /opt/libai

[root@basenode ~]# find /etc -name a*a /etc/sysconfig/anaconda /etc/selinux/targeted/active/modules/100/alsa /etc/selinux/targeted/active/modules/100/amanda /etc/selinux/targeted/active/modules/100/anaconda

4.vi编辑器

1.打开文件

vi 文件名

  1. +相当于定位
  2. /相当于匹配

例子:

  • vi +8 文件名
  • 打开直接定位到第8行
  • vi + 打开直接定位最后一行
  • vi +/if 打开直接定位到if

2.vi编辑器的三种模式

  1. 编辑模式
    • 编辑模式,每个按键都有其他功能
  2. 输入模式
    • 按什么输入什么
  3. 末行模式
    • 我们可以在vi中输入特定的命令

3.vi三种模式的切换

1.由编辑模式进入输入模式(快捷键)

  1. a 追加 输入的内容位于光标后
  2. i 插入 输入的内容位于光标前
  3. o 下一行
  4. I 行首
  5. A 行尾
  6. O上一行

2.由输入模式回退到编辑模式

按下ESC

3.由编辑模式进入末行模式

按下:

4.由末行模式回退编辑模式

按下ESC

image-20220329111531436

注意:末行模式不能与输入模式直接切换

5.编辑模式常用快捷键

  1. gg 快速定位行
    • 20 gg快速定位到20行
    • G定位到最后一行
  2. dd 删除一行
    • 10 dd删除10行
  3. w 一个词一个词的跳
  4. d w 删掉一个词
    • 3 d w删掉三个词
  5. yy 复制一行
    • 3yy 复制三行
    • p粘贴
  6. p粘贴
    • 2p 复制两遍
  7. yw复制一个单词
    • 3yw 复制三个单词
  8. u 撤销
  9. . 前进
  10. h左移光标
  11. j下
  12. k上
  13. l右
  14. ^行首
  15. $行尾
  16. PGUp上一页
  17. PGUp下一页
  18. shift zz保存并退出ZZ
  19. r替换
    • 3r j 把当前光标位置替换成三个j
  20. x剪切
    • 3x 剪切3个字母

6.末行模式常用命令

1.保存和退出
  1. w 临时保存一次
  2. q 退出
  3. ! 强制执行
    • :q!强制退出
2.查找与替换

/libai 查找字符串libai

/表示匹配的意思

n next下一个

s/libai/dufu

把libai替换成dufu

注意只是当前行

且一次只替换一个

s/libai/dufu/g

可以把当前行全部换掉

后面的/g全部替换

注意只是当前行

g/libai/s//wanglun/g

全局替换所以李白

第一个g表示全局匹配

中间双杠转义/

最后一个g全部替换

3.设置/取消行号

:set nu

:set nonu

7..文件名.swp

如异常退出的时候会默认保存一个隐藏文件

image-20220330092855794

这种情况直接回车可以回到原来的

也可以找到该隐藏文件删除

或者在提示页面键入D删除隐藏文件

在提示页面键入R可以恢复错误关闭的内容

5.系统间的数据传输

1.window~~~~linux

1.xftp

直接使用xftp非常简单

2.lrzsz

yum install lrzsz -y

加个-y

yes的意思,默认执行

不需要手动确认

安装这个软件

  1. rz接收文件
    • r(receive)接收的意思
  2. sz 文件名 发送文件
    • s(send)发送的意思

2.linux~~~~linux

scp 源文件地址 目标地址

-r 传文件夹

1.把文件传到另一台主机

scp 文件路径 用户名@ip地址:保存的文件路径

scp forward.txt root@192.168.188.101:/opt/

2.把别的主机文件拿过来

scp root@192.168.188.100:/root/profile /opt

6.查看文件目录所占空间

1.查看分区信息df

df -h

更好看了,数据更容易理解

[root@basenode ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   17G  1.2G   16G   7% /
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.6M  901M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/sda1               1014M  146M  869M  15% /boot
tmpfs                    182M     0  182M   0% /run/user/0

2.查看目录大小du

du -h --max-depth=1 /etc

--max-depth=1最大深度为1

[root@basenode ~]# du -h --max-depth=1 /root 8.0K /root/shiren 4.0K /root/.ssh 0 /root/person 72K /root

7.压缩包

1.tar

-c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件

这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

-z:有gzip属性的 -j:有bz2属性的

-Z:有compress属性的 -v:显示所有过程 -O:将文件解开到标准输出

下面的参数-f是必须的

-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

反正不会的就查百度

常用

  1. tar -xvf 文件名 也能自动解压
  2. tar -cf 压缩后的包名 文件夹 能自动压缩

1.解压缩 -zx(解压)v(过程)f(文件) -zxvf

仅支持tgz即tar.gz文件

[root@basenode ~]# tar -zxvf 409-晨午晚体温监测.tgz

tar -xvf node.tar.xz -C /usr/local/node --strip-components 1

解压到指定的目录并去除最外层目录

参考

2.压缩 -zc(压缩)f -zcf

tar -zcf 压缩后的名字 要压缩的文件夹

[root@basenode ~]# tar -zcf test.tgz 409-晨午晚体温监测

2.zip&unzip

安装包

yum install zip unzip -y

1.压缩

zip -r 压缩后的名称 要压缩的文件

2.解压

unzip 文件名

8.网络命令

1.DNS劫持

vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

2.网络命令

yum install net-tools -y

安装网络配置模块

没安装之前用

ip addr查看ip地址

安装后

1.ifconfig 查看网络配置信息

2.netstat 查看路由状态

  • -anp 查看被监听的端口
  • -r 查看核心路由表

[root@basenode ~]# netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default gateway 0.0.0.0 UG 0 0 0 ens33 192.168.188.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33

3.ping查看主机能否连同

4.telnet查看端口能否连同

yum install telnet -y

[root@basenode ~]# telnet node01 8888 Trying 192.168.188.101... telnet: connect to address 192.168.188.101: Connection refused

5.curl能直接获取restful API资源

[root@basenode ~]# curl -X GET www.baidu.com

注意:curl功能很强大

3.防火墙

防火墙就是用来保护端口的,防止某些端口被恶意访问

1.查看防火墙状态

systemctl status firewalld

2.禁用防火墙(此次开机有效)

systemctl stop firewalld

3.禁用防火墙(以后每次开机生效)

systemctl disable firewalld

4.开启防火墙

systemctl start firewalld

5.防火墙常用命令

firewall-cmd --state ##查看防火墙状态
firewall-cmd --reload ##重新载入配置
firewall-cmd --get-zones ##列出支持的zone
firewall-cmd --get-services ##列出支持的服务
firewall-cmd --query-service ftp ##是否支持ftp
firewall-cmd --add-service=ftp ##临时开放ftp服务
firewall-cmd --add-service=ftp --permanent ##永久开放ftp服务
firewall-cmd --remove-service=ftp --permanent ##永久移除ftp服务
firewall-cmd --add-port=80/ftp --permanent ##永久开放80端口
firewall-cmd --list-all #查看已配置规则

6.开启一个端口的正确操作

#添加
firewall-cmd --zone=public --add-port=80/tcp --permanent

#重新载入
firewall-cmd --reload

#查看
firewall-cmd --zone=public --query-port=80/tcp

#删除
firewall-cmd --zone=public --remove-port=80/tcp --permanent

4.加密算法

1.不可逆加密算法

数据经过加密后不能通过结果计算出原始数据

hash

md5

2.对称加密算法

秘钥只有一个,即是加密也是解密

不安全

管理麻烦

AES

DES

3.非对称加密算法

公钥和私钥

公钥进行加密

私钥进行解密

加密解密相对较慢

RSA

5.相互免秘钥

从当前主机登录到另一台主机

image-20220331151143264

当前主机生成公钥和私钥,把公钥发送给要免密登录的主机/root/.ssh/authorized_keys

1.生成公钥私钥

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

2.发送给要免密登录的主机

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.188.101

3.主机名与host校验

不需要手动验证

修改**/etc/ssh/ssh_config**文件

在末尾添加这两行

StrictHostKeyChecking no

UserKnownHostsFile /dev/null

4.互通免秘钥流程

image-20220331161408795

6.日期和时间

1.时间命令

  1. date 查看当前时间
  2. date -s 2019-11-11修改日期
  3. date -s 11:11:11 修改时间

2.时间同步策略

安装时间自动同步组件

yum install ntp -y

同步时间命令

ntpdate cn.ntp.org.cn

3.给本地提供ntp服务

service ntpd start

开启之后可以给本地局域网提供服务

[root@basenode .ssh]# service ntpd start Redirecting to /bin/systemctl start ntpd.service

9.用户-组-权限

1.用户

1.添加用户

useradd libai

会创建同名的组和家目录

2.设置密码

passwd libai

3.删除用户

userdel -r libai

不会删除组

4.切换用户

su libai

5.修改用户信息

usermod -l libai dufu

修改用户名,家目录和组名称不会被修改

usermod -L dufu锁定用户名

usermod -U dufu解锁用户名

6.常用文件

cat /etc/shadow

用户名和密码

cat /etc/passwd

用户名、编号、组编号、家目录、命令目录

普通用户1000+

2.组

1.新建组

groupadd zhangsan

2.删除组

groupdel zhangsan

3.查看组文件

cat /etc/group

最后几条一般为用户组

4.给用户分配组

usermod -g userlist libai

给libai分配主组userlist

usermod -G song libai

给libai分配附属组song

3.用户组权限

drwxr-xr-x

三个一组

第一位的文件类型

r读

w写

x执行

没有的那一位的权限用-表示

常见权限

  1. "rwx"
  2. "rw-"
  3. "r--"
  4. "r-x"
  5. "---"

三组含义(UGO)

  1. 第一组所属用户权限
  2. 第二组所属组权限
  3. 第三组其他

简称UGO模型

2.修改用户权限

1.更换文件所属主

语法

chown [-R] ownname:groupname filename

-R递归遍历文件夹

例子:

chown dufu file

-rw-r--r-- 1 dufu root 50 Mar 31 22:48 file

chown :dufu file

只修改G

chown -R dufu:libai shiren

修改该文件夹全部UG

drwxr-xr-x 3 dufu libai 15 Mar 31 23:21 shiren

2.更改UGO模型权限

chmod o+w file

image-20220401105855046

chmod u=rwx,go=rx file

chmod a-x file

chmod o=rx file

3.修改文件所属组

chgrp libai file

更改文件附属组即g模型

chgrp -R dufu shiren

加个**-R**会更改该文件夹下的所有文件

10.重定向和管道

1.|管道

|管道符能够传递参数

grep if

grep强大的搜索工具

cat profile | grep if

2.>重定向

改变默认输出的位置

ll > test 输出的test文件,没有文件则创建

ll >>test

注意:一个箭头是覆盖,两个是追加

ll /op 2>tset

把错误信息输出到test

注意:

  1. 1>是正常输出可以省略1不写
  2. 2>是错误输出不可以省略2

王炸:在最后加 2>&1不管是正确还是错误都能输出到文件

王炸:信息黑洞,不要的数据往里扔,把数据输入到**/dev/null**里面

11.linux的系统进程

1.查看进程ps

ps(process status)

1.-ef

[root@basenode ~]# ps -ef | grep baidu root 8072 8051 0 04:45 pts/1 00:00:00 ping www.baidu.com root 8074 7995 0 04:45 pts/0 00:00:00 grep --color=auto baidu

2.-aux

ps -aux | grep baidu

2.查看进程top

image-20220401165108824

3.杀死一个进程kill -9

kill -9 8072

4.后台进程

在指令末尾加&开启后台进程模式

[root@basenode ~]# ping www.baidu.com >> /dev/null 2>&1 & [1] 8087

在当前开启后台进程的主机键入jobs

可以查看后台进程

在指令最前面加nohup 可以挂起程序

[root@basenode ~]# nohup ping www.baidu.com >>/dev/null 2>&1 & [1] 8106

12.软件安装

1.环境变量

系统环境变量:/etc/profile

用户环境变量:~/.bash_profile

2.rpm安装软件

  1. 首先把rpm安装包上传上去
  2. rpm -ivh jdk-18_linux-x64_bin.rpm
  3. rpm -qa 查询所有安装的软件
  4. rpm -qa |grep jdk

3.卸载软件

rpm -e 软件名

rpm -qa |grep jdk

切记是查询到的软件名

4.配置环境变量

  1. 查找安装文件位置一般在**/usr**下
  2. 复制路径
  3. 修改**/etc/profile或者~/.bash_profile**文件
  4. 末尾加下面两行代码
  5. export NAME_HOME=路径
  6. export PATH=NAMEHOME/bin:NAME_HOME/bin:PATH
  7. source /etc/profile 重新加载文件

5.压缩包安装

  1. 上传到服务器
  2. tar -Jxvf node-v16.14.2.tar.xz 解压
  3. tar -axvf 文件名 自动识别类型解压
  4. mv node-v16.14.2 /opt 剪切到opt目录
  5. 配置环境变量

13.yum包管理器

1.查看

yum search 命令或包

yum info 包名 查看此包的信息

yum list 查看最近一周装的包

yum list installed 查看安装过的包

2.更换yum源

wget下载工具使用详解

  1. 先下载w(web)get包
    • yum install wget -y
  2. 将系统配置文件失效
    • mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  3. 使用wget获取阿里的yum源配置文件
  4. 清空以前的yum源的缓存
    • yum clean all
  5. 获取阿里云的缓存
    • yum makecache

3.安装mysql

1.安装mysql依赖

yum install perl net-tools -y

2.卸载mariadb

rpm -qa | grep mariadb

rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64

3.下载安装包

  1. wget 官网下载链接
  2. tar -xvf 解压

4.移动目录

必须安装到/usr/local/下

mv mysql /usr/local/mysql 移动到指定目录

在mysql下创建data目录

5.添加环境变量

vim /etc/profile 把mysql/bin目录添加到环境变量

ln -s /usr/local/mysql/support_files/mysql.server /etc/init.d/mysql

6.创建用户和组

groupadd mysql

useradd -g mysql mysql

8.初始化mysql

--user=mysql 指定用户(很关键) --basedir=/usr/local/mysql/ 指定安装目录 --datadir=/usr/local/mysql/data/ 指定初始化数据目录

mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

[root@databasenode ~]# mysqld  --initialize  --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
2022-04-03T10:44:36.295478Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.28) initializing of server in progress as process 8051
2022-04-03T10:44:36.309932Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2022-04-03T10:44:37.221356Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2022-04-03T10:44:38.784347Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: PBp*=0hq+yhf
#最后的是临时密码

9.启动服务

service mysql start

9.重置密码

mysql -u root -p 然后键入临时密码

用临时密码登录mysql后

alter user root'@'localhost' identified by '123456';

by后面输入您想设置的密码

image-20220403185246087

10.开启任意端口都能访问

在mysql shell下

1.use mysql;

  1. select user,host from user;查看端口
  2. update user set host='%' where user='root'; 把root端口改成全部允许访问
  3. flush privileges;立即生效

14.三剑客

1.普通三剑客

cut -d ':' -f1,2,3 passwd

以:切分文件前三列

[root@basenode ~]# cut -d ':' -f1,2,3 passwd
root:x:0
bin:x:1
daemon:x:2

sort passwd

  • -t ':'按字符切分
  • -k 3按第几列排序
  • -n 以数字大小排
  • -r 逆序

按字典序对数据排序

[root@basenode ~]# sort -t ':' -k3 passwd

先按:切分 按切分后第三位排列

wc 文件名

  • -l line
  • -w word 按空格分隔单词
  • -c char

[root@basenode ~]# wc passwd 22 30 967 passwd

2.三大剑客

1.grep

grep root passwd

  • -n 显示行号
  • -v 显示不匹配的
  • -i 显示不匹配的
  • -nvi 不匹配忽略大小写
  • -E "[1-9]+"正则表达式匹配

从passwd文件中找到关于root的哪一行

2.sed 文本操作

3.awk 文本操作

2.shell编程

1.编写文件

在文件最开头加

#!/bin/bash

2.执行

  1. ./hello.sh 必须有执行权限
  2. sh hello.sh
  3. source hello.sh

注意source 不会新开一个bash进程

3.shell基础入门

1.变量

#! /bin/bash
age=18 #声明普通变量
readonly name=zhangsan #声明只读变量
echo $name
echo $age
unset age #删除一个变量
echo $age

2.shell字符串

#! /bin/bash
username="yeshifu"

#双引号可以引用变量,跟js有点像用${}或者直接$就能引用
username1="hello ${username}"

#单引号不能使用变量会原文输出
username2='hello ${username}'
echo $username1
echo $username2

#在变量名前面加个#表示字符串长度
echo ${#username2}

#对该字符串切片
echo ${username2:1:5}

3.数组

#! /bin/bash
#定义数组
#注意,每个元素之间是空格不是逗号
favs=("libai" "dufu" "bnaijuyi")
echo ${favs[1]}

#取数组长度
#favs[*]输出所有元素再取#才能正确取数组长度
echo ${#favs[*]}
echo ${#favs[@]}

4.shell的参数传递

shell通过位置参数(positional parameters)来给脚本文件传递参数,就是从命令行中传进来的参数,0,0, 1, 2,2, 3... 其中:

  • $0 是该脚本文件的名字
  • 1是第一个参数,1 是第一个参数, 2 是第 2 个参数...

注意:

  • 9以后就需要大括号了,9 以后就需要大括号了,如 {10}, 11,{11}, {12}...

另外,还有几个特殊字符用来处理参数:

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$-显示Shell使用的当前选项,与set命令功能相同
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$*$@ 区别:

  • 相同点:都表示引用所有的位置参数;
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

5.运算符

Bash支持的运算符有:

  • 数学运算符
  • 关系运算符
  • 布尔运算符
  • 逻辑运算符
  • 字符串运算符
  • 文件测试运算符

数学运算符

数学运算符说明
+加法
-减法
*乘法
/除法
%取余
=赋值
==相等测试,相等则返回true
!=不相等测试,不相等则返回true

注意: 乘号*前边必须加反斜杠 \ 才能实现乘法运算

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

关系运算符说明
-eq(equal) 检测两个数是否相等,相等则返回 true
-ne(not equal)检测两个数是否相等,不相等则返回 true
-gt(greater than)检测左边的数是否大于右边的,如果是,则返回 true
-lt(lower than) 检测左边的数是否小于右边的,如果是,则返回 true
-ge(greater equal)检测左边的数是否大于等于右边的,如果是,则返回 true
-le(lower equal) 检测左边的数是否小于等于右边的,如果是,则返回 true

布尔运算符

布尔运算符说明
-a与运算,两个表达式都为 true 才返回 true
-o或运算,有一个表达式为 true 则返回 true
!非运算,表达式为 true 则返回 false,否则返回 true

逻辑运算符

逻辑运算符说明
&&逻辑与
II逻辑或

字符串运算符

字符串运算符说明举例 (a="abc" b="def")
=检测两个字符串是否相等,相等返回 true[ a=a = b ] 返回 false
!=检测两个字符串是否相等,不相等返回 true[ a!=a != b ] 返回 true
-z检测字符串长度是否为0,为0返回 true[ -z $a ] 返回 false
-n检测字符串长度是否为0,不为0返回 true[ -n $a ] 返回 true
str_name检测字符串是否为空,不为空返回 true[ $a ] 返回 true

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性

文件测试运算符说明
-b file检测文件是否是块设备文件,如果是,则返回 true
-c file检测文件是否是字符设备文件,如果是,则返回 true
-d file检测文件是否是目录,如果是,则返回 true
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true
-g file检测文件是否设置了 SGID 位,如果是,则返回 true
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true
-p fill检测文件是否是命名管道,如果是,则返回 true
-u file检测文件是否设置了 SUID 位,如果是,则返回 true
-r file检测文件是否可读,如果是,则返回 true
-w file检测文件是否可写,如果是,则返回 true
-x file检测文件是否可执行,如果是,则返回 true
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true
-e file检测文件(包括目录)是否存在,如果是,则返回 true

注意:``里的内容被当做命令去执行

4.test

test相当于if前置语句等于[ ]是评估的结束

功能:检查文件和比较值

5.流程控制语句

可以参考菜鸟教程

1.if语句

#! /bin/bash
num1=$1
num2=$2
if [ $num1 -lt $num2 ]
then
  echo "$num1<$num2"
elif [ $num1 -gt $num2 ]
then
  echo "$num1 > $num2"
else
  echo "$num1 = $num2"
fi

总结

  1. 每次判断之后的命令前要加个then
  2. else不用加then
  3. 最后一定要用fi结束

2.for循环

#! /bin/bash
numlist=("1" "2" "3" "4")
for item in ${numlist[*]}
do
  echo $item
done
#echo ${numlist[@]}

##类c的写法
#! /bin/bash
for(( i=0;i<10;i++))
do
echo $i
done

总结:

  1. 跟js中的for in很像
  2. 执行命令前加do
  3. 结束需要加done

3.while循环

#! /bin/bash
num=0
while (($num<=10))
do
  echo $num
  let "num++"
done

4.case ... esac

case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。

可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case ... esac 语法格式如下:

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

5.跳出循环

跟其他语言一样

break

continue

6.shell函数

shell函数跟JavaScript中的函数很相似

不过没有形参和实参

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值

注意,10不能获取第十个参数,获取第十个参数需要10 不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。

另外,还有几个特殊字符用来处理参数:

参数处理说明
$#传递到脚本或函数的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
#! /bin/bash
function rehobby(){
  case $1 in
    1)echo "黑丝长腿御姐";;
    2)echo "giaogiao";;
    *)echo "黑长直yyds";;
  esac
  return 123 
}
read num
rehobby $num
echo $?

shell编程不怎么常用,会写就行,不会再来看看

7.系统任务设置

1.系统启动流程

查看菜鸟教程有详细解释

image-20220405170746400

2.chkconfig

可以查看每个运行级别下服务是否自动开启

3.开机自启动服务

1.rc.local

  1. 创建存放脚本的文件夹
  2. mkdir -p /usr/local/scripts
  3. 在文件夹中创建脚本文件给予执行权限
  4. 将脚本绝对路径添加到rc.local末行
  5. 给予rc.local可执行权限

2.chkconfig

  1. 创建开机自启动脚本

  2. vim makedir.sh

  3. #! /bin/bash
    #chkconfig: 2345 88 99
    #description:auto_run
    脚本命令
    
  4. 将脚本拷贝到/etc/init.d/目录下

  5. 添加到服务

  6. chkconfig --add /etc/init.d/makedir.sh

  7. reboot

4.定时任务

1.在系统服务中心,crond负责周期任务

systemctl status crond

2.添加任务,编辑当前用户的任务列表

crontab -e

3.语法

crontab [ -u user ] file

crontab [ -u user ] { -l | -r | -e }

说明:

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。

-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

参数说明

  • -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
  • -r : 删除目前的时程表
  • -l : 列出目前的时程表

时间格式如下:

f1 f2 f3 f4 f5 program
#分 时 日 月 周 命令
  • 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
  • 当 f1 为 *** 时表示每分钟都要执行 program**,f2 为 * 时表示每小时都要执行程序,其馀类推
  • 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
  • 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
  • 当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推
*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

使用者也可以将所有的设定先存放在文件中,用 crontab file 的方式来设定执行时间。

4.sleep 5

等待5秒钟

5.写脚本

如果脚本报错,可能是window格式问题

vim 该文件末行模式

set fileformat=unix

8.实践过程中的学习

1.read命令

read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。

后续我们会在《Linux Shell重定向》一节中深入讲解重定向的概念,不了解的读者可以不用理会,暂时就认为:read 命令就是从键盘读取数据。

read 命令的用法为:

read [-options] [variables]

options表示选项,如下表所示;variables表示用来存储数据的变量,可以有一个,也可以有多个。

optionsvariables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。

选项说明
-a array把读取的数据赋值给数组 array,从下标 0 开始。
-d delimiter用字符串 delimiter 指定读取结束的位置,而不是一个换行符(读取到的数据不包括 delimiter)。
-e在获取用户输入的时候,对功能键进行编码转换,不会直接显式功能键对应的字符。
-n num读取 num 个字符,而不是整行字符。
-p prompt显示提示信息,提示内容为 prompt。
-r原样读取(Raw mode),不把反斜杠字符解释为转义字符。
-s静默模式(Silent mode),不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这是很有必要的。
-t seconds设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表示读取失败。
-u fd使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向。

2.select in循环

select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。

注意,select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环。

完整实例

select in 通常和 case in 一起使用,在用户输入不同的编号时可以做出不同的反应。

修改上面的代码,加入 case in 语句:

#!/bin/bash
echo "What is your favourite OS?"
select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"
do
    case $name in
        "Linux")
            echo "Linux是一个类UNIX操作系统,它开源免费,运行在各种服务器设备和嵌入式设备。"
            break
            ;;
        "Windows")
            echo "Windows是微软开发的个人电脑操作系统,它是闭源收费的。"
            break
            ;;
        "Mac OS")
            echo "Mac OS是苹果公司基于UNIX开发的一款图形界面操作系统,只能运行与苹果提供的硬件之上。"
            break
            ;;
        "UNIX")
            echo "UNIX是操作系统的开山鼻祖,现在已经逐渐退出历史舞台,只应用在特殊场合。"
            break
            ;;
        "Android")
            echo "Android是由Google开发的手机操作系统,目前已经占据了70%的市场份额。"
            break
            ;;
        *)
            echo "输入错误,请重新输入"
    esac
done

用户只有输入正确的编号才会结束循环,如果输入错误,会要求重新输入。

3.shell(())

双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。

注意:(( )) 只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。后续讲到的 bc 命令可以用于小数运算。

Shell (( )) 的用法

双小括号 (( )) 的语法格式为:

((表达式))

通俗地讲,就是将数学运算表达式放在(())之间。

表达式可以只有一个,也可以有多个,多个表达式之间以逗号,分隔。对于多个表达式的情况,以最后一个表达式的值作为整个 (( )) 命令的执行结果。

可以使用$获取 (( )) 命令的结果,这和使用$获得变量值是类似的。

运算操作符/运算命令说明
((a=10+66) ((b=a-15)) ((c=a+b))这种写法可以在计算完成后给变量赋值。以 ((b=a-15)) 为例,即将 a-15 的运算结果赋值给变量 c。 注意,使用变量时不用加$前缀,(( )) 会自动解析变量名。
a=((10+66)b=((10+66) b=((a-15)) c=$((a+b))可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=((a+b))为例,即将a+b这个表达式的运算结果赋值给变量c。注意,类似c=((a+b))这样的写法是错误的,不加((a+b)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。 注意,类似 c=((a+b)) 这样的写法是错误的,不加``就不能取得表达式的结果。
((a>7 && b==c))(( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。
echo $((a+10))需要立即输出表达式的运算结果时,可以在 (( )) 前面加$符号。
((a=3+5, b=a+10))对多个表达式同时进行计算。

在 (( )) 中使用变量无需加上$前缀,(( )) 会自动解析变量名,这使得代码更加简洁,也符合程序员的书写习惯。

4.let 命令

let 命令和双小括号 (( )) 的用法是类似的,它们都是用来对整数进行运算,读者已经学习了《Shell (())》,再学习 let 命令就相当简单了。

注意:和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

Shell let 命令的语法格式为:

let 表达式

或者

let "表达式"

或者

let '表达式'

它们都等价于((表达式))

推荐使用(())替代let

5.tar解压到指定目录并且重名原始目录名

tar -xvf node.tar.xz -C /usr/local/node --strip-components 1

-C 解压到指定目录

--strip-components 1 去除1层目录即最外层目录

6.git安装

1.下载

wget -O git.tar.gz https://github.com/git/git/archive/refs/tags/v2.34.1.tar.gz

从官网上下载最新git版本

2.解压

mkdir git
tar -xvf git.tar.gz
#安装依赖
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker -y

3.编译

cd git

make prefix=/usr/local/git all

4.安装

make profix=/usr/local/git install

5.配置环境变量并重新加载

vim /etc/profile

最末尾添加

export GIT_HOME=/usr/local/git/bin

export PATH=$PATH:$GIT_HTME

重新加载

source /etc/profile

git --version

6.配置git

(1) 配置用户名(提交时会引用)

git config --global user.name “cnj666” #请把cnj替换成自己的用户名

(2) 配置邮箱(提交时会引用)

git config --global user.email "cnj666@qq.com"

(3) 其他配置

git config --global merge.tool “kdiff3” #要是没安装KDiff3就不用设这一行

git config --global core.autocrlf false #让Git不要管windows/Unix换行符转换的事

(4) 编码配置

git config --global gui.encoding utf-8 #避免git gui中的中文乱码

git config --global core.quotepath off #避免git status显示的中文文件名乱码

git config --list

列出所以配置项

git config --global --unset user.password

删除用户密码

1.生成ssh key

生成密钥对并指定保存路径

ssh-keygen -t rsa -C "你的邮箱" -f ~/.ssh/git_rsa

2.把公钥放到github上面

cat ~/.ssh/git_rsa.pub

把打印的内容直接复制到github上面

3.尝试与github建立连接

ssh-agent bash

ssh -v git@github.com

ssh-agent -s

4.添加ssh私钥

ssh-add ~/.ssh/git_rsa

会出现下面内容

[root@basenode .ssh]# ssh-add ~/.ssh/git_rsa
Identity added: /root/.ssh/git_rsa (/root/.ssh/git_rsa)
5.验证

ssh -T git@github.com

Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.

出现上面内容表示成功