试列举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.gztar zcvf file.tar.gz file• 将 file.tar.gz 解压到 filetar 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.普通用户安全管理:保护用户资料安全
3. 超级用户安全管理
文件 |
内容 |
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 )) |
条件控制:
if expr1 # 如果 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 # 循环结束的标志,返回循环顶部
gdb:
• 控制程序执行停止点:
• 断点 ( Breakpoint ,缩写 b ):程序执行到设置的断点的行就暂停, gdb 报告程序暂停处的断点信息,用于显示函数调用的踪迹和变量的值• 观察点 ( Watchpoint ):程序执行到某个表达式(变量)的值发生变化时暂停• 捕捉点 ( Catch point ):捕捉程序运行时出现的事件• 运行程序• run [ args ]• args :传给被调试程序的命令行参数• 单步跟踪• step [N]• 程序执行 N 行后暂停, N 默认为 1 ,执行进入调用的函数内部• next [N]• 同 step ,执行不进入调用的函数内部• 连续执行• continue 、 c 、 fg• 程序继续执行到下一停止点
• 系统调用• 操作系统提供的、与用户程序之间的接口• 执行过程• 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 >
创建子进程案例:
#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的数),也正是通过给父子进程返回值的不同,从而我们可以使用选择语句对齐进行分流,从而让父子进程执行不同的代码,而达到我们创建子进程的某种目的。