试列举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.普通用户安全管理:保护用户资料安全
- 超级用户安全管理
|----------|-------------------------------------|
| 文件 | 内容 |
| 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的数),也正是通过给父子进程返回值的不同,从而我们可以使用选择语句对齐进行分流,从而让父子进程执行不同的代码,而达到我们创建子进程的某种目的。