linux复习知识点版

试列举linux的主要特点:

与UNIX系统兼容

自由软件,源码公开

性能高,安全性强

便于定制和再开发

互操作性高

支持多任务,真64位运算


bash的命令基本格式:

  • 命令名必须是小写的英文字母
  • 一般格式中由方括号括起来的部分是可选的
  • 选项以"-"开始,多个选项可用"-"连起来
  • Linux操作系统的联机帮助对每个命令的准确语法都做了说明

|----------|------------------------------|
| 命令 | 说明 |
| who | 列出所有正在使用系统的用户、所用终端名和注册到系统的时间 |
| echo | 将命令行中的参数显示到标准输出(即屏幕)上 |
| date | 在屏幕上显示或设置系统的日期和时间 |
| cal | 显示公元1~9999年中任意一年或者任意一个月的日历 |
| clear | 清除屏幕上的信息 |
| passwd | 修改用户密码 |
| reboot | 重启 |
| poweroff | 关机 |
| shutdown | 关机 |

查看命令的帮助信息:

man 命令名:Linux系统命令手册

help 命令名:bash内置命令帮助信息

命令名 --h 或 命令名 --help:一般命令的内部帮助信息
文件组织方式:

树状结构 "根文件系统" 根目录(/) 是寻找所有文件以及其他文件系统的起点
文件路径:从某一树节点出发,沿树的分支到达目标文件或目录所在节点的路径

绝对路径:从根目录(/)出发直到目标文件或目录的路径

相对路径:从当前所在目录出发直到目标文件或目录的路径


~ 表示用户的主目录
. 表示当前目录
.. 表示上一级目录

在当前目录/home/liu中

/home/liu/abc = ./abc

/home = ../


通配符
*:匹配任何字符和任何数目的字符
?:匹配单一数目的任何字符
[ ]:匹配[ ]之内的任意一个字符
[! ]:匹配除了[! ]之外的任意一个字符,!表示非的意思


文件类型:
• Linux 中"万物皆文件"
• 普通文件、目录、字符设备、块设备、 套接字等
• 类型不同,操作界面相同
• 普通文件
• 文本文件、数据文件、可执行的二进制程序
• 目录文件
• 是一种特别文件,利用它可以构成文件系统的分层树状结构
• 设备文件
• 是一种特别文件,用来标记各个设备驱动器。字符设备、块设备等。
• 符号链接文件
• 是一种特殊文件,提供对其他文件的引用

|--------|-------------------------------|
| 命令 | 说明 |
| ls | 显示指定工作目录下之内容 |
| pwd | 显示当前工作目录的绝对路径 |
| cd | 切换当前工作目录 |
| cp | 将源文件或目录复制到目标文件或目录中 |
| mv | 对文件或目录重新命名,或者将文件从一个目录移到另一个目录中 |
| rm | 删除文件和目录 |
| mkdir | 创建目录 |
| rmdir | 从一个目录中删除一个或多个子目录 |

|--------|------------------------------|
| 命令 | 说明 |
| cat | 由第一行开始显示文件内容 |
| more | 一页一页的显示文件内容 |
| less | 一页一页的显示文件内容(与more类似),可前后翻页 |
| head | 取出并显示文件前面几行 |
| tail | 取出并显示文件后面几行 |
| touch | 修改文件或者目录的时间标签 |
| grep | 查找文件里符合指定模式的字符串,并显示包含该模式的所有行 |
| sort | 对文本文件的各行进行排序 |
| uniq | 检查及删除文本文件中重复出现的行 |

以下了解即可,wc掌握一下:

|----------|------------------------|
| comm | 对两个已排序文件进行逐行比较 |
| diff | 对两个文件进行逐行比较,列出差异信息 |
| cmp | 对两个文件进行逐字节比较,显示第一个差异位置 |
| find | 在指定目录下查找相应的文件 |
| wc | 统计指定文件的字节数、字数和行数 |

链接:为一个文件起多个名字,即别名。

实现文件链接(绝对路径):

  • 同目录下不同文件名
  • 不同目录下同文件名

文件链接形式:

  • 硬链接 -- 对象指针
  • 软链接(或符号链接) -- 快捷方式
    权限操作:
    • 文件主
    • 文件所有者( owner )
    • 某文件的文件主 (owner) 和超级用户 (root) 具有对该文件的 控制权限
    • 每个文件有单独唯一的文件主,以 UID 标记
    • 用户组
    • 管理员为用户分配的用户组
    • 一个用户可以属于多个用户组
    • 一个用户组也可以属于另外的用户组
    • 每个文件属于一个用户组,以 GID 标记

文件类型

  • :普通文件 d :目录 l :符号链接 c :字符设备 b :块设备

文件 /目录权限项目 • 读(r) 写(w) 执行(x)

chmod 设置文件或目录的存取权限
格式:chmod [对象] [操作符] [模式] 文件
对象:u:文件主;g:同组用户;o:其他用户;a:所有用户
操作符:+:添加权限;-:取消权限;=:重置权限
模式:r/w/x/X
文件打包操作:

tar

  • 打包/解包文件
  • 格式:tar [选项] 文件或者目录

常用选项

-c:创建新的打包文件。

-t:列出打包文件的内容,查看已经打包了哪些文件。

-x:从打包文件中释放文件。

-f:指定打包文件名,需放在选项最后。

-v:详细列出 tar 处理的文件信息。

-z:用 gzip 来压缩/解压缩打包文件。(注:顺序一般为xcvzf)

例:
• 将 file 压缩并打包为 file.tar.gz
tar zcvf file.tar.gz file
• 将 file.tar.gz 解压到 file
tar zxvf file.tar.zip


进程操作:

|--------|----------------|
| 命令 | 说明 |
| ps | 查看当前系统中运行的进程信息 |
| nice | 修改进程优先级 |
| kill | 终止指定进程的运行 |
| sleep | 将进程暂停执行一段时间 |



|--------|----------------------------------|
| 文件 | 内容 |
| passwd | 用户名:密码:用户ID:组ID:用户描述:主目录:登录shell |
| shadow | 登录名:加密密码:上次更改时间:不可更改天数:有效期:... |
| group | 组名:密码:组ID:用户列表 |

用户账号相关文件

passwd:用户关键信息

shadow:账号密码

group:用户组

|----------|--------|
| 命令 | 说明 |
| useradd | 添加用户账号 |
| userdel | 删除用户账号 |
| passwd | 设置用户密码 |
| groupadd | 添加用户组 |
| groupdel | 删除用户组 |
| groupmod | 修改组属性 |

|--------|---------------------------|
| 命令 | 说明 |
| su | 切换为超级用户(root) |
| sudo | 使用超级用户权限执行系统管理命令 |
| id | 查看指定用户当前的UID、GID和用户所属的组信息 |
| groups | 查看指定用户当前所属的组 |
| whoami | 查看当前用户名 |
| w、who | 查看登录用户及相关信息 |

|--------|-----------------|
| 命令 | 说明 |
| chmod | 设置文件或目录的存取权限 |
| umask | 显示或设置新建文件权限的掩码 |
| chgrp | 改变文件或目录所属的用户组 |
| chown | 改变文件或目录的所有者或所属组 |

了解即可:

|------------|--------------------|
| 命令 | 说明 |
| mkfs | 创建文件系统 |
| mount | 安装文件系统 |
| /etc/fstab | 系统初始化分区安装配置文件 |
| umount | 卸载文件系统 |
| mkswap | 创建交换分区 |
| swapon | 激活交换分区 |
| fsck | 检查文件系统的状态 |
| du | 查看指定的目录或文件所占用的磁盘空间 |
| df | 显示目前文件系统磁盘使用情况 |
| fdisk | 创建和管理硬盘分区表 |


系统备份:

  • 完全备份 定期对系统做一次全面备份
  • 增量备份 仅备份短时间内修改过的数据
  • 更新备份 备份大版本之间修改的数据

备份

tar -czvf log.tar.gz /tmp/log

恢复

tar -xzvf log.tar.gz

定时

crontab -e 编辑定时任务配置表

50 7 * * * /sbin/service sshd start 每天7:50开启ssh服务

0 0 1,15 * * fsck /home: 每月1号和15号检查/home 磁盘
Linux系统安全设定方式

1.取消不必要的服务

2.限制远程存取

3.隐藏重要资料

4.修补安全漏洞

5.采用安全工具进行经常性的安全检查
系统安全管理三要素:

1.物理安全

①机房安全:报警、灾备。

②通信安全:防止信息泄露(被监听)。

③关键信息:钥匙或信用卡识别设备、关键文档资料

2.普通用户安全管理:保护用户资料安全

  1. 超级用户安全管理

|----------|-------------------------------------|
| 文件 | 内容 |
| ping | 测试网络连通及速率 |
| ifconfig | 配置网络接口,即指定一个网络接口的地址,或者设置网络接口的参数 |
| netstat | TCP/IP网络协议和连接进行统计 |
| route | 查看路由信息,为相应连接配置路由信息 |

Shell:解释性编程语言 执行复杂的系统管理任务

Shell脚本:程序+命令->文件 纯文本 .sh后缀 逐行执行

使用文本编辑器编辑脚本文件

vi script.sh

为脚本文件添加可执行权限

chmod a+x script.sh

输入重定向到shell脚本

bash < script.sh

不能带参数

以脚本名作为bash参数

在子shell中执行:bash script.sh [参数1 参数2 ......]

在当前shell中执行: . script.sh [参数1 参数2 ......]

直接执行

需有脚本文件的执行权限

文件路径执行:/path/script.sh PATH=$PATH:.

文件目录添加到命令搜索路径(PATH)后,文件名执行:script.sh
以 #! 开头:通知系统用何解释器执行此脚本
#!/bin/bash

注释
*# 注释内容

脚本名称

脚本功能

作者及联系方式

版本更新记录

版权声明

对算法做简要说明(如果是复杂脚本)*

|---------|--------------------------------------------|
| 引号 | 说明 |
| 双引号"" | 除$、`、\外的字符均作为普通字符 $ 变量替换,` 命令替换,\ 转义字符 |
| 单引号'' | 所有字符均作为普通字符 |
| 倒引号`` | 字符串被shell解释为命令行,执行后以输出结果替换 |

• 使用命令的输出,常用于
• 在文本中嵌入命令的执行结果
• 命令参数是另一个命令执行的结果
• 格式
• $(command)
• `command`
• cmd1 $(cmd2)
• cmd1 `cmd2`
• 示例
• echo now is `date`
• echo I am in $( pwd )
• 变量名
• 字母、数字、下划线
• 起始不能为数字
• 大小写敏感

• 变量赋值
• 变量名 = 字符串
• = 左右不能有空格
• 字符串内有空格时,需用引号括起来
• 可重新赋值
• 引用变量值
• $ 变量名
{ 变量名 } • • 命令替换赋值 • 变量名 =\` 命令表 \` • 变量名 =( 命令表 )


输入:
• read
• 从键盘上读取数据,赋值给指定的变量
• 格式: read [ 选项 ] 变量 1 [ 变量 2 ......]
• 选项
• -r :取消" \ "的转义作用
• -t timeout :设置读取时限,超时返回失败状态
• -u fd :从文件描述符 df 对应的文件读取数据
• -n nchars :读取数据长度不超过 nchars
• -N nchars :读取数据长度等于 nchars

输出:
• echo
• 显示变量值或字符串
• 格式: echo [ 选项 ] < 变量或字符串 >
• 选项
• -e :允许转义符
• -n :显示内容后不换行
位置参数:
script.sh m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12
• $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $(10) $(11) $(12)

• set
• 为位置参数赋值
• 格式: set 参数 1 [ 参数 2 ......]

• shift
• 移动位置参数
算术运算:
• let
• 执行整数算术运算
• 格式: let 算术表达式 或 (( 算术表达式 )
示例
• n=1; let n=++n; echo $n
• n=1; ((n+=1)); echo $n
• n=1; let "n = n + 1"; echo n • n=1; r=((n+1)); echo $r n • n=1; r=((n>0)); echo $r $n
• expr
• 通用的表达式计算命令
• 格式: expr 表达式
• * 、 / 、 () 需转义或用 " 括起来
示例
• n=2; r=`expr $n \* 3`; echo $r
• n=2; r=`expr $n "*" 3`; echo $r
• a=1; b=0; r=`expr $a \> $b`; echo $r
控制结构:
• 条件
• if ... then ... elif ... then ... else ... fi
• 选择
• case ... in ... esac
• 循环
• while ... do ... done
• until ... do ... done
• for ... [in] ... do ... done

|----------|----------------------------------------------|
| 表达式 | 功能 |
| -r 文件名 | 若文件存在并且是用户可读的,则测试条件为真。 |
| -w 文件名 | 若文件存在并且是用户可写的,则测试条件为真。 |
| -x 文件名 | 若文件存在并且是用户可执行的,则测试条件为真。 |
| -f 文件名 | 若文件存在并且是普通文件,则测试条件为真。 |
| -d 文件名 | 若文件存在并且是目录文件,则测试条件为真。 |
| -e 文件名 | 若文件存在,则测试条件为真。 |
| -s 文件名 | 若文件存在并且文件的长度大于0,则测试条件为真。 |
| -t 文件描述字 | 若文件被打开且其文件描述字是与终端设备相关的,则测试条件为真。默认的"文件描述字"是1。 |

|----------|---------------------------------------------|
| 表达式 | 功能 |
| -z s1 | 如果字符串s1的长度为0,则测试条件为真。 |
| -n s1 | 如果字符串s1的长度大于0,则测试条件为真。 |
| s1 | 如果字符串s1不是空字符串,则测试条件为真。 |
| s1 = s2 | 如果s1等于s2,则测试条件为真。"="也可以用"==" 代替。在"="前后应有空格。 |
| s1 != s2 | 如果s1不等于s2,则测试条件为真。 |
| s1 < s2 | 如果按字典顺序s1在s2之前,则测试条件为真。 |
| s1 > s2 | 如果按字典顺序s1在s2之后,则测试条件为真。 |

|-----------|----------------------|
| 表达式 | 功能 |
| n1 -eq n2 | 如果n1等于n2,则测试条件为真。 |
| n1 -ne n2 | 如果n1不等于n2,则测试条件为真。 |
| n1 -lt n2 | 如果n1小于n2,则测试条件为真。 |
| n1 -le n2 | 如果n1小于或等于n2,则测试条件为真。 |
| n1 -gt n2 | 如果n1大于n2,则测试条件为真。 |
| n1 -ge n2 | 如果n1大于或等于n2,则测试条件为真 |

|----------------------------------|----------------------------------|---------------------|
| 逻辑与 | 逻辑或 | 逻辑非 |
| [ expr1 -a expr2 ] | [ expr1 -o expr2 ] | [ ! expr ] |
| [[ pattern1 && pattern2 ]] | [[ pattern1 || pattern2 ]] | [[ ! pattern ]] |
| (( expr1 && expr2 )) | (( expr1 || expr2 )) | (( ! expr )) |

条件控制:

ifexpr1#如果expr1 为真(返回值为0)

then**#**那么

commands1**#执行语句块commands1**

elif expr2**#expr1** 不真,而****expr2 为真

then**#**那么

commands2**#执行语句块commands2**

... ... #可以有多个elif 语句

else**# else****最多只能有一个**

commands4**#执行语句块commands4**

fi**#** if语句必须以单词fi 终止
循环结构:

for****variable in list

#每一次循环,依次把列表list 中的一个值赋给循环变量

do**#**循环体开始的标志

commands**#**循环变量每取一次值,循环体就执行一遍

done**#循环结束的标志,返回循环顶部**


for**((expr1;expr2;expr3))** #执行expr1

do**#expr2的值为真时进入循环,否则退出for循环**

commands**#执行循环体,之后执行****expr3**

done**#循环结束的标志,返回循环顶部**
Linux系统三层架构
• 靠近硬件的底层是 内核 ,即 Linux 操作系统常驻内存部分。
• 中间层是内核之外的 shell 层 ,即操作系统的系统程序部分。
• 最高层是 应用层 ,即用户程序部分

gdb:
• 控制程序执行

停止点:
• 断点 ( Breakpoint ,缩写 b ):程序执行到设置的断点的行就暂停, gdb 报告程序暂停处的断点信息,用于显示函数调用的踪迹和变量的值
• 观察点 ( Watchpoint ):程序执行到某个表达式(变量)的值发生变化时暂停
• 捕捉点 ( Catch point ):捕捉程序运行时出现的事件
• 运行程序
• run [ args ]
• args :传给被调试程序的命令行参数
• 单步跟踪
• step [N]
• 程序执行 N 行后暂停, N 默认为 1 ,执行进入调用的函数内部
• next [N]
• 同 step ,执行不进入调用的函数内部
• 连续执行
• continue 、 c 、 fg
• 程序继续执行到下一停止点
• makefile 文件:定义一系列规则来指定要编译的文件、编译顺序、文件间的依赖关系以及变量定义、注释等


系统调用
• 操作系统提供的、与用户程序之间的接口
• 执行过程
• CPU 执行到用户程序中的系统调用时,处理机状态从用户态变为核心态,
• 系统调用完成后,控制返回到用户程序。
• 调用方式
• 与过程调用类似:函数名 + 参数
• 区别:过程调用不能进入核心态,系统调用可进入核心态

• 调用方式
• 系统调用和库函数调用方法相同
• C 函数形式调用:类型、名称、参数
• 需使用对应的头文件: / usr /include/sys 、 / usr /include/ linux
• 示例

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int open(const char *path, int oflags); #函数声明

int fd = open("/home/user/file1", O_RDWR); #函数调用


文件操作:
• 相关系统调用:
• creat , open , close , read , write , lseek , link , unlink , mkdir , rmdir , chdir , chmod 等

• 相关头文件:
• <sys/ types.h > , <sys/ stat.h > , < fcntl.h > , < unistd.h >


进程控制:
• 相关系统调用
• fork , exec , wait , exit , getpid , sleep , nice 等
• 相关头文件
• < unistd.h > , <sys/ types.h > , <sys/ wait.h >

创建子进程案例:

cpp 复制代码
#include <stdio.h>
#include <unistd.h>
//父子进程代码共享,但数据独有
pid_t  g_val = 100;
int main()
{
    pid_t pid = fork();//创建子进程
    if(pid < 0) {
        printf("fork error!\n");
        return -1; 
    }
    else if(pid == 0) {
        //子进程
        g_val = 200;
        printf("This is Child! g_val = %d p = %p\n",g_val,&g_val);
    }
    else {
        //父进程
        sleep(1);
        printf("This is Parent! g_val = %d p = %p\n",g_val,&g_val);
    }
    return 0;
}

pid_t类型,**其实就是int*,在内核中是通过typedef重命名过的,我们把其当做int类型即可。***

如果创建子进程失败,会返回-1,是小于0的,而如果创建子进程成功,该函数则会返回俩个值,这一点和普通的函数有很大区别。它会给子进程返回0值,而给父进程返回子进程的pid(一个大于0的数),也正是通过给父子进程返回值的不同,从而我们可以使用选择语句对齐进行分流,从而让父子进程执行不同的代码,而达到我们创建子进程的某种目的。

相关推荐
热爱嵌入式的小许3 小时前
Linux基础项目开发1:量产工具——显示系统
linux·运维·服务器·韦东山量产工具
韩楚风7 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学7 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO7 小时前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu77 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我7 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、7 小时前
【Linux】进程地址空间(初步了解)
linux
栎栎学编程7 小时前
Linux中环境变量
linux
我是哈哈hh8 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
郭二哈8 小时前
C++——模板进阶、继承
java·服务器·c++