• Linux系统编程:Linux基础


    Linux基本使用

    安装

    这就不说了网上很多教程,随便一个Linux版本都可以,因为命令都差不多。

    检查是否有网络

    检查网络有以下几个推测方法,如果没有网络的话就按照这几个可能出现问题的地方对症下药寻找解决办法即可:

    ctrl + alt + t //打开终端,这是对有图形界面的Linux而言的
    ping www.baidu.com //看和百度的服务器是否连接(即看和外网是否连通)
    ping 192.168.14.1 //看和本地路由器是否连通(xxx.xxx.xxx.1一般是路由器地址,前面xxx部分你要自己检查自己的网关是多少)
    ping 127.0.0.1 //看本机网络环境是否有问题
    ctrl+C //可以终止程序
    
    • 1
    • 2
    • 3
    • 4
    • 5

    几种网络连接方式

    在这里插入图片描述
    其中Bridge桥接模式其实就是分配了一个ip地址给我们的虚拟机,这样位于同一个网段的话windows自然和虚拟机就是网络连通的,而NAT网络地址转换模式粗略理解就相当于在我们的Win机器上设置了个路由器用来路由到我们的Linux虚拟机,此时虚拟机就位于windows电脑的内网,内网可以访问外网,但外网一般不可以访问内网,除非使用一些特别的技术,比如NAT穿透。

    建议使用NAT网络地址转换模式。

    怎么设置静态IP地址

    首先全部设置为自动模式:
    在这里插入图片描述
    然后重启网络,测试有没有网络。
    然后查看detail分页的信息,记录下来。
    在这里插入图片描述
    最后切到 IPV4 分页并设置成手动模式:
    在这里插入图片描述

    远程连接工具连接虚拟机

    在这里插入图片描述
    远程连接工具和虚拟机之间就是一个C/S架构,通过SSH协议连接。要使用这个功能时我们要在server端也就是我们这里的虚拟机的Linux上下载SSH服务的服务器端程序sshd,ubuntu上使用命令sudo apt install ssh;
    而在CentOS上则是使用sudo yum install ssh。
    然后用上图中的ps -elf|grep sshd 命令查看是否安装成功,如果在usr/sbin/目录下看到sshd则表示安装成功,sbin的意思就是system binary也就是系统的二进制文件目录,然后使用远程工具进行连接即可。
    这网上资料很多,这里就不再赘述。

    Unix与Linux历史概述

    在这里插入图片描述
    在这里插入图片描述
    Linux主要指的是一种内核,在该内核的基础上开发了很多软件包和工具就变成了所谓的发行版。
    在这里插入图片描述
    Unix也是一种操作系统,在上世纪七十年代美国的贝尔实验室经常发明非常多的有用的科技产品,比如交换机、晶体管什么的,Unix也诞生于这里。本来有三家组织要做一个多用户分时OS,项目名字叫multics,分别是麻省理工、通用电气和贝尔实验室,但是最后烂尾失败了。图上的Ken Tompson在这个烂尾的项目基础上面又进行了一番努力最后做出了Unix。
    值得一提的是,Unix是用B语言(发明者也是他)写的,B语言——Bonnie——名字灵感来源于Ken Tompson的老婆名字。

    但是因为B语言性能不怎么好,于是Ken和图中另一个人Dannis richres——他的同事两个人合作用C语言重写了这个项目,就出现了Unix。最离谱的是,C语言也是这两个人创造出来的,甚至还有Go语言!

    时间来到八十年代,众多公司敏锐的感觉到Unix的潜在价值(因为Unix是开源的),于是纷纷开始在Unix基础上开始二次开发,发行了各种发行版本。

    但是受限于当时的技术条件,这种Unix的各类发行版本都无法在个人PC机上运行,只能依托在各大公司的自建大型服务器平台上。

    最后在号称当时世界第一黑客Richard Stallman的号召下,他发起了一个活动叫GNU计划,该活动旨在让更多的人享有对源代码的修改和使用。

    在这里插入图片描述
    在这种开源计划的支持下,芬兰人林纳斯在研究生生涯中就开源出了最原始的Linux内核(一万来行)。后来就有不断的人才涌入共同维护这个内核,最后演变成了现在的Linux(超过七百万行)。
    在这里插入图片描述
    如上图所示,林纳斯也是在AT&T System V的 Minix 内核系统的基础上进行参考革新,使之能够在个人PC机上也能够正常使用,全世界也是看见了其能为个人PC机所用的潜力,纷纷在其基础上制作了各类发行版本。其中就有我们要学习的 Red Hat 红帽系列,其旗下有RedHat和CentOS两个版本,前者是企业版,付费提供给企业使用的,而后者则类似于一个社区版,是供各类开发者免费开源使用的。

    查看Linux系统内核信息

    Linux内核架构

    内核架构图:
    在这里插入图片描述
    Kernal内核的功能:
    1、管理硬件资源,如CPU、内存、外存设备、提供文件管理、内存管理、进程调度、网络通信硬件驱动等等
    2、为上层应用提供运行环境

    System calls系统调用:内核对上层应用程序提供的接口

    Library routines库函数:对系统调用进行包装,方便程序使用,如scanf还有printf

    Shell:一种命令解析器,其本质上是一个程序,它可以解析命令和执行命令,或者脚本(所谓脚本就是命令的集合)。

    所以从上图可以清楚的看见,上层应用application可以通过三种途径来调用系统调用。

    Linux发行版本

    所谓Linux的发行版本约等于Linux内核 + 其它的支撑软件。

    在这里插入图片描述
    重点说一下debian系列的ubuntu版本和redhat的centOS版本,因为这两个版本不出意外是接触最多的。
    这俩版本大体上差不多,只有小部分命令有所区别,比如包管理器ubuntu用的是dpkg,使用的下载命令是apt install …这个我们之前用过的。
    而centOS用的包管理器是yum,其对应的下载软件的命令是yum install…所以要注意区别。

    所谓包管理器其实就相当于手机上的应用商店,专门用来下软件的一个东西。

    上面还提到了一下德国的发行版本OpenSuse,这是因为如果在菊厂工作的话因为菊厂被美国制裁了嘛,所以他们公司的服务器都是使用的德国的OpenSuse。

    Linux帮助命令

    man命令(查看手册)

    man不是男人,是manual手册的一个缩写。
    使用man man指令就可以查看man手册能够提供的所有内容:
    在这里插入图片描述
    回车打开下面页面:
    在这里插入图片描述
    上图的最左上角有个MAN(1),意思是该手册是位于分区一号的手册,Linux手册有很多分区,在上图的下面DESCRIPTION部分可以看到全部九个分区各自存放着些什么样的内容,其中重点关注前三个分区。

    如果英文好一点的话就可以知道三个分区分别对应着什么内容:
    1、查找Shell指令
    2、查找系统调用
    3、查找库函数

    然后按q就可以退出,按h可以查看帮助文档。
    按如下按键可以进行翻页:
    在这里插入图片描述
    如果有不懂的指令,使用man + 指令名可以轻松查找,比如想问一下 ls 指令是干嘛用的:
    在这里插入图片描述
    回车打开该指令相关信息:
    在这里插入图片描述

    uname命令(查看内核信息)

    在这里插入图片描述
    使用uname命令查看uname命令的帮助文档:
    在这里插入图片描述
    从上图可以看见Uname也是个指令,用来查看系统信息,uname命令后面可以跟可选参数([optional]),加上-a则查看所有信息:
    在这里插入图片描述
    然后因为-a意思打印所有信息嘛,但其实就是将man手册中所有展示的命令所能展示的所有内容都打印出来了,并且顺序一一对应。
    比如上图中-s表示kernal name,就对应着我们用-a打印的信息中的Linux;
    -n 表示节点名,就对应着我们-a打印的信息中的ubuntu;
    -r表示发行版本,就对应着我们-a打印的信息中的5.15.0-76-generic…
    从上到下,从左到右一一对应。

    其它指令也是类比于此。

    一些工作中的术语

    下面这是kernal.org的网站,可以用来查看内核信息。
    图中红圈标注的内容是工作当中经常会用到的术语。
    在这里插入图片描述

    查看Linux的发行版本信息

    在这里插入图片描述

    Ubuntu表示发行版本,22.04表示版本号,LTS表示Long Time Support长期支持版本。

    用户子系统命令

    Linux的用户系统可以分为以下三类:

    1、超级用户:拥有所有权限,其实就是根用户:root
    2、普通用户:包括sudoers(临时拥有特权用户权限的用户)和其它用户

    sudoers其实我们使用过,之前下载软件的时候不就是用的sudo apt install嘛,这其实就是sudoers用户。
    这个用户一般都是我们在创建ubuntu系统时,系统都会让我们再创立一个子用户来登录该系统,这个子用户其实就是sudoers,它可以临时拥有一个特权用户root的权限。

    查看所有的用户

    在这里插入图片描述
    这下面会显示这个系统上的所有用户:
    在这里插入图片描述
    明明我的系统就两个用户ubuntu子用户和root根用户呀,为啥会有这么多呢?
    其实剩余的都是我们在apt install下载软件时给那些下载的软件去使用的,因为这些软件在下载时需要和ubuntu进行连接,需要确定用户名和密码才能连接进行下载或者使用,所以也会存储在这里。

    子系统用户信息查看与剖析

    我们从上面图中截取出我正在使用的子用户:
    在这里插入图片描述
    上面的截图是我的云服务器上的截图,可能一些内容和老师说的不太一样,所以这里我再放上我虚拟机上的信息截图,更好分析一些:
    在这里插入图片描述

    在Linux系统中,我们通过命令去查看信息时,系统反馈的信息都是用列来展示的,并且列与列之间通过冒号来分隔,从左到右逐个分析一下:
    1、thesea:这表示用户名
    2、x:以前这里显示的其实是密码,但后面发现不安全就废弃了,现在全被设置成了x
    3、1000:表示用户ID,用来标识用户
    4、1000:表示组ID,即该用户属于哪个用户组
    5、TheSea,:表示该用户的评论信息,comments
    6、/home/thesea:表示该用户的家目录(这意味着你要创建文件或者文件夹最好是到你的家目录去)
    7:/bin/bash:该用户的默认Shell程序,即bashShell(大多数Linux发行版本的默认Shell都是GNU计划下出来的BashShell)

    添加用户

    使用man命令查看useradd指令信息:
    在这里插入图片描述
    因为我们系统现在不是root用户,所以用不了添加用户的指令:
    在这里插入图片描述
    就像我们之前说的,需要使用sudo命令去申请临时权限:
    在这里插入图片描述
    可以看见添加成功,查看所有用户:
    在这里插入图片描述

    在最底层我们的test用户已经创建成功。
    通过useradd添加用户时,默认的shell是sh,它远没有bashShell好用。
    另外它也不会自动创建家目录,虽然它这里能显示家目录存在,但我们去家目录中会发现根本没有这个目录:
    在这里插入图片描述
    因为用useradd添加用户会存在上面两个问题,所以一般我们不会这样去添加,所以我们把它删了再重新添加。

    删除用户

    在这里插入图片描述
    再使用cat /etc/passwd查看发现确实已经被删除。

    正确创建用户的命令

    在这里插入图片描述
    其中-m参数表示自动创建家目录,-s目录表示指定shell命令类型,-s后面跟/bin/bash表示指定shell为bashShell,最后test是创建用户的用户名。
    在这里插入图片描述
    可以看见按照我们的设计的步骤实现了,再去查看一下home目录中是否存在:
    在这里插入图片描述
    完美解决。

    切换用户

    su指令,即switch user的意思:
    在这里插入图片描述
    可以看见我们输入密码之后成功切换root用户,明显可见的是普通用户的提示符是$符号,而root用户的提示符是#符号。
    我们再切换回普通用户:
    在这里插入图片描述
    可以看见root用户切换普通用户并不需要输入密码,因为root用户拥有最高权限,所以不需要输入密码。
    退出切换用户可以使用exit,比如我们现在不是正在ubuntu用户吗?
    使用exit之后退出到root,再exit之后退出到ubuntu,再exit之后就退出系统了:
    在这里插入图片描述

    设置或修改密码

    在这里插入图片描述
    同样记得用sudo获得临时特权来实现这个功能,当我们第一次使用这个命令时是在设置新用户的密码,但是如果这个用户是有密码的话则是在重置它的密码。

    正确删除用户的命令

    之前我们说了正确的创建用户的命令,但是如果我们用普通命令(即sudo userdel test)的方式去删除该用户的话,那么家目录是不会被删掉的,因此我们同样需要指定参数使用正确的删除用户的命令来删除用户:
    在这里插入图片描述
    -r的意思是remove,删除其下所有的内容包括邮箱什么的,这个参数的描述可以使用man手册查到。
    上面提到什么什么not found意思是该用户的邮箱没有找到,但其实已经执行删除了。
    在这里插入图片描述
    可以看见已经删除,并且去家目录查看一样test是被删除了:
    在这里插入图片描述

    文件子系统命令

    基础命令

    pwd显示Shell这个进程的当前工作目录:
    在这里插入图片描述

    cd改变当前工作目录,比如用cd ~回到当前用户的家目录:
    在这里插入图片描述
    cd .表示当前目录(注意cd后面跟了一个小点):
    在这里插入图片描述
    cd … 可以回到上一层目录:
    在这里插入图片描述
    cd / 表示切换到根目录。
    cd - 回退到上一次的目录(注意再一次使用cd -时又会回到这次目录了,它严格执行回到上一次目录这个规则)。

    Linux文件目录

    在这里插入图片描述
    bin(binary):可执行程序
    dev(device): 设备文件
    home:普通用户的家目录的根目录
    root:root用户的家目录(这也说明root用户的权力至高无上,拥有最高权限)
    sbin(system binary):和系统相关的可执行二进制文件
    var(variable):经常发生的文件,比如日志文件
    etc:配置文件
    lib:库文件
    proc(process):进程映射文件

    文件夹命令

    mkdir创建文件夹

    这里要注意创建文件夹一定不要在根目录下进行创建,要去自己的家目录里面创建:
    在这里插入图片描述
    也可以连续创建多个:
    在这里插入图片描述

    rmdir删除文件夹命令

    在这里插入图片描述
    这里要注意:rmdir 只能删除空文件夹,这一点可以通过man手册查到:
    在这里插入图片描述

    ls罗列文件夹内容

    在这里插入图片描述

    这个参数还比较常用,介绍一下,当然这些参数在man手册中都能找到,这里介绍平时比较常用的一些参数:
    首先是-a:表示展示出所有文件内容,包括点开头的隐藏文件。
    然后是-l:表示展示出文件夹中每个文件的详细信息:
    在这里插入图片描述

    文件夹信息详细

    可以看到一个文件有很多列,我们来详细学习一下每一列作用:

    第一列信息

    首先是第一列,可以看到第一列组成为:drwxrwxr-x;
    先来看该列第一个字符所表示的含义:

    开头第一个字符为d则表示文件的类型为directory,文件夹
    若开头第一个字符为-的话,则表示普通文件:
    在这里插入图片描述
    可以看见上图中的所有普通文件的第一列第一个位置都是 - 。
    开头第一个字符为l的,表示其为一个符号链接(软链接)。
    开头第一个字符为c的话,表示其为一个字符设备(比如键盘)。
    开头第一个字符为b的话,表示其为一个块设备(比如硬盘,其读写数据是按一块一块来的)
    开头第一个字符为p的话,表示其为一个管道文件(用来进程间通信使用)。
    开头第一个字符为s的话,表示其为一个套接字文件(用来进行网络通信)。

    然后除开刚刚介绍的第一个字符,剩下的还有九个字符则分为三三一组,都用来表示具有什么什么权限,先来介绍各字符含义:

    r:表示read,具有读权限
    w:表示write,具有写权限
    x:表示execute,表示具有执行权限
    -:表示没有对应的权限

    那么上面的九个字符三三一组的话,从左到右可分解为:
    rwx rwx r-x
    从左到右第一组:rwx表示当前用户对该文件所具有的权限,即读写执行权限当前用户ubuntu都有。
    第二组:rwx表示当前用户所属用户组的用户成员对该文件的读写执行权限有哪些。
    第三组:r-w表示非同一个用户组的其它用户对该文件所具有的权限有哪些,这里明显只有读权限r和写权限w。

    第二列信息

    第二列可以看见是个数字2,其表示该文件的硬链接个数。

    第三列信息

    第三列信息很明显啦,就是用户的名称。

    第四列信息

    第四列信息表示该用户所属的用户组组名。

    第五列信息

    第五列信息4096就表示该文件的大小。

    第六到八列

    第六到八列很明显就是个时间,它表示上一次该文件被修改的时间。

    第九列

    第九列就不用说啦,就是我们的文件名了。

    继续讲解ls的一些常用参数

    -h表示human readable,表示展示文件以一种人类可读的方式,再加上-s或者-l可以打印更加详细的信息:
    在这里插入图片描述
    -i表示该文件的inode号,该inode保存了该文件的整体信息,我们可以通过该inode去拿到该文件的所有信息:
    在这里插入图片描述
    每行文件前面的第一列的数字就是inode号,如果两个文件的inode号是一样的,则说明它们保存的是同一个文件。

    另外ls或者ll如果后面不跟具体所要打印文件信息的文件夹名字的话,则默认打印的是当前文件目录的所有文件信息。

    插入知识点:通配符(wildcard)

    *号:表示可以匹配任意多个字符(包括0个字符)
    ?号:表示可以匹配任意一个字符
    [charactes]: 表示可以匹配集合内的任意一个字符
    [!charactes]:表示匹配集合外的任意一个字符
    类:[0-9]表示数字,[a-z]表示小写字母,[A-Za-z]表示字母…等等

    继续讲解文件系统命令

    cp拷贝文件或文件夹

    第一种形式:cp fileName dirName(拷贝文件到对应的目录(文件夹中)下)
    在这里插入图片描述
    第二种形式:cp file1 file2(把文件复制到另一个文件当中,如果文件不存在就会创建文件,如果文件存在则覆盖文件)
    这个可以加个-i参数让在覆盖之前提醒一下:
    在这里插入图片描述
    输入y表示同意覆盖,输入其它的都表示否定。

    第三种形式可以加入通配符然后一条指令多copy几个到某个文件目录中:
    在这里插入图片描述
    第四种形式:cp dir1 dir2 -r 有下面几种情况(-r参数意思是递归的将dir1中内容拷贝到dir2中,如果dir1为空则可不用加-r,否则必须加):
    1、如果文件不存在,创建文件夹,并把dir1所有的内容copy dir2中
    2、如果dir2存在,会将dir1以及它里面的内容copy到dir2中

    第五种形式,一次性复制多个文件夹: cp dir1 dir2 dir3 -r (将dir1 dir2复制到dir3中)
    在这里插入图片描述

    cp的常用参数系列

    在这里插入图片描述
    当我们要复制很多文件到一个目的文件夹中去,但是目的文件夹中可能有些文件已经存在了,但我们只想复制目的文件夹中不存在的文件,或者只复制目的文件夹中已经存在的文件但被我们更新了内容的文件,这个时候就可以使用-u参数来实现这个效果。

    mv移动或者重命名文件(夹)命令

    第一种形式:
    在这里插入图片描述
    可以看见我把当前目录下的extern.h文件移动到当前目录下的asd文件,即实现了重命名的效果。
    即 mv file1 file2
    把file1移动到file2,如果文件不存在,则创建文件,如果文件存在,则直接覆盖文件。

    第二种形式:mv file dir (如果dir存在,将file移动到目录中)

    第三种形式:mv dir1 dir2 有以下几种情况:
    1、若dir2存在,将dir1移动到dir2中
    2、如果dir2不存在,创建dir2目录,并将dir1中的内容“移动”到dir2中(如果两个都是在相同目录下进行移动则就是重命名的效果)

    mv的命令参数和cp差不多,但是mv命令不需要-r递归参数,这是由Linux系统VFS虚拟文件系统的逻辑存储与物理文件系统磁盘的物理存储的关联映射决定的,先来看copy的:
    在这里插入图片描述

    当copy的时候,以上图cp -r dir1 dir3为例:

    先可以假设dir1在物理文件系统上的存储是一个简化的链表,然后当执行这一句复制命令的时候,相当于在disk磁盘中又复制了一块相同的物理块来存储复制到dir3文件目录下的dir1文件夹。
    那么执行复制内存块的时候,那肯定就是递归复制的呀,递归穷尽dir1文件夹中的所有文件,然后复制到disk硬盘中的另一块物理块中存放。

    而mv命令则不然:
    在这里插入图片描述

    mv命令其实只是改变了文件夹各自的索引关系,但并不会在disk磁盘上复制新的空间出来,所以自然不需要递归的拷贝文件。

    rm删除文件或者文件夹下面所有文件命令

    在这里插入图片描述
    其参数都和上面讲的差不多,-i表示删除之前询问一下,-r表示递归删除所有文件内容,-v表示打印详细的删除过程,-f表示不管三七二十一强制删除所有文件。

    所以使用该命令时一定要小心,因为删除之后Linux是没有所谓回收站的东西的,删除了就是删除了,再也找不回了。

    硬链接与软链接

    硬链接和软链接的主要区别:硬链接是指多个文件名指向同一个文件数据块,而软链接则是指一个特殊的文件,其中包含了指向另一个文件的路径。

    硬链接是在文件系统中创建多个文件名指向同一个文件的数据块。这些文件名在文件系统中被视为等同的,因为它们指向相同的数据块。

    在创建硬链接时,新的文件名与原始文件名都指向相同的数据块,因此,如果其中一个文件名被删除,文件数据仍然存在于文件系统中,因为它仍然被其他文件名所引用。

    硬链接只能在同一文件系统中创建,因为它们需要指向相同的数据块。 软链接是一个特殊的文件,其中包含了指向另一个文件的路径。

    软链接在文件系统中被视为不同的文件,因为它们指向不同的数据块。如果原始文件被删除,软链接将失效,因为它指向的文件路径不再存在。

    ln软硬链接创建命令

    在这里插入图片描述
    我们通过参数-s来指定创建软链接,如果不加参数-s则表示创建硬链接。

    我们之前说过文件描述信息中有一列是用来表示其硬链接数的,我们可以来验证这个事情:
    在这里插入图片描述
    上图中,dir是我们创建的最上层目录,然后下面创建了三个子目录dir1,dir2,dir3,可以看见还有一个点文件和一个点点文件。
    但其实点文件就是表示当前目录,而点点文件表示返回上一层目录,命令或这目录本身也就是一个文化,众所周知在Linux系统中万物皆文件。
    然后文件描述信息的第二列可以看见点文件有五个硬链接,然后dir1、dir2、dir3都只有两个硬链接,这是怎么来的?
    在这里插入图片描述
    很好理解,如上图所示,点文件因为表示当前目录,所以点是dir的一个硬链接,dir1、dir2、dir3的目录下也分别有一个点点链接来指向dir目录,所以dir的硬链接再增加三个,再加上本身dir也是一个物理存储系统上真实文件的硬链接,所以总共有五个硬链接。

    而dir1本身指向物理存储系统的真实文件,是一个dir1目录文件的硬链接,再加上dir1下有一个点文件,该点文件也是指向dir1所以也是个dir1的硬链接,所以dir1有两个硬链接,dir2和dir3同理。

    所以如果创建的是个目录文件的话,默认有两个硬链接,一个文件目录本身再加上一个点文件;
    而如果创建的是个文件的话,则只有一个硬链接,即文件本身就是该文件存储块的硬链接。

    我们创建一个文件:
    在这里插入图片描述
    可以看见a.txt文件的硬链接数为1,我们为其增加一个硬链接:
    在这里插入图片描述
    可以看见a.txt文件的硬链接数为2,然后新建的hard_link的链接数也为2。

    我们可以通过ll或者ls 的-i参数去查看它们的inode号来看它们是不是指向的同一个物理块:
    在这里插入图片描述
    可以看见是一样的。

    我们来为a.txt创建软链接,创建软链接时可以用绝对路径也可以用相对路径:
    在这里插入图片描述
    上面用的是相对路径,为上一层目录下的a.txt文件创建了一个软链接在当前目录文件下。

    创建绝对路径的软链接:
    在这里插入图片描述
    在工作当中,相对路径其实用的是比较多的,比较有效,建议使用相对路径,而且创建软链接的应用是比较多的,比起硬链接也更方便。

    查找文件命令

    locate根据文件名查找文件位置

    在这里插入图片描述
    如果没有这个命令只要下载对应的软件包即可。

    但要注意这个命令的一个细节:
    这个命令查找文件非常快,这是因为在安装该软件的时候它会将本机系统的所有软件存到它自带的数据库中,在该数据库中进行查找会很快。但是如果是新建的文件,它还没来得及添加对应的信息到数据库中的话就会找不到:
    在这里插入图片描述
    但其实我们才创建的这个文件是肯定存在的,所以要注意这个问题。

    which定位命令指令(工作常用)

    在这里插入图片描述
    这个所谓的command其实是指一个可执行程序。

    which指令会在环境变量$PATH设置的目录里查找符合条件的文件,这样就能知道我们使用的命令是哪个。

    也就是说这个命令是用来查找一个可执行程序的。

    在这里插入图片描述

    tree命令展示文件夹目录以及子目录

    在这里插入图片描述
    上面这是展示当前目录的所有文件结构,如果没有tree命令的话可以用下面命令下载:

    sudo apt—get install tree
    
    • 1

    用which tree来查看是否下载成功。
    在这里插入图片描述

    find文件查找命令

    其参数很多,列举如下

    find path -name fileName(根据文件名查找文件)

    根据名字进行查找,path也就是指定在什么路径下查找,双引号也就是要查找的文件的名称:
    在这里插入图片描述

    find path -type fileType(按文件类型查找文件)

    在特定路径下根据指定类型查找返回所有文件:
    在这里插入图片描述
    这里的f表示普通文件,类似的文件类型还有如下:
    在这里插入图片描述
    剩下的其实在man手册中都有,没事儿可以多看看。

    find path -perm num(根据所具有的权限来查找文件)

    比如:

    find . -perm 664
    
    • 1

    它其实查找的就是rw-rw-r–权限的文件,因为每三位表示一个用户的权限状态嘛,那rw-其实对应的二进制就是110 = 6,同理rw- 就是110 = 6,r–对应的二进制就是100 = 4
    来试一下:
    在这里插入图片描述
    可以看见当前目录下的passwd文件的权限为rw-r–r–,那么对应的二进制数转十进制应该就为:644,我们来查找一下:
    在这里插入图片描述

    find path -empty(查找空文件)

    通过该命令可以查找空目录和空文件,空目录默认大小为4096个字节,所以要查找空目录,应该使用-empty。

    file文件的逻辑运算参数

    -a(and逻辑与) -o(or逻辑或) !(逻辑取反)

    比如我想查找当前目录下的所有以.cpp后缀或以.cc后缀结尾的文件:
    在这里插入图片描述
    其中-o就起到了或运算的作用,*还记得吗,这是我们之前说过的通配符,表示所有。

    命令的组合

    顺序组合方式

    也就是命令依次执行:
    在这里插入图片描述

    -exec组合命令

    在这里插入图片描述
    如上图所示,假设我们现在的需求是找到文件名为stdio.h的所有文件了,但是想用ls -l的方式打印每一个文件的详细信息,如果没有-exec的话我们只能一句命令一个打印,效率很慢,但如果使用-exec的话则很方便:
    在这里插入图片描述
    -exec会将上一条命令的所有结果以行的方式放进大括号{}占位符当中,然后执行-exec后面的命令,效果如上所示,这样就可以批量执行命令了。
    总结就是:把一个命令的输出结果,以行为单位当作另外一个命令的参数。

    chmod修改权限命令

    文字设定法

    修改格式为:

    chmod [u g o a] [+ = -] [r w x] file/dir
    
    • 1

    上面的u g o我们都知道,之前说过u表示当前用户所具有的权限,而g表示同一个用户组的其它成员所具有的权限,o则表示其它用户组的用户对该文件所具有的权限,a则表示是让所有用户都对其具有某种权限;而+表示给该用户添加某权限,=表示把某权限修改成特定的权限,-表示去除掉某个权限;rwx就表示具体的某种权限啦,file/dir就是指是修改哪个文件或者文件夹的权限。

    试一下:
    在这里插入图片描述
    我们用无法执行hello.py脚本文件,所以我们要对其进行修改权限,以获得执行权限:
    在这里插入图片描述

    可以看见修改成功并且成功执行了。
    下面是使用等号的写法:
    在这里插入图片描述
    还有一种多参数的写法:
    在这里插入图片描述

    数字设定法(常用)

    命令格式为:

    chmod 三位八进制数字 file/dir
    
    • 1

    这个就和之前说的一样,测试如下:

    在这里插入图片描述

    文件掩码umask

    在这里插入图片描述
    当文件产生的时候,会对umask产生影响,该影响可以是获得也可以是创建该文件的文件掩码。
    在Linux和Unix系统中,umask命令用于设置文件和目录的默认权限掩码。权限掩码是一种位掩码,它与文件和目录的权限进行“与”操作,从而确定新文件和目录的默认权限。umask命令是一个重要的系统级别命令,它可以影响文件系统中所有用户创建的文件和目录的权限。

    我们获取一下现在的文件掩码:
    在这里插入图片描述
    可以看见当前用户的umask为0002(普通用户的文件掩码就为0002),第一个数字0是用来作其它用途的,剩下的002才是专门用来用于权限相关的。

    来看看root用户的文件掩码:
    在这里插入图片描述
    可以看见root用户的文件掩码为0022。
    新建文件夹的时候可以看到默认的当前用户权限为rwx,对应的二进制位转十进制数字为:777:
    在这里插入图片描述

    这是创建文件夹时默认的权限设置,即读写执行权限都有。
    但我们会发现在其它组用户对于当前文件夹的权限情况都能看到清一色的缺少w也就是写权限,而其它权限又都是全部权限都具有这是怎么做到的?
    在这里插入图片描述
    这其实是默认权限777与当前用户的文件掩码取反之后按位与后的结果:

    777 & (~umask)
    
    • 1

    已经知道777位111 111 111,而002为000 000 010,对002取反:111 111 101,然后与777与运算后为:111 111 101就等于775。
    即该文件夹的权限就被设置为rwxrwxr-x。

    上述是对于创建文件夹的情况,创建普通文件时默认的权限是666.
    我们可以临时修改umask文件掩码的值来验证我们刚刚说的事情(临时修改的umask在重新登录时就会变回原来的默认值):
    在这里插入图片描述
    现在文件掩码我们改成了0222,又因为创建文件夹时的默认权限为777,现在对222按位取反:101 101 101,再于777进行按位与结果为:
    101 101 101,就为555,所以其对应的权限就为r-xr-xr-x,这正好对应了我们上面新建的文件夹dir5的权限设置情况。

    那再来看一下更改了文件掩码的新建文件的权限效果:
    在这里插入图片描述

    因为文件的权限默认设置为666,此时的文件掩码为222,对其按位取反为:101 101 101,666的二进制情况为110 110 110,二者进行按位与结果为:100 100 100,所对应的文件权限就为:r–r–r–,一如上面的a.txt的权限列表。

    查看文件内容命令

    cat命令

    很经典的命令:

    cat 文件名
    
    • 1

    cat命令很简单,本质就是个小程序,它将标准输入的内容给读到这个程序里面然后再从程序里面把这个内容输出到标准输出中。
    这里先补充一些内容:
    在这里插入图片描述
    在这里插入图片描述

    比如这里我们使用cat然后重定位到a.txt文件中,这样我们就可以在标准输入也就是我们的键盘上键入内容,然后ctrl+d(或者ctrl+c)可以停止输入,再用cat命令加文件名就可以将刚刚的标准输入输出到标准输出,也就是我们的显示器上,就可以看到我们刚刚所键入的内容都被保存在了a.txt中:
    在这里插入图片描述
    我们也可以试一下在读取a.txt文件时将它的内容不显示在标准输出中,而是重定向到另外一个文件b.txt:
    在这里插入图片描述
    查看b.txt:
    在这里插入图片描述
    内容一模一样。

    echo命令

    它的作用是打印一行文本信息:
    在这里插入图片描述
    上图中第一行打印了空文本,第二行打印了一句hello world,第三行我们将文本内容重定位到了一个新的文件e.txt中。

    head命令

    该命令用来打印一个文件内容的开头部分内容,可以通过参数指定其打印多少开头的内容:
    在这里插入图片描述
    比如我们要打印一下b.txt文件的前面两行内容:
    在这里插入图片描述

    tail命令

    和head命令就完全相反了,也就是打印某文件的倒数多少行,这里不再赘述。
    工作当作经常会用该命令去查看日志文件,因为日志文件都是在文件末尾追加的。

    more和less命令

    这俩命令功能是一样的,只是实现不太一样,因为more这个程序先出来,但是因为设计的不够简介不够优秀所以在其基础上又做了个less出来,反正就都能用,没什么区别,就是用来单页浏览用的。

    当文件内容非常多时,用cat的话就会唰唰的在屏幕上打印内容根本不等你看完,用more或者less的话屏幕每回只会打印一页的内容,然后我们看完就可以按f往前翻,按b往后翻。这样就可以进行翻页查看,非常方便。

    f:forward,向前翻
    b:backward,向后翻
    q:quit,退出

    其它操作命令

    sort排序命令

    在这里插入图片描述

    uniq去重指令

    演示:
    在这里插入图片描述

    注意去重只是对连续的行进行去重,不连续的行不去重,并且和sort一样只是在内存中进行操作但并不保留结果在原来的文件中。

    如果要对不连续的也一并去重的话,可行的办法是先对内容进行sort排序,让一样的内容在连续的行出现,再使用uniq去重指令进行去重就可以得到真正的去重结果。

    file查看文件类型命令

    使用file可以查看关于文件的更多描述信息。
    在这里插入图片描述

    wc统计命令

    在这里插入图片描述

    iconv字符编码转换命令

    该命令可以转换字符集:
    在这里插入图片描述
    -f和-t就是from什么编码转换成to什么编码的缩写。

    grep文本查询命令(重要)

    在这里插入图片描述

    正则表达式(regular expression)

    在这里插入图片描述

    grep应用

    该命令应用场景集中体现在文本查找中,比如查找什么关键字、关键句子之类的东西。
    所以都是在文件当中找,无法在文件夹中找。
    grep的运行原理是打开文件,然后按行来读取文件内容,如果本行里面拥有匹配模板的字符串,那么就染色这个字符串,并打印输出。
    我们来试一下,先往b.txt文件中写入一些内容:
    在这里插入图片描述
    然后使用grep来查找:
    在这里插入图片描述

    双引号内部就是正则表达式的内容,-n表示打开行号显示,-E表示使用扩展的正则表达式(因为正则表达式并不是只有一个版本,所以我们一般都会使用这个拓展的版本)。
    再试一下其它的正则表达式:
    在这里插入图片描述
    还有一些比较常用的参数,比如 -i忽略大小写。

    alias定义或者显示别名命令

    直接输入alias时会显示当前系统所有有别名的命令:
    在这里插入图片描述

    设置别名

    在系统有一个命令可以用来查看最近使用到的命令集合,就是history:
    在这里插入图片描述
    直接输入history就可以查到这些。
    然后我们用alias来为其设置一个别名:
    在这里插入图片描述
    现在输入h的效果就等同于输入history:
    在这里插入图片描述
    但其实这样取别名只是临时生效,当重新登录系统时就会发现没掉了。

    打包和压缩命令

    tar命令实现打包

    tar (主选项 + 辅选项) 目标文件名 源文件或目录名
    
    • 1

    主选项:(只能选择其中一个)
    -c:create
    -r:追加
    -x:释放
    辅选项:(可以选择多个)
    -f:指定文件名称
    -v:verbose,显示压缩和解压缩的详细过程
    -z:用gzip算法进行压缩和解压缩

    这里我们实现一下想要打包该文件目录下的所有以.txt文件结尾的文件:
    在这里插入图片描述
    上图中我们使用了tar -cvf tarball *.txt的命令完成了这个功能,其中参数部分-cvf的-c就是创建一个新的打包文件(再次提醒这个主选项只能选择一个),然后-v打印其打包过程,-f则是指定文件名称,这两个都是辅选项。

    tar解打包命令

    我们将上面的打好的包移动到新的目录中,再执行解打包:
    在这里插入图片描述
    也可以打包时把压缩包文件名带上,这样规范一点:
    在这里插入图片描述
    规范之后甚至还有高亮显示,所以注意一点吧。

    现在解打包:
    在这里插入图片描述

    -x释放,依然只能选择一个主选项,剩下两个一样。

    使用压缩算法打包和解包

    这个其实就比上面的内容多了一个-z的参数,-z就是用gzip算法来进行压缩和解压缩的。
    压缩打包:
    在这里插入图片描述
    压缩打包时要注意一个点,必须得把-z参数加在最前面,否则会报错并且打包出一个z文件,这肯定不是我们想要的,所以必须得把-z参数放在最前面这样才行。
    或者还有另外一种方法,就是不加-,此时z放什么位置都行:
    在这里插入图片描述
    我们将tarball压缩文件移动到dir2文件夹中然后解压缩:
    在这里插入图片描述

    磁盘相关的命令(运维人员用的比较多)

    df查看磁盘整体情况

    在这里插入图片描述
    使用下:
    在这里插入图片描述
    加上-h参数会更清晰:
    在这里插入图片描述

    du查看某个目录下的磁盘使用情况

    在这里插入图片描述
    如果不加路径参数的话,则默认是查看当前目录下的磁盘使用情况。

    查看指定路径也就是具体目录下磁盘使用情况:
    在这里插入图片描述
    使用-d参数后面跟0的话可以只显示当前单层目录的数据量之和(即不包括各个目录下面的子目录)。跟1的话则是只显示当前单层目录各目录的数据量:
    在这里插入图片描述
    以上就是管理磁盘经常会使用到的东西。

    远程拷贝(其实就是上传下载)

    scp(secure copy)远程拷贝上传命令

    首先要知道它使用的协议书SSH协议。

    命令格式如下:

    scp [-r] src dest //src为要被拷贝的路径 dest则是目的路径
    //-r参数可选,如果传的是单个文件则不需要递归传送,即不需要-r参数,但如果是文件夹则需要-r参数递归传送
    
    • 1
    • 2

    src本地路径很好写,但是远程路径有要求,指定格式如下:用户名@IP:目的机器的路径

    scp远程下载命令

    其实就是把上面的顺序换一下就好了,把原来的src换成dest,dest换成src即可。

    公钥密钥创建使用

    上面进行上传下载时每回都需要进行密码验证比较麻烦,但我们可以通过生成一对密钥公钥来交给对应的远程机器,从而建立安全连接就不再需要输入密码了。

    生成公密钥命令:

    ssh-keygen
    
    • 1

    在这里插入图片描述
    然后在home目录里面就有对应的公密钥了:
    在这里插入图片描述
    其中id_rsa就是我们的密钥,而id_rsa.pub就是我们的公钥。
    现在只要授予公钥给我们的机器就可以了,可以使用scp命令将该公钥上传过去:
    在这里插入图片描述
    然后在目标服务器使用追加方式(注意一定要用追加方式,否则之前的授权机器的码都会被覆盖掉就用不了了)将该公钥放到对应的文件夹(.ssh/)下对应的文件里面,即authorized_keys文件里面,即被认证的钥匙:
    在这里插入图片描述
    这个authorized_keys在你生成ssh公密钥的时候自动就会生成这个东西,是固定的,放进去就可以了。

    经过这样一套流程(两台机器互相给双方提供了公钥以后就可以无障碍通信了)以后后面再进行两台机器的传输就不需要再输入密码了。
    在网上找了一个例子来帮忙理解:
    在这里插入图片描述

    vim编辑器

    vim本质就是个编辑器,编辑器通常有以下两种:
    1、所见即所得的形式:记事本、word、markdown等
    2、命令式的:vi(老版本的vim),vim(m表示improved),还有emacs

    vim的三种模式

    普通模式(命令模式)

    使用ESC可以切换到命令模式。
    在命令模式下直接输入下面这些快捷键可以达到快速编辑的效果:

    i 表示插入内容在光标的前面。 I 表示插入到行首u。
    a 表示追加内容在光标的后面。 A 表示插入到行尾
    o 表示插入内容到下一行。 O表示插入到前一行(也就是当前行的上面一行)。

    上述这些称为短命令。
    与之对应的是长命令,也就是以冒号开头的命令。

    比如保存退出:
    先按ESC来到命令模式,然后输入冒号wq,w是保存,q是退出,即保存并退出的意思。

    注意下面的删除命令中,所谓删除都是剪切,使用p可以粘贴出来的:
    在这里插入图片描述
    在这里插入图片描述

    编辑模式(插入模式)

    使用i,I,a,A,o,O等键都可以进入编辑模式。

    视图模式(visual)

    视图模式的作用:用来选择范围。
    行优先选择,即行选模式,通过 v 键加上下键即可按行选择,其实就是windows下面的选择多行选择:
    在这里插入图片描述
    v键加上下键就可以多行选择了。

    同样也有列优先的,也就是竖选模式,使用ctrl+v就可以进入竖选模式:
    在这里插入图片描述
    以列为单位进行选择。

    在这里插入图片描述
    补充一个全文代码对齐的一个命令(只能对齐,但效果只能说一般肯定是没有IDE做的好的):

    gg=G

    这命令的意思是先按gg然后按=再按G就可以对齐了。

    光标移动快捷键

    在这里插入图片描述

    对文件的操作

    僵死状态

    对文件进行操作时要注意,不要使用CTRL+S保存文件,这会使得文件编辑进入僵死状态咋都动不了。
    当进入僵死状态后使用CTRL+Q之后就可以退出僵死状态了。

    :w保存文件

    :q退出文件(没有对文件进行修改的情况下可以直接退出,若修改了则退出不了)

    :q!强制退出(不保存修改直接退出)

    :wq保存修改退出文件

    vim多窗口操作

    在这里插入图片描述
    在这里插入图片描述

    使用vnew命令左右分屏操作:
    在这里插入图片描述
    使用tabnew多标签操作:
    在这里插入图片描述

    配置vim

    为什么需要配置vim,这是为了我们能够打造适合自己习惯的vim编辑器。
    比如vim默认没有设置行号,我们进入编辑器每回都要手动set number,这比较麻烦,那么我们就可以进vim的配置文件里面进行配置:
    在这里插入图片描述
    这里如果找不到自己系统上vimrc文件,可以看下面这个博客记录的解决办法,亲测有效:
    ubuntu找不到~/.vimrc解决办法

    我也是在home目录下找不到.vimrc文件,这里仿照该博主的方式,果然在进入/etc/vim目录下找到了该文件,按其说法:因为在启动vim时,/etc/vimrc和~/.vimrc都要被读取,只是~/.vimrc的优先级高,我们只要把/etc/vim/vimrc 复制为~/.vimrc。然后修改修改就可以了。当然自己建一个也可以,写入自己的配置命令。

    所以我在自己的home目录下直接创建了这么个文件:
    在这里插入图片描述
    然后里面写上了设置行号:
    在这里插入图片描述
    保存退出之后,用vim进入别的文件发现果然自动全部都设置了行号:
    在这里插入图片描述

    总结

    这就是Linux基本操作的全部了,剩下的随时不懂随时查就可以了,基本上这些是完全够用了。
    接下来就开始真正的Linux系统编程叭!!!

  • 相关阅读:
    java-File类
    浅谈Rust--学习心得及rust的优势与劣势
    socket 到底是个啥
    【C++笔试强训】第二十六天
    前端面试宝典React篇16 React Hook 的使用限制有哪些?
    【大学生痛苦版】
    C++11之decltype类型推导(使用场景、推导四规则、cv限定符)
    java多线程文件下载器
    1-丁基-3-甲基咪唑四氟硼酸[BMM]BF4|离子液体1-庚基-3-甲基咪唑六氟磷酸([HMIM][PF6])保存温度
    【Python】特殊方法、属性和运算符重载(22)
  • 原文地址:https://blog.csdn.net/qq_53324833/article/details/133656883