1.前言
Linux 是一种自由和开放源代码的类 UNIX 操作系统,该操作系统的内核由林纳斯托瓦兹在 1991 年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux 操作系统。严格来讲, Linux 只是操作系统内核本身,但通常采用"Linux 内核 " 来表达该意思。而 Linux 则常用来指基于 Linux 内核的完整操作系统,它包括GUI 组件和许多其他实用工具。
Linux是由赫尔辛基的一名研究生Linus开发的。
从今天开始,博主将从Linux指令、权限、开发工具等方向入门,介绍进程、线程、通信以及网络编程等内容。
理解几个概念
服务器:
计算机包括笔记本、台式机、手机、平板、服务器
在军工技术商业化之后,芯片发展加速,集成电路越来越小,计算机开始小型化。越来越适合普通人用。
计算机不是生来就有的,是经过了漫长发展的。
操作系统:
在我们使用的各类电子设备中,都需要各种各样的技术栈。
从底层来看:
硬件:计算机(包括芯片、网卡、显卡、主板、磁盘、ssd......)
但是需要一个软件来管理计算机各个硬件之间的联系。这种软件就叫操作系统。
操作系统是一款进行软硬件管理的系统
其中安卓的底层其实就是Linux
操作系统上就可以使用各种软件:
当然,各类软件都靠语言和编译器来实现。
兜售大型计算机,为了让各个公司会使用计算机,有计算机人才,各大公司开始向各大高校捐赠计算机,计算机的使用逐渐普遍。
Linus觉得所有操作系统收费不合适,就仿照unix实现了Linux
并且还实现了开源。
什么是开源呢?
开放源代码。
免费下载,并且允许其他人加入linux的,Linux的官网Kernael可以直接下载查看。
那什么人会去参与源代码呢:
开源vs闭源:
开源不仅有宏大愿景,也便于实现商业对抗。
什么是好的操作系统呢?
所以操作系统是否优秀,就看bug多不多。开源会让代码被无数双眼睛盯着,而闭源是让各个员工背着kpi来改的。因此普遍情况下开源更好。
Linux的版本:
修正次数是奇数时,一般是修正版本;偶数一般是稳定版本。
2. Linux环境配置
博主在这里购买了腾讯云。CentOs就是其中的一种商业版本的Linux
公字后面有一个ip地址,这里博主把他隐藏了。
买好了机器,我们需要一个远程登录机器的软件:ssh
ssh的客户端一般使用的是xshell
打开xshell:
登录指令:
cpp
ssh root@xx.xx.xx.xx//(输入ip地址,然后按下回车)
出现诸如welcome 或者已经显示进入了root等情况就算成功登录了
3.基础指令
登录时会用到的相关的指令。
- whoami
登录之后直接whoami,查看当前你是谁,现在一定是root
2.adduser
新建用户
然后使用指令passwd新建或更改用户密码。
输密码过程中不会有回显,并且还需要Retype重输入一次密码。
然后可以再用一次ssh登录新建立的用户
然后输入刚刚设置的普通账号(区别于root)的密码
就能登录到普通用户中去了。
- userdel -r 用户名
root管理员能够直接改密码(刚刚的passwd)或者删除userdel -r
这是一种多账号服务器。
先随便敲上几个指令。
pwd表示查询当前所在的位置,ls是展开当前的目录。我们按照如上创建一个文件夹112。
可以观察到,mkdir 112之前ls展开不了任何内容(因为内容为空)。
cpp
mkdir 112
因此,mkdir就是make一个directory
进入112:
可以使用cd指令进入对应的文件夹,然后用pwd验证当前位置。
(此时如果觉得界面很乱,可以尝试两个技巧:ALT+回车能够全屏、clear指令会清空当前页面)
下面进入系统的指令学习。
4. ls指令
每一个指令后面都可以加一个选项。
-a 显式当前目录下的所有的文件(a可以理解为all)
-l 表示更详细的信息(建立时间等)
注意:指令和选项中间需要有空格
命令中的选项可以一次性传递多个。
ls -a -l
也可以写成ls -al
a和l的顺序可以随意
cppls -a -l ls -al ls -la
注意:一般都写为ls-al或者ls-la
关于-a:
linux中,以.开头的文件,都是隐藏文件
比如我们mkdir一个叫.seeme的文件,因为是点开头的,所以直接ls时是看不到的。
直接ls时,默认不显示l两个文件: . 和 ..
带上-a时才能全部看见。
还可以ls /root 根据路径展开该路径的文件,也可以搭配上刚刚讲的-l和-a
或者只ls一个文件夹
为了更好的理解后序指令,我们先提出一个问题。
在任何操作系统中创建一个空文件,会占据磁盘空间吗?
答案是肯定会占据空间的。文件=文件内容+文件属性。文件属性包括文件类型。创建时间等等信息....
不仅文件内容是数据,文件属性也是数据,也需要保存起来。
先使用touch建立一个普通文件test.c:
再来看看什么是文件属性:
现在只需要理解:
d开头表示是目录文件,-开头的都是普通文件。
5. pwd指令
++pwd是一种显示当前路径的指令。++
Linux中的路径类似于windows在文件夹上面的路径
注意观察到:
windows和Linux的路径分隔符方向相反。
通过路径分隔符,可以显式指定目录下的文件。换句话说,路径是用来定位文件的。
根目录是/ 而不是/root
可以观察到root是/下的一个子文件夹。
cd :change director
cd后跟上路径,直接进入用户想进入的路径。
比如我直接进入根目录
但是如果想直接cd文件夹的名字,那只能是当前文件夹里存在的文件夹名称:
比如我在lesson3里创建一个lesson3_empty1,在/root位置处就不能直接找到lesson3_empty1并且直接cd
可通过..不断回退当前路径,回退到根目录时不再回退
..也需要搭配cd来访问
..也就是Windows中的<-
而cd . 则表示回到当前路径
.之前的路径和.之后的路径是一样的。
ls默认打印目录里面的内容
如果只想查看当前目录(不打印里面的信息),则使用ls指令中的-d 。
使用场景:想查看当前文件夹的信息,可以直接 ls -dl
利用上述知识我们就可以只打印根目录(根目录就是单独一个"/")的信息,发现根目录也是d开头,确实是一个文件夹。
注意:直接-l又会打印当前目录里面的内容。
6. cd、tree指令及其安装
tree指令的使用需要先安装。
cpp
yum install -y tree
安装指令需要在root账号下进行。否者会有权限问题。
可以使用tree来观察文件夹里的多叉树形结构
Linux目录是多叉树形的,任意一个子节点一定是空目录或者普通文件,并且一定只有一个父节点。
因为路径具有唯一性,所以可以从根目录开始来定义一个文件。这样从根开始的路径叫绝对路径。
之前的cd ..就是相对路径。
可以通过相对路径去找合适的位置。
如果已经..到了根,再往回跳,就跳不了了。 因为根目录的..和.都指向自己,其他的文件夹的..指向父,.指向自己。
并且此处会报错,因为跳到了上一个节点(此处的上一个节点就是自己)之后又去找了一个不存在的文件。
cd除了直接跟文件名进入新建的empty ,还可以如下使用:
先进入自己,再进入empty ,中间使用路径分隔符隔开
7. cd指令与home的概念
cd- 跳转到最近的上一次路径。
cd~ 跳转到家目录
那什么是家目录呢?
在自己的用户账号上首次登录的就是普通用户的家目录:
比如上文的lsnm就会回到/home中的lsnm中。特别的,如果是root用户, cd ~就会返回到/root
家目录home与根目录的关系如下:
root可以被理解为是超级管理员,可以进入任意人的home
touch 在当前的目录里新建文件(而不是目录!)mkdir 在当前的目录下新建文件夹
文件夹是蓝色的。
8. mkdir 及其相反指令
直接mkdir一系列的路径是不支持的。
当然可以每次mkdir后面接一个cd,但是这样的写法有点蠢。
可以使用-p选项来创建一连串的路径
除了用于mkdir来创建,还有相关的删除指令。
1. rmdir
rmdir 不能删除文件和非空目录。只能用于删除空目录,使用的很少。
只使用rm不能删除有内容的目录
使用场景:面对一堆文件,只想删除空文件夹。一直使用rmdir就不需要去查是否为空目录,直接删就行。
2. rm指令
rm不能删除非空文件夹。但是可以删除普通文件。并且由于根特性的权限较大,系统会问你是否删除,我们回答(y/n)
使用rm -r选项可以删除普通文件 。-r表示递归 由于文件夹的树的特点,rm的删除是递归式的删除。 -f表示强制,加上-f就不会再被系统询问yes or no作为超级管理员,系统会格外小心,会问你
用y表示同意 n表示放弃
不过这样的一次一次回答也太麻烦了。
-f选项能够让我们不再被询问。
删库跑路:rm -f dir1
忌讳:
rm -rf /
/表示根目录。这样的指令会让操作系统直接挂掉的。
也许当前操作系统正在运行,所以不会被删掉。但是一旦重启(电脑关机时操作系统就是放在文件夹里的文件。),操作系统就挂了。
9. touch 指令
touch利用空格作为分隔符,可以创建连续多个文件(观察第二排及其后面展开的树)。
*号:
*表示通配符,会自动填充并且代替任意内容。类似于扑克牌中的万能牌。
因此如果直接 rm -rf *
此处的*就直接自动匹配当前目录下的所有文件,全部将其删除了。
正如上文,ls file*就是将fileXXXX的全部都显示出来
tips:
++tab快速按两下自动匹配并且补齐 可以是补齐路径,也可以是补充指令++
++有记不住的指令就tab++
ctrl+c 会强行停止当前的操作。命令行中 失控的状态就用他退出来
10 . man指令
记不住指令了,就问一问这个man
(ll相当于是ls -l 是一种快捷写法)
man默认从一号手册开始查,查到了就停止。比如printf,因为本身是C语言函数也是Linux的指令
如果直接 man printf,就会只找到第一章中的printf,而不是C语言中的printf
解释一下 ,man 手册分为 8 章
1 是普通的命令
2 是系统调用 , 如 open,write 之类的 ( 通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件,也是以后使用最多的)
3 是库函数 , 如 printf,fread
4 是特殊文件 , 也就是 /dev 下的各种设备文件
5 是指文件的格式 , 比如 passwd, 就会说明这个文件中各个字段的含义
6 是给游戏留的 , 由各个游戏自己定义
7 是附件还有一些变量 , 比如向 environ 这种全局变量在这里就有说明
8 是系统管理用的命令 , 这些命令只能由 root 使用 , 如 ifconfig
如果没有安装,可以使用以下指令安装这个男人
cpp
yum install -y man-pages
我们去man一下printf , 就出现了以下结果:
可以按下q退出。
man手册主要的用途是后面我们用来系统调用的。没必要使用他查询各种语言的细节。
11. nano和cp指令
nano可以被理解为是linux中的一个记事本,可用于快速打开和写入文件
使用nano(记事本)打开文件进入界面之后可以开始写代码:
然后可以根据下面的提示来选择下一步操作。比如此时可以ctrl+x来退出test.c
退出后,再使用cat阅读写好的test.c
如果没有安装nano :
cppyum install -y nano
在生成可执行的mytest后,我们对test进行拷贝,新文件名字是hello.c
cpp
cp test.c hello.c
或者在上级目录中拷贝一份:
cpp
cp test.c ../
对非空文件夹进行拷贝:
直接拷贝会报错,因为文件夹是树形结构,需要加上指令-r
cpp
cp -rf lesson2 empty
因为任何目录下不能存在同名文件,所以如果拷贝两次的话会进行一次覆盖操作,并且会对你进行询问。
总而言之,习惯在删除和拷贝时都加上**"递归且强制,也就是 cp -rf或者rm -rf"**
12 . mv指令
也可以移动并且改名字(new是一个从来没有出现的名字):
13. cat指令
是catch是缩写,直接打开并打印文件。
如果打开路径会报错。
cat -n能够打印行号。(-n选项就是打印行号的)
如果只想输出有效选项 :
-b 对非空输出行编号
-n 对输出的所有行编号
-s 不输出多行空行
同时还有tac 倒序打印文件。
注意,此处的倒序是倒着打印每一行的内容,每一行里的内容不会倒着打印。
如果直接cat就比较鸡肋,你输入什么他就输出什么,使用CTRL+C来终止输入的程序。
14.echo指令
Linux下一切皆文件
echo指令默认就是向显示器文件进行写入
echo+"内容"+>+文件名(注意内容 ++并不是++必须要有双引号,至少要用空格隔开)
将hello world写入到文件中去,如果文件不存在,就创建该名字的文件。换句话说,本来是要写到显示器的,现在我们定位输出到新的文件中去,这样的操作叫++输出重定向。++
如果想在当前目录下存在的文件直接输入,而不是创建新文件,需要保证希望输入的文件是直接存在于当前文件架而非当前文件夹的子文件夹中。
也可以使用重定向符号来新建文件。比touch更简洁,可以理解为将空输入到new.txt中去,但是new.txt不存在,所以新建。
输出重定向,每次重定向都是一次全新的写入,会清空原来的内容再写入新内容
因此还可以用>清空一个文件
可以看做是一次输入为空的写入新内容,也就是清空
如果想留下历史内容,使用printf。
追加重定向:
两个连续的大于符号,追加重定向,会保留原有的内容。
但是echo自动带换行符,新加入的内容一定在新的一排。
可以使用printf来避免换行符,直接加到后面。
输入重定向:
tips:
CTRL+R 搜索历史命令,linux会自动匹配历史命令。
15. more与less指令
more命令,从头开始显示文件中的所有内容,不会像cat 那样刷屏。
因此,more一般用来打开大文件;cat一般用来打开短文件。
但是more不能向上翻找。
less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前 不会加载整个文件。因此认为less是more的高替,less的使用更有弹性。
下面还有一个斜杠可以让你进行搜索相关部分。
因此,一般都用less进行大文本查看。
16. head与tail
如果只想看开头、结尾部分,都有相关的指令:
head log.txt
tail log.txt
head -n10 log.txt//查看前十排
tail -n10 log.txt//查看后十排
-n表示显示行数,可以省略掉。
如果想直接看中间的某一部分,比如一个一万行的文件,我们想从5000行看到5020行。
17.管道
为了解决上述问题,我们引入了新符号 |
**|**称之为管道
管道前操作的执行结果作为下一个操作的数据源。
管道也是一种文件。
利用管道就可以同时进行多个指令。
(wc表示打出文本的行数)
18. Linux中的时间以及date指令
直接date获得时间显示:
并且还可以加入选项以及选择分隔符:
各种选项:
Linux系统中时间的重要性
日志:
在计算机科学中,日志(Log)是指系统、应用程序或网络设备在运行过程中自动记录的一系列事件、操作或系统状态的记录。这些记录通常用于以下目的:
故障诊断:当系统出现问题时,日志可以帮助技术人员快速定位问题的原因。
监控和审计:日志可以用于监控系统的性能和安全,以及审计用户的行为和系统的操作。
性能分析:通过分析日志,可以了解系统的性能瓶颈和优化点。
安全分析:日志可以记录安全事件,如非法访问尝试,帮助安全团队检测和响应安全威胁。
合规性:在某些行业,如金融和医疗保健,日志是遵守法规要求的一部分,用于记录操作和事件以备审查。
调试:开发者可以使用日志来跟踪程序的执行流程,帮助调试程序中的错误。
日志中包含很多内容,其中不得不提的就是时间戳。
使用指令 date +%s获得时间戳:
在互联网发展早期,为了让互联网时间统一,规定:
因此时间戳的这个数字永远都在线性递增。
也可以通过@时间戳来返回一个具体时间
@0的时候返回的时间是上午8点,这是因为我国时区和格林威治不是一个时区。
19.简易find指令
find 路径 -name 文件名
顾名思义,这是一条根据name找文件的指令。
会完全在树状结构中找出所有的名字为test.c的文件。
如果想找多个文件:
在文件名中加上一个 -o
这里是的o的意思就是or
20. 查找命令which
which是用来进行在Linux系统中搜索指定的指令。
指令的本质就是一个可执行程序,就是文件。
如果我们使用gcc自己写了一个可执行程序叫做mycmd:
可以通过相对路径./mycmd去执行,但是直接mycmd会报错;
但是当我们把mycmd拷贝到bin里面去之后,就可以直接执行了。
而这一步cp mycmd /bin , 也就是所谓的"安装"。因此安装的本质就是将可执行程序放入指定的安装目录下。
然后再删除他,也就是所谓的卸载。
因此现在如果要执行mycmd,又需要./mycmd/,而不能直接调用。
使用 which查找之前使用过的各种指令:
由此引发三个问题:
ls 和 ll的不同?
说明 ll 就是 ls -l
为什么which ls后面会出现一个alias?
alias的意思是别名
并且alias本来就是一个指令。
换句话说,ls其实是ls --color=auto的别名。
ls和/bin/ls的不同?
可以观察到 bin/ls下都没有彩色,而直接ls就有。因为直接ls调用的其实是bin中的ls加了选项之后的重命名。
alias :
21. grep过滤指令
语法: grep [ 选项 ] 搜寻字符串 文件
功能: 在文件中搜索字符串,将找到的行打印出来
意思在test.txt里去找bit并且直接grep是区分大小写的。
-i选项,也就是ignore, 会忽略大小写。
-i :忽略大小写的不同,所以大小写视为相同。因此第二次-i之后就把所有带有bit的都输出了
-n :顺便输出行号
-v :反向选择,亦即显示出没有 ' 搜寻字符串 ' 内容的那一行(大小写也视为相同)
所有带有bit(不论大小写),都不能输出了。
使用场景:想在那么多的进程中搜索我们想查看的进程,就可以ps(查看进程的指令)加管道加grep搜索到。
22. 打包操作
22.1 zip&unzip
打包和压缩是不管windows还是Linux中的常见操作。
为什么要打包和压缩:
减少网络传输的数据量
多个文件形成一个文件
如何使用:将112这个文件夹放入112.zip
但是zip打包目录时默认只打包目录本身。
因此需要使用-r选项
deflated指的是压缩比
unzip默认解包到当前目录下,如果希望解包到指定目录下:
必须要加上-d选项
否则不能解压到想解压的文件夹。
检验是否成功压缩:使用sz指令
用sz指令将Linux中的内容send到windows中去。
22.2 tar 命令
语法:
使用:
选项中的c是为了新建,z是为了压缩
v就是视图的意思,将打包压缩的过程展现出来。
tar指令压缩后的压缩包后缀是.tgz,解压时只需要将c选项换为x
解压到指定位置:
两种打包指令在解压到指定位置时都需要加上特殊选项。
不同于zip使用-d, tar指令使用的是-C
小结:
(x/c)(v)zf是固定搭配,x和c一个是解包用,一个是压包用。
v是选择是否要可视化,zf是固定的。
两种压缩工具对于用户没有区别。
23. bc命令
linux中的计算器程序
进入计算器之后输入quit退出。
bc可以直接计算浮点数。
tips:
[Tab]按键---具有『命令补全』和『档案补齐』的功能
[Ctrl]-c 按键 --- 让当前的程序『停掉』
[Ctrl]-d按键---通常代表着:『键盘输入结束(End Of File, EOF 戒 End OfInput)』的意思;另外,他也可以用来取代exit
shutdown指令
云服务器永远不关机。
-h : 将系统的服务停掉后,立即关机。
-r : 在将系统的服务停掉之后就重新启动
-t sec : -t 后面加秒数,亦即『过几秒后关机』的意思
24 . shell命令及运行
windows的图形界面就算是一种shell,shell是一层包装内核之后给用户使用的程序。因为使用者不见得善于直接操作内核与操作系统、硬件等部分,所以装一个shell来友善化使用。
因此shell其实是一种命令解释器,将用户的指令接受后转换成各个机器以及硬件能理解的指令并下达指令。
观察centos,发现其shell的名字叫bash。
bash是shell的一种,shell是对这一大类"表壳软件"的总称。
centos使用的就是bash。