linux存在的意义
Linux 开源、免费,打破了软件被少数公司垄断的局面,让更多人能自由地使用、研究、改造计算机,尤其是服务器和设备领域。
linux的用途
linux是开源、主要跑在服务器和设备上的操作系统。
linux与windows、macos的区别
|---------|------------|
| 系统 | 主战场 |
| Windows | 个人桌面、办公、游戏 |
| macOS | 苹果电脑、设计、创意 |
| Linux | 服务器、设备、超算 |
linux的核心竞争力
1开源:bug被"众包",越用越稳
2稳定:能长期不重启(与架构设计有关)
3免费:省钱,能大规模部署(无需授权费)
4安全:权限机制强,病毒少
5灵活:能裁剪能制定
linux的骨架
你(用户)
↓ 敲命令
【终端 Terminal】← 你打字的那个窗口(Xshell 就是一个终端)
↓
【Shell】← 真正"听懂"你命令的翻译官
↓
【内核 Kernel】← 操作系统的心脏,真正干活的那个
↓
【硬件】CPU / 内存 / 硬盘 / 网卡
狭义上来看,linux就是内核。随着多年的发展,配套软体不断完善,到了现在,linux显然是一个集大成者 ,linux家族包含了诸如ubuntu,centos等发行版本的操作系统。我们平时所说的linux,指的是某个家族成员。
学习linux的六大板块
一、基础操作
1.登陆与链接
2.命令的基本结构:命令/选项/参数
要干什么/具体怎么干/对谁干
命令:
如ls(列出),cd(切换),pwd(显示位置)
一条命令里,第一个词永远是命令
选项:
通常以-或--开头
短选项:-l(一个减号,单字母)
长选项:--help(两个减号,单词)
可以不加,不加就用默认行为
常见命令
-a:a=all,"所有文件,包括隐藏文件"
-l:详细列出(相比ls,多了权限、大小、时间、链接数、所有者、所属组)
参数
通常是文件、目录、路径
可以不加,不加就用默认对象
目录和文件的区分:看是容器还是内容本身
路径:如/home/zhangsan
关键要点:
顺序上:命令选项参数
空格:三部分之间用空格隔开
选项可以合并:ls -l -a可以合并写成ls-la
除了命令都可以省略
3.帮助:忘了命令怎么用,自己查
man 命令:看命令的完整手册
man = manual(手册)
想深入了解、查看完整说明就用man
按q退出(不按不退)
常见区块:
NAME:这个命令叫什么干什么
SYNOPSIS:用法格式
OPTIONS:所有选项及含义
EMANPLES:例子
命令 --help:看命令的简要帮助
使用--help,能快速查用命令,它能直接列出常用选项
4.命令提示符:
目标是一眼知道"我是谁、我在哪、是不是管理员"
当前用户@主机名 当前目录管理权限
例如root@localhost \~#
管理权限有两个符号区分:++#管理员(root),$普通用户++
5. 最基础的导航:
在系统内走动,确认自己的位置
pwd:我在哪个目录
Print working directory,显示当前所在的完整路径
作用:迷路时有奇效,知道自己在哪
ls:目录里面有什么
list,列出当前目录里的内容(文件和子目录)
作用:知道目录里有什么
cd:切换到别的目录
Change directory,切换到指定目录
几个常用的写法:
cd /home 去/home
cd 回家目录(~)
cd . . 去上一层目录
cd - 回上一次待的目录
cd有两种用法:
1.按某种确定的路径寻找,不管身在何处,特点是以 / 开头(绝对路径)
2.从当前的位置寻找,特点是没有 / (相对路径)
二、文件与目录(核心)
(一)建东西
mkdir
make directory,创建目录
用法:mkdir 目录名
作用:创建一个新的项目
常用选项:-p
-p = parents(父级)
作用:将路径上缺的上级目录,一并建出来
touch
本意是触摸一下,引申为创建/更新时间戳
用法:touch 文件名
作用:创建一个空文件(无内容)
touch的细节用法:可一次建多个文件
如果文件已存在,touch不会报错,而是更新时间戳(修改时间变成现在)
mkdir和touch的区别:前者建"文件夹",后者建"文件"
(二)删东西
remove(删除)
用法:rm 文件名
作用:删除文件,可一次删多个
关键选项:-r,-f
-r:删除目录必须加
解决rm默认删除文件的痛点,-r = recursive,能目录连带内容一起删
-f:强制删除,不提示
-f = force(强制),简单来说,就是删除某些文件时,不会问"确定吗",不加的话就会问。
删目录中最常用也最危险的组合写法:rm -rf
因为linux没有回收站,因此敲组合技之前一定要看清路径!
特别提醒⚠️:rm -rf / 或rm -rf /* 会删光整个系统。
(三)复制移动
cp:复制
copy,复制
用法:cp 源文件 目标位置
注意:
cp是复制,复制后源文件还在,多出一份新的
常用选项:-r
cp默认只能复制文件,不能复制目录,-r解决痛点。
-r = recursive(递归)
作用:复制目录时,把目录里所有内容一起复制过去
场景总结:复制"文件夹"需要用到-r
mv:移动/改名
move(移动)
用法:mv 源 目标
两大用途:
移动
将文件移动后,原位置就没有文件,文件到了新位置
改名
如果目标位置和源在同一目录,就相当于改名
cp 与 mv的关键差异:在移动目录上,mv不用加-r,直接就能移
三、用户与权限(linux的灵魂)
(一)用户:谁在用
查询当前登陆的用户名:whoami
查询这台机器上有哪些用户:cat/etc/passwd
会列出所有用户的档案,每行一个用户,信息很多,先看第一列(用户名)就行
⚠️:有个文件/etc/shadow,存加密密码,/etc/passwd只存基本信息(谁、家目录、shell)
显示当前用户的用户名、用户ID、所属组:id
(二)用户组:人怎么归类
概念:多个用户归到一起,方便统一管理权限。
一个用户:一个主组+多个附加组
主组:每个用户有一个主组,创建用户时默认生成
附加组:用户还可以额外加入别的组,可以有多个。
查看命令:
groups:看当前用户属于哪些组
id:也能看到组信息
(三)权限:谁对什么有什么权利
1.理解
linux里有三类人:所有者user(u)文件的主人;所属组groups(g),主人所在的组;其他人other(o),无关的其他人
权限的种类:读,写,执行。
读r,看内容,列出里面有什么
写w,改内容,建/删里面文件
执行x,运行它,进入这个目录
没有就是-。
举例:-rwxr-xr--
第一部分-:表示这是个普通文件(目录则是d)
第二部分,rwx:所有者的权限,读写执行
第三部分,r-x:所属组的权限,读和执行
第四部分,r--:其他人的权限,读
2.怎么改权限
chmod(字母法)
chmod= change mode(改变模式/权限)
用法:chmod 谁+/-权限 文件
符号:
u/g/o/a,所有者/所属组/其他人/所有人
+/-/=,加/减/设为
例子:
chmod u+x text.txt
chmod(数字法)
字母法好懂,但工作中数字法更常见。它把权限变成数字,写起来短。
核心:三个权限对应三个数
权限/数字
r(读)/4
w(写)/2
x(执行)/1
-(没有)/0
原理:把有的权限数字相加
rwx,4+2+1=7
rw-,4+2+0=6
r--,4+0+0=4
---,0
用法:chmod后面跟三个数字,分别对应:所有者/组/其他人
常见组合:
755:所有者全权,其他人读+执行,常用于目录、可执行文件
644:所有者读写,其他人只读,常用语普通文件
700:只有所有者有权限,常用于私密文件
777:所有人全权,这很危险,少用
(四 )提权:怎么临时当管理员
提权对应的需求:普通用户权限有限,有时候需要临时提高权限,让普通人临时拥有root的权限。
两个命令:
1.sudo------临时借用管理员权限(推荐)
sudo = superuser do,在一条命令面前加sudo,这条命令就以root身份执行,执行完,权限就恢复,恢复成普通用户。通常需要输入自己的密码。
用法:sudo 命令
特点:临时、单条命令、安全
2.su------切换用户
用法:su 用户名
su = switch user,切换后变成那个用户,直到退出。当然,切换到root:su - 或su root,要输入root的密码
特点:整体切换、持续、影响大
|------|----------|----------|
| 命令 | sudo | su |
| 干什么 | 临时单挑命令提权 | 切换到整个某用户 |
| 持续程度 | 就一条命令 | 一直持续到退出 |
| 密码 | 输自己的密码 | 输目标用户的密码 |
| 安全性 | 高(临时、可控) | 低(整体切换) |
| 实际常用 | 更常用 | 较少 |
为什么sudo更安全:
- 只提权一条命令,用完就收回
- 不用知道root密码,只用输入自己的密码
- 系统还能记录谁用sudo做了什么
但是:得被授权了,才能用sudo,通常只有管理员把"你"加进sudo组或(wheel组),才能用
四、软件与服务(管理机器)
1、包管理(装软件yum/apt)
相比于,在windows上安装软件,得自己跑去官网找、下载、安装,linux可以说是帮助自己解放双手,只需要告诉linux自己需要什么,系统就会从仓库自动取货、装好。
关键概念:
软件仓库(repository),一个存软件的服务器,系统预先配置好了地址
包管理器,一个帮忙从仓库下载+安装+处理依赖的工具
依赖,软件运行需要的其他软件,自动帮忙安装
有个两个主流包管理器:
|---------------|------------|-----------------|
| 发行版 | 包管理器 | 装软件命令 |
| CentOS/RedHat | yum(新版dnf) | yum install 软件名 |
| Ubuntu/Debian | apt | apt install 软件名 |
看自己的服务器是哪个发行版选择包管理器。
常用命令(yum与apt用法几乎一样)
命令 作用
yum Install 软件名 装软件
yum remove 软件名 卸载
yum update 更新
yum search 关键词 搜软件
当然,在linux上装软件,可以用包管理器,也可以手动下载安装包,只不过后者作为备选罢了。
实际执行上,装软件通常要管理员权限,所以前面一般都加sudo。所以装软件=sudo+包管理器命令
2、服务管理(启动/停止程序systemctl)
服务service,在后台一直运行的程序,默默提供某种功能。
例子
服务 干什么
nginx 提供网站访问
mysql 提供数据库
sshd 实现远程连接
这些服务,开机就自动跑,一直不关,撑着系统功能
需要对服务进行管理的理由:
服务需要能启动、停止、重启、看状态,比如网站挂了,得重启nginx,所以要有一个工具统一管理服务。
核心命令:systemctl
用法:systemctl 动作 服务名
常用动作:
命令 作用
systemctl start nginx 启动
systemctl stop nginx 停止
systemctl restart nginx 重启
systemctl status nginx 看状态
systemctl enable nginx 开机自启
systemctl disable nginx 取消开机自启
两个常用:
看服务状态 :systemctl status nginx
显示服务在跑还是停了,以及最近日志。这便是排错第一步,先看状态。
重启服务 :systemctl restartnginx
改了配制后,重启让它生效。例如网站出问题,先重启试试
特别讲一讲enable:
enable=开机自动启动。不enable,重启机器后服务就没了,得手动打开。生产环境里,服务一般都要enable。
start管现在,enable管开机。
看看start与enable的区别:
|--------------|-----------------|
| 命令 | 效果 |
| start | 现在启动,重启机器后失效 |
| enable | 开机自启,永久生效 |
| start+enable | 现在也跑,重启后也跑(最常用) |
实际上会是这么使用:
systemctl start nginx
systemctl enable nginx
或者一条命令搞定:systemctl enable --now nginx
--now = 设开机自启的同时,现在就启动。一步到位,很常用。
3、进程(看谁在跑ps/top/kill)
进程progress,正在运行的程序。
这里需要和程序进行区分:
|----|---------------|----|
| 概念 | 是什么 | 在哪 |
| 程序 | 硬盘上的文件(静止的 ) | 硬盘 |
| 程序 | 程序跑起来的样子(动态的) | 内存 |
同一个程序可以有多个进程(比如开两个记事本)
看进程的必要性:
系统卡的时候可以查看是谁在占用资源,或是想知道某个程序在不在跑,再或者,可以结束卡死的程序。
核心命令:
ps------快照·看进程
用法:ps
ps用于显示当前的进程(快照),ps单独用,只ps当前终端,想要看全部,得加-ef或者aux
快照:类比一下,给进程拍张照,看这一刻谁在跑
常用组合:
ps -ef(查看所有进程,信息全)
ps aux(另一种写法)
top------动态·看进程
用法:top
top实时刷新,看谁在占用cpu、内存。需按q退出。类似windows的任务管理器。
kill------结束进程
用法:kill 进程号
kill 进程号,结束制定进程。进程号(PID,每个进程都有唯一的编号)从ps或者top里获得、查看。
强杀:kill -9 进程号
4、日志(看发生了什么, journalctl)
日志,Log,系统和程序运行过程中,自动记下的"流水账",例如飞机的黑匣子,手机的通讯录。当系统启动、程序运行、出错、谁登陆了......都会记下来,出问题时,翻日志就知道发生了什么。
通常会在以下场景彰显重要性:
- 服务启动失败:看日志查找失败原因
- 系统异常:看日志找线索
- 谁登陆过:看日志有记录
- 而排错的核心呢,就是看日志
核心命令:journalctl
用法:journalctl
查看系统日志(systemd管的服务的日志)。默认太多,一般加选项过滤。
常用用法:
命令 作用
journalctl -u nginx 看指定服务nginx的日志(排错常用)
journalctl -n nginx 看最近20行
journalctl -f 实时跟踪(像tail -f)
journalctl -xe 看最近的错误(排错常用)
-u = unit,指定某个服务
除了journalctl,日志也存在文件里,常见目录/var/log/,比如/var/log/messages(系统日志),/var/log/nginx。
可以直接用cat、less看:
less /var/log/massages
补充:
systemd:linux里负责启动和管理整个系统的"管家"。systemctl是控制systemd的命令;systemd把日志收集起来,journalctl看systemd管理的日志。
tail:看文件的"末尾几行"。默认是10行,写法:tail /var/log/messages。其他,例如:tail -n 20 /var/log/messages。作用:在诸多内容的日志文件中,直接定位到最新的末尾几行。
-f:意为follow,跟随,即实时盯着文件的新内容。tail -f /var/log/messages,文件一有新内容,就会立刻显示,实时看日志。需要按Ctrl+C退出。
tail 与tail -f:tail只能看一日志文件的末尾几行,tail -f能实时跟进日志文件。journalctl与journalctl -f同理,前者看systemd日志,后者实时跟进systemd日志。
五、网络与安全(对外链接)
1、网络查看(看网络状态ip/ping)
思考:你连云服务器,靠的是网络。那么,在linux里,怎么知道"我这台机器网络通不通、能不能访问某网站"?有没有类似"测试网络"的命令?
答案是有的。
既然连接的是云服务器,那么用之前需要先确认网络通不通,于是需要一个查网络状态的命令。
"通不通"有两层:
|---------|-----------------|------|
| 层次 | 需求 | 命令 |
| 本机网络配置 | 我这台机器的ip、网卡正不正常 | ip |
| 能不能到达对方 | 我能连上某个地方吗 | ping |
先看自己(ip),再在看对方(ping)。
核心命令一:ip
用法:ip addr
常用简写ip a,用于解决"自己这台机器的IP是多少",能用来看本机的IP地址、网卡信息。
核心命令二:ping
用法:ping 目标地址
例如:ping www.baidu.com,测能不能连接到百度;ping 192.168.1.1,测能不能练到某个IP
ping默认一直给目标地址发小包,按Ctrl+C停止
2、远程连接(连接别的机器ssh/scp)
这一块讲的是怎么连接到另一台机器,以及怎么在机器间传文件
核心命令:ssh------远程登录
ssh=secure shell
用法:ssh 用户名@目标地址
登陆后想退出,敲exit。
配套命令:scp------传文件(上传/下载)
scp= secure copy
解决需求:想在两台机器之间传文件(比如把本地文件传到服务器)
用法:scp 源文件 目标位置
例子:
scp a.txt root@192.168.1.10:/home/ # 本地上传到服务器
scp root@192.168.1.10:/home/a.txt . # 服务器下载到本地
写法 方向
scp 本地文件 用户@地址:路径 上传(本地->远程)
scp用户@地址:路径 本地路径 下载(远程->本地)
关键:远程路径前要加"用户@地址:",冒号后面才是路径。同时,冒号必须是英文,冒号前后不能有空格。冒号后面直接跟路径。
3、文件传输(传文件scp/rsync)
scp:使用方法参考上一个部分。特点:简单直接,每次全量传送。适合偶尔传一两个文件。
rsync:
rsync=remote synchronize(使时间一致)
**与scp的区别:**rsync只传"变化的部分",不是每次全传。也就是说scp传"全量",rsync传"增量"。
假设,你有一个大目录,只改了一个文件,如果用scp会整个重传,会很慢;而rsync会先对比,只传不一样的部分。
用法:rsync 选项 源 目标
常用写法:rsync -av 源目录/ 用户@地址: 目标目录/
易错点:rsync路径结尾的/
rsync路径结尾有没有/的意思不一样:
|-----------------------|------------------------------------|
| 写法 | 含义 |
| rsync -av project/ 目标 | 把project里的内容同步过去把project里的内容同步过去 |
| rstnc -av project 目标 | 把project这个目录本身同步过去(目标下会多一层project) |
关键选项:
-a,archive,归档模式(保留权限、时间等)
-v,verbose,详细输出,显示过程
-z,compress(z代表压缩),传输时压缩
--delete,让目标端和源端完全一致(删掉目标端多出来的)
-P,--partial--progress的合体,断点续传+进度
-r,recursive,递归目录
-l,links,保留软连接
-p,perms,保留权限
-t,times,保留时间戳
-g,group,保留属组
-o,owner,保留属主
-e,--rsh/exec,指定远程shell(如ssh)
-n,dry-run,只模拟不执行
补充:
syn:希腊语前缀,意为"一起、相同"
chron: 时间(time)
-ize:动词后缀,使......化
拓展:
sync,全称synchronize,意为"同步"(把内存数据刷到磁盘)
rsync,全称remote sync,意为"远程同步"
async,全称asynchronous,意为"异步"(a-表示'不')
synchronize,意为"同步"
4、防火墙(控制谁能访问firewalld)
给服务器提供的一层边界。防火墙相当于,控制"哪些网络请求能进来/出去"的机制。
核心思想:默认全关,只开需要的。
核心命令:firewall-cmd
CentOS用的防火墙工具就是firewall,命令就是firewall-cmd。cmd,在windows里是Command Prompt命令提示符的缩写,在linux中,是command的缩写,意为命令。
常用命令:
firewall-cmd --list--all,看当前规则
firewall-cmd--add-port=80/tcp --permanent,开放80端口(永久)
firewall-cmd --remove-port=80/tcp --permanent,关闭80端口
firewall-cmd --reload,重载,让改动生效
拓展:
80/tcp:80端口走TCP协议。
TCP:全称Transmission Control Protocol(传输控制协议),是网络传输数据的一套规则,上网、传文件、连接服务器,底层大多用的就是TCP。具有可靠性(数据发了,确保对方收到)、有序性(数据按顺序到达)、有连接性(先建立连接,再传数据)。
UPD(另一个协议):UPD像寄明信片一样,直接发,不管对方收没收到,相比TCP,不可靠,但快速。
关键概念:端口。
端口,是一台机器上,不同服务对外的"门牌号"。
要对外开放某些服务,就得"开对应的端口"。
一些的服务以及所需常用端口
网站(HTTP),80
网站(HTTPS),443
SSH远程,22
注意两个关键选项:
--permanent,意为永久生效。注意,不加的话,重启就没了。
--reload,意为重载配置,能让改动立即生效
六、shell脚本
1.什么是脚本(把多条命令打包)
先问一个直觉题:假设你每天都要做同一套操作,进目录,建文件,改权限,启动服务。那么,你觉得linux有没有办法,让你不用天天手敲着一串,而是一键搞定?
答案是有的。而且这正是shell要解决的事情。
shell脚本=把一串命令,夏津一个文件,一次性执行。
其核心思想,就是把"手敲一串命令"变成"运行一个文件"。
也就是把所需要的操作写进脚本,只用写一次,却能天天一键跑,还能配合定时任务,自动跑。具有省事、自动化、不用记的好处。
这里写一个最简单的脚本(myscript.sh):
|-------------------|--------------------|
| #!/bin/bash | 声明用哪个Shell执行(固定开头) |
| cd /home/zhangsan | 一条普通命令 |
| mkdir project | 一条普通命令 |
| chmod 755 project | 一条普通命令 |
问题来了,怎么运行脚本:
分两步:
++先给脚本加执行权限(chmod):++
chmod +x myscript.sh
++运行:++
./myscript.sh
./表示"当前目录下的"。运行后文件里的命令从上到写依次执行。
2.变量(存数据)
变量,一个用来存数据的"盒子"。例如:name = "zhangsan"。name就是变量名,zhangsan就是存进去的值,之后用$name就能取出zhangsan。
定义(赋值):
name="zhangsan"
age=20
++注意:等号两边不能有空格。++
使用(取值):变量名前加$
echo $name #输出 zhangsan
echo $age #输出 20
++$,告诉Shell"这是变量,取它的值"++
3.条件判断(if)
为什么需要条件:能让脚本"看情况办事"。
基本结构:
if 条件 ; then
命令
fi
解析:
if,如果
条件 ,判断的内容(方括号两边要空格)
then,那么
命令,条件成立时执行
fi,结束(反写if)
例子:
#!/bin/bash
if $age -gt 18 ;then
echo "成年了"
fi
++-gt=greater than。意思:如果age大于18,就输出"成年了"++
常用比较符:
-eq,等于(equal)
-ne,不等于
-gt,大于(greater than)
-lt,小于
-ge,大于等于
-le,小于等于
基本结构带else(否则):
if $age -gt 18 ; then
echo "成年"
else
echo "未成年"
fi
条件成立走then,不成立走else。
4.循环(for/while)
能让一段命令,重复执行多次。
for循环:知道要循环几次(遍历一组东西)
for 变量 in 列表
do
命令
done
例子:
for name in 张三 李四 王五
do
echo "你好,$name"
done
执行结果:
你好,张三
你好,李四
你好,王五
while循环:不知道几次,满足条件就一直循环
结构:
while 条件
do
命令
done
例子:
i=1
while $i -le 5
do
echo $i
i=$((i+1))
done
++拓展:(()),是一个专门的"算术运算"语法。变量,表示取i的值。二者不一样。++
++为什么会需要这样的语法?因为shell里,默认把一切当文字。++
5.定时任务(crontab)
定时任务,即让系统在指定时间,自动执行某个命令或脚本。具有无人值守,自动执行的价值。
核心命令:crontab
几个常用操作
crontab -l, 列出当前用户的定时任务
crontab -e,编辑定时任务
crontab -r,删除所有定时任务
++定时任务的格式(重点)++
每个定时任务,写成一行,分6个字段。
* * * * * 要执行的命令
│ │ │ │ │
│ │ │ │ └─ 星期几(0-7,0和7都表示周日)
│ │ │ └──── 月份(1-12)
│ │ └─────── 日(1-31)
│ └────────── 小时(0-23)
└───────────── 分钟(0-59)
顺序:分 时 日 月 周 命令
其中的 * 意为"每一个"(不限定)
举例子:
* * * * * ,每分钟
0 * * * * ,每小时的第0分钟(即每小时)
0 2 * * *,每天2:00
0 2 * * 1,每周一2:00
例子:每天凌晨2:00执行备份脚本
0 2 * * * /home/zhangsan/backup.sh