文件与目录
目录结构
- bin:全称 binary,含义是二进制。该目录中存储的都是一些二进制文件,文件都是可以被运行的。(一些最经常使用的命令)
- dev:全称 device,该目录中主要存放的是外接设备(Linux 中任何接口设备都是以文件存在于这个目录中的,Linux 中访问设备和访问文件的方式相同),例如键盘、鼠标等(dev/iput下
sudo cat mice
鼠标)。在其中的外接设备是不能直接被使用的,需要挂载(类似 Windows下的分配盘符)。(设备的目录连接到 Linux 的目录下)
cd /dev/input
sudo cat mice #鼠标
- etc:该目录主要存储一些配置文件。 (cat /etc/passwd 用户属性信息)
- home:表示“家”,表示除了 root 用户以外其他用户的家目录,类似于 Windows 下的 User/用户目录。
- proc:process,表示进程,该目录中存储的是Linux运行时候的进程。 (这个目录本身是一个虚拟文件系统,他存的数据都是在内存中的,本身不占磁盘空间)
- root:该目录是 root 用户自己的家目录。 (普通用户没有权限进该目录,加sudo也不可以,切换到root才可以 sudo su,平时不要用root用户操作, exit 退回原用户)
- sbin:全称 super binary,该目录也是存储一些可以被执行的二进制文件,但是必须得有super权限的用户才能执行(管理员系统程序)。
- tmp:表示“临时”的,当系统运行时候产生的临时文件会在这个目录存着。
- usr:全称unix software resources,存放的是用户自己安装的软件。类似于Windows 下的 program files。
- var:存放的程序/系统的日志文件的目录。 (FHS中,含义是存放与系统运行过程有关的数据)
- mnt:当外接设备需要挂载的时候,就需要挂载到 mnt 目录下。
- boot:开机用到的文件
- lib:开机用到的库文件
- media:挂载的设备,光盘、DVD等
- opt:安装第三方软件的目录
- run:系统开机产生的信息
- srv:service,网络服务需要取用的数据
- sys:类似proc,也是虚拟文件系统,记录核心和硬件相关的信息(核心:主要负责整个计算机系统的资源分配和管理)
绝对路径和相对路径
- 绝对路径
从/
目录开始描述的路径为绝对路径,如:cd /dev/input
- 相对路径
从当前位置开始描述的路径为相对路径,如:cd ../../
.
和..
- 每个目录下都有
.
和..
.
表示当前目录..
表示上一级目录,即父目录
根目录下的.和..都表示当前目录 (ls -al . 和 .. 属性完全一致)
(cd - 返回上一个目录, cd ~ 进入家目录)
- 每个目录下都有
Linux文件类型
Linux 文件类型有七种:
- 普通文件:- (纯文本文件、二进制文件、数据格式文件)
- 目录文件:d (directory)
- 设备文件:(通常在 /dev目录下)
- 字符设备:c (character)(键盘、鼠标/dev/input/mice)
- 块设备:b (block)(硬盘、软盘,提供系统随机存取的接口设备,/dev)
- 软链接:l (link)(类似Windows的快捷方式,硬链接是普通文件类型)
- 管道文件:p (pipe)
- 套接字:s (socket)(被用在网络数据,/tmp 和 /run)
目录与路径
cat /ect/shells # 显示系统支持所有shell
h选项一般是高可读性
- 代表上一个工作目录.
cp 如果目录存在则放在目录里, 如果不存在则复制成这个文件名,复制整个目录要加-r,-a复制时保留文件属性,-r文件属性时间为复制的时间.
ls
list,列出目录及文件名
白色为普通文件,蓝色为目录,红色为压缩文件,绿色为可执行文件,浅蓝色为链接文件,背景颜色的显示和文件的权限有关
常用语法:
#ls -l
路径#ls -la
路径#ls -lh
路径#ll
(ls -alF
的别名,alias ll
)-i
附带iNode
号
选项解释:
-l
:list,表示以详细列表的形式进行展示-a
:表示显示所有的文件和文件夹(包含了隐藏文件和文件夹)-h
:以可读性较高的形式显示**文档大小-F
:在列出的文件名称后加一符号;例如可执行则加 "*", 目录则加 "/"
pwd
print working directory,打印当前工作目录
cd
change directory,切换目录
常用语法:
#cd -
:回到上一个工作目录#cd ~
:切换到家目录#cd /
:切换到根目录#cd ..
:切换到上一级目录
du
Disk usage 查看目录的真实大小(占用磁盘空间)
- 用法:
#du -sh
目录路径
选项:
- -s:summaries,只显示汇总的大小
- -h:以高可读性的形式进行显示
文件与目录管理
mkdir
make directory 创建目录
- 用法1
#mkdir 目录名称
含义:指定目录名称创建,支持绝对路径和相对路径,只有名称则在当前目录下创建
- 用法2:
#mkdir -p 路径
含义:当一次性创建多层不存在的目录的时候,添加-p参数,否则会报错
- 用法3:
#mkdir 路径1 路径2 路径3 …
含义:一次性创建多个目录
touch
修改文件或目录的时间属性,若文件不存在则创建
- 用法:
#touch 文件路径
含义:指定文件名或路径创建文件
创建一个以 - 开头的文件名的文件(文件名最好不要 - 开头) 要写绝对路径或相对路径
cp
copy,复制文件或目录
- 用法:
#cp 被复制的文件路径 被复制到的路径
注意:如果存在名字相同的,会覆盖同名文件
常用选项:
- -a:all,复制时保留文件属性
- -r:recursive,递归复制
复制目录,加 -r 或 -a
复制后的文件属性会变化,如果想要把属性也复制过来加 -a
mv
move,移动文件与目录,或改名
- 用法:
#mv 需要移动的文档路径 需要保存的位置路径
rm
remove,移除文件或目录
- 语法:
#rm 选项 需要移除的文档路径
常用选项:
- -f:force,强制删除,不提示是否删除
- -r:recursive,递归删除,危险
删除一个目录的时候需要做递归删除,并且一般也不需要进行删除确认询问,所以移除目录的时候一般需要使用 -rf 选项。
删除一个目录下有公共特性的文档,例如都以 day 开头。使用通配符*,表示任意的字符,day 表示以 day 开头的任意文件名。
文件内容的查阅与统计
cat
concatenate,连接文件并打印到标准输出设备上(查看文件)
- 用法1:
#cat 文件的路径
常用选项:-n 列出行号
- 用法2:
#tac
含义:倒序显示(应用:查看日志)
head
查看一个文件的前 n 行,默认显示前10行。
用法:
#head -number 文件路径
【n 表示数字】#head -n number 文件路径
n为负数时负的行数不显示
tail
查看一个文件的末 n 行,默认显示后10行
用法1:
#tail -number 文件路径
【n 表示数字】#tail -n number 文件路径
- 用法2:
#tail -f 文件路径
含义:持续检测文件内容,一般用于查看系统日志
less
- 用法:
#less 文件路径
操作指令:
- 空格键:向下翻动一页
- [
pagedown
]:向下翻动一页 - [
pageup
]:向上翻动一页 - j:下一行
- k:上一行
- G:移动到最后一行
- g:移动到第一行
/字符串
:向下搜索字符串?字符串
:向上搜索字符串- q:退出 less
统计与查找
wc
Word Count,统计文件内容信息(行数、单词数、字节数)
- 用法:
#wc -lwc 需要统计的文件路径
选项解释:
- -l:表示 lines,行数
- -w:表示 words,单词数 依照空格来判断单词数量
- -c:表示 bytes,字节数
find
查找文件(其参数有55个之多)
- 用法:
#find 路径范围 选项 选项的值
常用选项:
type
:按文件类型搜索 (普通文件类型:f)name
:按文件名搜索maxdepth
:指定搜索深度size
:按文件大小
示例
find ./ -type l
查找软连接find ./ -name "day*"
查找名称day开头的文件find ./ -maxdepth 1 -name “m*”
查找名称m开头的文件并限制最大查找深度为1find ./ -size +20M -size -50M
查找大小在20M到50M之间的文件
输出重定向
一般命令的输出都会显示在终端中,有些时候需要将一些命令的执行结果保存到文件中进行后续的分析/统计,则这时候需要使用到输出重定向技术。
输出重定向符号:
>
覆盖输出,会覆盖原文件内容>>
追加输出,不会覆盖原文件内容,在原内容末尾继续添加
- 用法:
#指令 > / >> 文件的路径
含义:指令结果保存到指定文件中。文件不存在则新建该文件
- 追加重定向 :
ls >> d5.txt
- 覆盖重定向:
ls > d5.txt
- 合并文件:
#cat 待合并的文件路径1 待合并的文件路径2 … 文件路径n > 合并之后的文件路径
管道
管道一般可以用于“过滤”,“特殊”,“扩展处理”。管道不能单独使用,必须配合指令来一起使用,主要是辅助作用。
用法:指令1 | 指令2
含义:以管道符作为分界线,指令1的输出是指令2的输入
查询根目录下包含字母“b”的文件名:
#ls / | grep b
grep
指令:主要用于过滤- 以可以翻页的方式查看 /etc/ 下的文件:
#ll /etc | less
- 统计某个目录下的文件个数:
#ls / | wc -l
软件安装
apt-get
apt-get
,是一条linux
命令,适用于deb包管理式的操作系统(例如Ubuntu系统),主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。
apt-get install 软件名
安装软件apt-get remove 软件名
卸载软件apt-get update
更新源文件,并不会做任何安装升级操作
apt update
用于更新本地软件包列表,但不会安装任何软件包。apt upgrade
用于升级系统中已安装的软件包到最新版本,但不会安装新的软件包。
硬链接与软链接
硬链接
inode和block
文件数据包含:
- 文件属性(容量、时间、权限等)存储在
inode
- 文件实际内容 存储在
block
文件系统各区块:
inode
:记录文件属性和此文件数据所在的 block 号码(通过inode
可以找到block
,索引式文件系统),一个文件占用一个inode
block
:记录实际内容,若文件太大会占用多个 blocksuperblock
:记录文件系统整体信息,包括inode
/block
的总量、使用量、剩余量等(文件系统的挂载时间、最近写入数据实际等相关信息)
目录的 block 存什么?
- 目录下的文件名
- 文件名对应的
inode
号(inode
不记录文件名)文件名不属于文件
假设:文件夹 /bin 下面有两个文件:a.c 和 b.c ,读取这两个文件内容的流程?
通过/bin 文件夹的block内的文件名找到对应的a.c和b.c对应的inode
,再通过这两个inode
读取这两个文件内容
原理与用法
Hard Link(实体链接),文件 别名。硬链接和源文件的相关信息都一样(除了文件名)
- 用法:
ln 源文件 目标文件
(先 ls -il
展示源文件的 inode
和硬链接计数,在源文件不同的目录下创建硬链接)
第二个字段由1变成了2,这个字段4的含义:有多少文件名链接到这个 inode
(硬链接计数)
硬链接读取文件数据的示意图
可以通过 day3 或 day4 目录的 inode
所指向的 block
找到两个不同的文件名,两个不同的文件名都指向同一个 inode
,并读取到文件的实际内容。无论通过哪一个文件名对文件进行编辑,结果都会写入到同一个 inode
和 block
中。
创建硬链接没有真正创建一个文件,只是在目录的 block 中加了一个关联数据,通常不会增加 inode
和 block
的数量。(当目录的 block
被填满时,还是会新增一个block
,一般硬链接用掉的关联数据很小,所以通常不会增加 block
)
特点
- 一般不会增加
indoe
和block
的数量,不占空间 - 对硬链接进行读写操作时,操作的就是源文件
- 对源文件或硬链接进行删除,不影响相同inode的其他文件
- 不能跨文件系统
- 不能链接目录
软链接
原理与用法
Symbolic Link(符号链接),建立一个独立文件,这个文件会让数据的读写指向它链接的文件(存它链接文件的路径)。但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。当源文件被删除后,软连接也不能打开了。
- 用法:
#ln -s 原文件 目标文件
源文件和软链接指向不同的inode
软链接移动到其他目录下,就不能找到源文件了
特点
- 软链接相当于快捷方式
- 存文件路径,软链接文件很小
- 最好绝对路径
- 对软链接进行读写操作,系统会自动转为对源文件的操作(删除软链接,不会影响源文件)
- 软链接的权限是满的,真正的权限取决于源文件
- 源文件移动或删除,软链接无法访问
解压缩
tar指令
打包和解压缩,Linux 中打包文件一般是以 .tar 结尾的,压缩的文件一般是以 .gz(.bz2)结尾的。通常打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般为 .tar.gz。
常用选项:
- z:使用 gzip 进行解压缩
- j:使用 bzip2 进行解压缩
- c:create,创建文件
- x:extract,解压
- v:verbose,显示运行过程
- f:file,指定文件名
- C:指定解压位置
- t:list,查看打包文件中的文件名
- 用法1:
#tar -zcvf 打包压缩后的文件名 要打包压缩的文件
含义:打包并压缩文件
- 用法2:
#tar -zxvf 压缩文件
含义:解压文件到当前目录下(可以不用写 z,自动识别解压缩方式)
- 用法3:
#tar -xvf 压缩文件 -C 解压路径
- 用法4:
#tar -ztvf 要查看的文件名
加 -v 显示详细信息,不加只显示文件名
zip指令
- 用法1:
#zip -r 压缩后的文件名 要压缩的文件
- 用法2:
#unzip 压缩文件
rar指令
下载 rar 和 unrar:sudo apt-get install rar(unrar)
- 用法1:
#rar a -r 压缩后的文件名 要压缩的文件
- 用法2:
#unrar x 压缩文件
基本操作指令
查看日期与日历
1. date指令
显示日期
- 用法1:
#date
CST:China Standard Time 时区,中国标准时间
- 用法2:
#date +指定格式
常用格式:
- “+%Y-%m-%d” (%F) : 2022-07-25
- “+%H:%M:%S” (%T) : 14:53:44
- “+%F %T”
- 用法3:
date -d "-1 day"
获取之前或者之后的某个时间(备份)
符号的可选值:+(之后) 或者 - (之前)
单位的可选值:year、month、day、hour、minute、second
格式参数
- %F:表示完整的年月日
- %T:表示完整的时分秒
- %Y:表示四位年份
- %m:表示两位月份
- %d:表示日期
- %H:表示小时
- %M:表示分钟
- %S:表示秒数
2. cal指令
calendar,显示日历
- 用法1:#
cal
含义:显示当前月份的日历。等价于 #cal -1
- 用法2:
#cal -3
含义:显示上一个月+本月+下个月的日历
- 用法3:
#cal 年份
含义:显示某年的日历
- 用法4:
#cal 月份 年份
含义:显示某年某月的日历
关机与重启
reboot指令
重新启动计算机
shutdown指令
关机(慎用)
- 用法1:
#shutdown -h now “关机提示”
或者#shutdown -h 18:30 “关机提示”
- 用法2:
#shutdown -c
含义:取消关机计划
其他指令
clear指令/ctrl + L快捷键
清除终端(把之前的信息的隐藏到了最上面)
man指令
manual,手册(包含了 Linux 中全部命令手册,英文)
语法:#man 命令
(退出按下q键)
service指令
控制一些软件的服务启动/停止/重启
- 用法:
#service 服务名 start/stop/restart
vim编辑器
vi和vim
vi 编辑器是所有 Unix 及 Linux 系统下标准的编辑器,类似于 Windows 系统下的记事本。很多软件默认使用 vi 作为他们编辑的接口。vim 是进阶版的 vi,vim 可以视为一种程序编辑器。
下载 vim:sudo apt-get install vim
- 用法1:
#vim 文件路径
含义:打开指定的文件
- 用法2:
#vim +数字 文件的路径
含义:打开指定的文件,并且将光标移动到指定行
- 用法3:
#vim +/关键词 文件的路径
含义:打开指定的文件,并且高亮显示关键词
- 用法4:
#vim 文件路径1 文件路径2 文件路径3
含义:同时打开多个文件
vim三种模式
vim 中存在三种模式:命令模式、编辑模式(输入模式)、末行模式。
- 命令模式:打开文件之后默认进入该模式,可以输入快捷键进行一些操作:删除、复制、粘贴、移动光标等
- 编辑模式:可以对文件的内容进行编辑
- 末行模式:可以在末行输入命令来对文件进行操作:搜索、替换、保存、退出、撤销、高亮等
模式切换按键说明:
进入编辑模式:
- i:insert,光标处
- I:行首(第一个非空字符)
- a:append,下一个字符
- A:行尾
- o:open,下边插入一空行
- O:上边插入一空行
- s:subst,取代当前字符
- S:取代当前行
- 退回命令模式:[Esc]
进入末行模式:
- :
- / 或 ?:进入末行模式,后面接字符串进行查找
退出 vim:
- q:退出
- wq:保存并退出
- q!:强制退出
- x:文件没有修改时直接退出,在文件修改的情况下保存并退出(不要使用X,X是文件进行加密)
命令模式
打开文件之后默认进入该模式
光标移动
- 光标上下左右移动:方向键 或 kjhl
- 光标上下左右移动指定行或字符:[数字]方向键或[数字]kjhl
- 光标移动到行首:^
- 光标移动到行尾:$
- 光标移动到首行:gg
- 光标移动到末行:G
- 自动格式化程序:gg=G
- 光标移动到指定行:[数字]G 或 [数字]gg
- 向上翻屏:按键 ctrl + b 或 PgUp
- 向下翻屏:按键 ctrl + f 或 PgDn
复制/粘贴/剪切
- 复制光标所在行:yy
- 光标所在行的下一行新开一行粘贴(paste):p
- 以光标所在行为准(包含当前行),向下复制指定的行数:[数字]yy
- 剪切/删除光标所在行(剪切了不粘贴就是删除)(delete):dd
- 剪切/删除光标所在行为准(包含当前行),向下剪切/删除指定行:[数字]dd
- 剪切/删除光标所在的当前行之后的内容:D
- 可视化操作(view):v(可视模式)、V(可视行)、ctrl + v(可视块),然后按下方向键来选中需要操作的区块按下 y 复制或按下 d 删除
撤销/恢复
- 撤销(undo):
u
或者:u
(末行模式) - 恢复(取消)之前的撤销操作:ctrl + r
末行模式
保存与退出文件
- 保存操作(write)
- 保存:
:w
- 另存为:
:w 路径
- 退出(quit):
:q
- 保存并退出:
:wq
- 强制执行:
!
- 不保存,强制退出:
:q!
查找与替换
查找:/关键词或?关键词
- 在搜索结果中切换上/下一个结果(next):
N/n
- 取消高亮(no highlight):
:nohl
- 在搜索结果中切换上/下一个结果(next):
替换
- 替换光标所在行第一条原数据:
:s/原数据/新数据
- 替换光标所在行全部原数据:
:s/原数据/新数据/g
- 替换整个文件第一条原数据:
:%s/原数据/新数据
- 替换整个文件全部原数据:
:%s/原数据/新数据/g
- 替换光标所在行第一条原数据:
符号含义:
- %表示整个文件
- g表示全局(global)
显示行号
- 显示行号(临时)(number):
:set nu
- 取消显示行号:
:set nonu
执行 shell 指令
- 执行 shell 指令*:
:![shell 指令]
举例::!ls /
切换文件
- 查看当前已经打开的文件名称:
:files
- 切换指定文件:
:open
已经打开的文件名 - 切换到上一个文件(back prev):
:bp
- 切换到下一个文件(back next):
:bn
用户与用户组
Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员(root)申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
用户和用户组相关的指令都需要 root 权限
用户标识符
每个用户都有用户 ID(User ID,UID)和群组 ID (Group ID,GID),每个用户在创建时都有一个用户主组(默认和用户同名,只能有一个),用户创建后可以添加任意个附加组。
存用户相关信息的文件:
- 存储用户信息:
/etc/passwd
用户名:密码:UID:GID:注释:家目录:解释器shell
每一行代表一个账号(有很多是系统账号),UID 为0是 root 账号,UID 为1~999 是保留的系统账号,1000 以上一般是给一般用户的。GID 是用户主组的 ID
- 存储用户组信息:
/etc/group
组名:用户组密码:GID:用户组支持的账号
- 存储用户密码信息:
/etc/shadow
账号名称:密码:密码更新日期:密码不可被更改的天数:密码需要被更改的天数:密码需要更改期限前的警告天数:密码失效日:账号失效日期:保留字段
- 存储用户信息:
用户管理
whoami指令
查看当前用户
adduser指令
添加用户
- 用法:
#adduser 选项 用户名
常用选项:
- gid:表示指定用户的用户主组,选项的值可以是用户组id,也可以是组名(默认创建同名的用户组)
- uid:用户的 id(用户的标识符),系统默认会从1000之后按顺序分配 uid,如果不想使用系统分配的,可以通过该选项自定义
验证是否成功:
- 验证 /etc/passwd 的最后一行,查看是否有 pointer 的信息
- 验证是否存在家目录(自动创建家目录)
usermod指令
修改用户
用法:#usermod 选项 用户名
常用选项:
- g:指定用户主组
- u:指定 UID
- l:修改用户名
- G:指定附加组
- a:与 -G 合用(-a -G)(-aG),增加附加组(保留原组)
passwd指令
设置/更改密码
- 用法:
#passwd 用户名
默认修改 root 的密码
su指令
切换用户
- 用法:
#su 用户名
如果用户名不指定则表示切换到 root 用户
注意事项
- 从 root 往普通用户切换不需要密码,反之则需要 root 密码
- 切换用户之后前后的工作路径是不变的
- 普通用户没有办法访问 root 用户家目录,反之则可以
deluser指令
删除用户
- 用法:
#deluser --remove-home 用户名
删除用户的同时,删除其家目录
注意:已经登录的用户删除的时候提示删除失败,没有登录的用户可以正常删除
用户组管理
addgroup指令
用户组添加
- 用法:
#addgroup 选项 用户组名
常用选项:
- gid:设置 GID,默认从 1000 之后递增
groupmod指令
用户组编辑
- 用法:
#groupmod 选项 用户组名
常用选项:
-g:设置 GID
-n:修改用户组名
delgroup
用户组删除
- 用法:
#delgroup 用户组名
注意:不允许删除某个用户的主组,需要从组内移出所有用户才能删除。
文件的拥有者和所属用户组
chown指令
change owner,改变文件拥有者(属主)
- 用法1:
chown 新用户名 待修改文件
用法2:
chown -R 新用户名 待修改文件
含义:递归修改,连同目录下所有文件都变更
用法3:
chown 新用户名:新用户组名 待修改文件
含义:修改拥有者和所属用户组
chgrp指令
change group,改变文件所属用户组
- 用法:
chgrp 新用户组名 待修改文件
常用选项:R,递归
文件权限
文件的可存取身份:
- owner:文件拥有者
- group:文件所属用户组
- others:其他人
文件权限:
- r:read,读
- 文件:是否能查看文件内容
- 文件夹:是否能列出目录结构
w:write,写
- 文件:是否能编辑文件内容(是否包含删除文件的权限?(不能,文件名属于他所在文件夹)是否能修改文件名?(不能,文件名不属于文件))
- 文件夹:是否能在文件夹下创建、删除、复制、移动、重命名(能对当前文件夹重命名吗?(不能,文件名不属于它自己)))
x:eXecute,执行
- 文件:可执行权限
- 文件夹:能否进入该目录成为工作目录
chmod
change mode 更改文件权限
- 用法:
#chmod 选项 权限 文件名
常用选项:
R:递归修改,连同目录下所有文件都变更
权限分配对象:
- u:user,所有者身份 owner
- g:group,所有者同组用户
- o:others,其他用户
- a:all,给所有用户设置权限,默认是所有用户
权限分配方式:
- +:新增权限
- -:删除权限
- =:设置权限
相同权限可以一起设置:sudo chmod u=rwx,go=rw a.txt
数字形式
Linux 文件的基本权限有九个(-rwxrwxrwx),九个权限是三个三个一组的。其中我们可以用数字表示各个权限,权限的分数如下:
- r:4
- w:2
- x:1
- -:0
每种身份(owner/group/others)的权限就是各自三个权限的分数之和。例如当某个权限为:[-rwxr-xr--] 每种身份的权限分数就是:
- owner = rwx = 4 + 2 + 1 = 7
- group = rwx = 4 + 0 + 1 = 5
- others = rwx = 4 + 0 + 0 = 4
sudo
sudo可以让管理员(root)事先定义某些特殊命令谁可以执行。
默认只有 root 可以执行 sudo,其他用户可以通过配置文件 /etc/sudoers 进行配置
查看 sudo 配置文件:sudo vim /etc/sudoers 或 visudo
purr ALL=(ALL:ALL) ALL
purr:表示用户名,如果是用户组,则可以写成“%组名”
ALL:表示允许登录的主机(地址白名单
(ALL:ALL):表示以谁的身份执行,ALL表示 root 身份
ALL:表示当前用户可以执行的命令,多个命令可以使用 “,” 分割
系统相关指令
系统资源观察
df指令
disk free,显示文件系统磁盘使用情况统计
- 用法:
#df -h
含义:以高可读性的形式显示磁盘使用情况统计
free指令
查看内存使用情况
- 用法:#free -m
含义:以 MB 为单位查看内存使用情况
ps指令
查看进程运作情况
常用选项
- e:显示全部进程,与 -A 作用相同
- a:显示所有不与终端相关的进程
- u:有效用户的进程
- x:通常与 -a 一起使用,可列出较完整信息
- l:较长、较详细的信息
- f:更完整的输出
- j:列出与作业控制相关的信息
- 用法1:
#ps -ef
含义:完整显示全部进程
- 用法2:
#ps aux
含义:显示所有用户进程(不包含终端相关的进程)
kill指令
杀死进程 (当遇到僵尸进程或者出于某些原因需要关闭进程的时候)
- 用法:
#kill 信号编号 进程PID
信号编号:9 强制删除
配合 ps
一起使用
top指令
动态查看进程变化
用法:#top
退出:按 q 键
快捷键
- M:按内存(MEM)降序排列
- P:按CPU使用率降序排列
- 1:切换是否显示各个cpu的详细信息
hostname指令
读取、设置操作服务器的主机名
- 用法:
#hostname
含义:输出完整的主机名
- 用法:
#hostname 新的主机名
含义:设置主机名
id指令
查看用户的一些基本信息:用户id,用户组id,附加组id
- 用法:
#id 用户名
显示指定用户的基本信息,默认当前用户
ifconfig指令(重点)
安装 net-tools 包
用于操作网卡相关的指令。
- 用法:
#ifconfig
含义:获取网卡信息
uptime指令
查看系统启动时间与工作负载
uname指令
获取计算机操作系统相关信息
- 用法1:
#uname
含义:获取操作系统的类型
- 用法2:
#uname -a
含义:all,获取全部的系统信息(类型、全部主机名、内核版本、发布时间、开源计划)
GCC
编译步骤
从hello.c到hello(或a.out)文件, 必须历经hello.i、hello.s、hello.o、hello(或 a.out)文件,分别对应着预处理、编译、汇编和链接4个步骤,整个过程如下所示:
hello.c ---- gcc -E
----> hello.i ---- gcc -S
----> hello.s ---- gcc -c
----> hello.o ---- gcc
----> a.out
目标文件
而通常目标文件有三种形式:
- 可执行目标文件(executable)。即我们通常所认识的,可直接运行的二进制文件。
- 可重定位目标文件(relocatable)。包含了二进制的代码和数据,可以与其他可重定位目标文件合并,并创建一个可执行目标文件。(.o 文件)
- 共享目标文件(shared object)。它是一种在加载或者运行时进行链接的特殊可重定位目标文件。
静态库和动态库
静态库命名为 lib库名.a ,动态库命名为 lib库名.so
静态库
以一种特定的方式打包成一个单独的文件,并且在链接生成可执行文件时,从这个单独的文件中“拷贝”它自己需要的内容到最终的可执行文件中。这个单独的文件,称为静态库。Linux 中这类库的名字一般是 libxxx.a。(archive)
创建步骤
- 对 add.c sub.c 编译成可重定位目标文件:
gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
- 利用 ar 工具创建静态库:ar rcs lib库名.a 所有可重定位目标文件
ar rcs libmath.a add.o sub.o
静态库的使用
制作使用 libmath.a 静态库的程序
- 编译 main.c
编译时要将静态库 libmath.a 加上
gcc 选项:
- l:指定库名(库的文件名为
libxxx.a
,库名为xxx
)0 - L:指定库路径
- static:使用静态链接
gcc -static main.c -o main -l math -L ./
注意,必须把 -l math 放在后面。不然会链接出错
动态库
动态库和静态库类似,但是它并不在链接时将需要的二进制代码都“拷贝”到可执行文件中,而是仅仅“拷贝”一些重定位和符号表信息,这些信息可以在程序运行时完成真正的链接过程。Linux 中这类库的名字一般是 libxxx.so。(shared object)
创建步骤
// 先编译成可重定位目标文件(生成与位置无关的代码 -fPIC)
gcc -c add.c -o add.o -fPIC
gcc -c sub.c -o sub.o -fPIC
// 使用 gcc -shared 制作动态库
gcc -shared -o libmath.so add.o sub.o
动态库的使用
通常编译的程序默认就是使用动态链接
gcc main.c -o main -l math -L ./
找不到动态库的解决方法
ldd指令 查看程序使用的动态库
解决方式:
- 通过环境变量(临时生效):export LD_LIBRARY_PATH=动态库路径
- 环境变量写入配置文件 ~/.bashrc(使用绝对路径),生效方法:. ~/.bashrc 或 source ~/.bashrc 或 重启终端
- 拷贝自定义动态库到 /lib (标准C库所在目录位置)(不推荐)
- 动态库绝对路径写到 /etc/ld.so.conf 配置文件中,生效方法:sudo ldconfig
make
编译的过程有很多步骤,如果要重新编译,还需要再重来一遍,可以将这些步骤写到 makefile
文件中,通过 make 工具进行编译
在 UNIX 系统中,习惯使用 Makefile 作为 makefile 文件。如果要使用其他文件作为makefile,则可利用类似下面的make命令选项指定 makefile 文件(通过参数-f指定我们的Makefile文件):
假设我们写的 makefile
文件名字叫做 lib.mk
make -f lib.mk
-n
预执行-f
执行指定文件
书写规则
基本规则
目标:依赖条件
(一个 tab 缩进)命令
两个常用函数:
- wildcard 参数:按给定参数匹配文件名。例如:src = $(wildcard *.c),匹配当前目录下所有 .c 文件,将文件名组成列表赋值给 src
- patsubst 参数1, 参数2, 参数3:将参数3中,模式字符串替换,包含参数1的部分,替换为参数2。例如:obj = $(patsubst %.c, %.o, $(src)),当前目录所有 .c 文件替换成 .o 文件赋值给 obj
三个自动变量:
- $@:在规则的命令中,表示规则中的目标
- $^:在规则的命令中,表示所有依赖条件
- $<:在规则的命令中,第一个依赖条件(如果将该变量应用在模式规则中它可将依赖条件列表中的依赖依次取出,套用模式规则)
基本规则
在 Makefile 中,规则的顺序是很重要的,因为,Makefile 中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让 make 知道你的最终目标是什么。一般来说,定义在 Makefile 中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make 所完成的也就是这个目标,也可以通过ALL指定我们的最终目标。
例如
ALL:main
常用规则:
targets:prerequisites
(tab)command
不常用写法:
targets : prerequisites ; command
targets 是我们最终想得到的目标文件名,以空格分开,command 是命令
使用通配符
make 最常用的通配符就是*。
通配符代替了你一系列的文件,如:*.c表示所有后缀为c的文件,如果我们的文件名中有通配符,如:,那么可以用转义字符\,如来表示真实的字符,而不是任意长度的字符串
例如
clean:
rm -f *.o a.out
伪目标
“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显式地指明这个“目标”才能让其生效
使用一个特殊的标记“.PHONY”来显式地指明一个目标是“伪目标”
.PHONY :clean
变量的定义与使用
基本语法如下
变量名称 = 值列表
值列表,既可以是零项,又可以是一项或者是多项。如:
obj = add.o sub.o
调用变量的时候可以用 "$(OBJ)"(常用) 或者是 "${OBJ}" 来替换,这就是变量的引用
常用函数
1. wildcard
通配符
- 用法:
wildcard 参数
含义:按给定参数匹配文件名。在Makefile规则中,通配符会自动展开,但在变量的定义中,通配符将失效,这种情况可以使用wildcard展开通配符
例如:
src = $(wildcard *.c)
:匹配当前目录下所有 .c 文件,将文件名组成列表赋值给 src
2. patsubst
patten substitude,匹配替换
- 用法:
patsubst 参数1, 参数2, 参数3
含义:将参数3中,参数1的模式,替换为参数2的模式。
例如:
src = $(wildcard *.c)
obj = $(patsubst %.c, %.o, $(src))
:当前目录所有 .c 文件替换成 .o 文件赋值给 obj
自动变量
- $@:在规则的命令中,表示规则中的目标
- $^:在规则的命令中,表示所有依赖条件
- $<:在规则的命令中,第一个依赖条件(如果将该变量应用在模式规则中它可将依赖条件列表中的依赖依次取出,套用模式规则)
模式规则
模式规则类似于普通规则。只是在模式规则中,目标名中需要包含有模式字符“%”(一个),包含有模式字符“%”的目标被用来匹配一个文件名,“%”可以匹配任何非空字符串。规则的依赖文件中同样可以使用“%”例如:对于模式规则“%.o : %.c”,它表示的含义是:所有的.o文件依赖于对应的.c文件。我们可以使用模式规则来定义隐含规则。
例如
src = $(wildcard *.c)
obj = $(patsubst %.c, %.o, $(src))
ALL:a.out
a.out:$(obj)
gcc $^ -o $@
%.o:%.c
gcc -c $< -o $@
.PHONY:clean
clean:
rm -f $(obj) a.out
GDB
使用 GDB调试前要使用gcc 编译时加上 -g 选项得到调试表。
gdb attach pid
调试已经在运行的进程
基础指令
- list/l 或 list [数字]:列出源码。加数字,在指定行号位置附近显示
- break/b 或 break [number]: b 20 在20行位置设置断点
- d/delete:断点编号 删除断点
- run/r:运行程序 (到第一个断点处停止)
- start:运行程序(到主函数第一条语句停止)
- n/next:下一条指令(会越过函数)
- s/step:下一条指令(会进入函数)
- p/print [变量名]:查看变量的值
- continue/c:继续执行断点后续指令
- finish:结束当前函数调用
- quit:退出 gdb 当前调试
其他指令
- run:使用 run 查找段错误出现位置
- set args 字串1 字串2 ...:设置 main 函数命令行参数 (在 start、run 之前)
- run 字串1 字串2 ...:设置main函数命令行参数
- info/i b:查看断点信息表
- info threads 查看所有线程
- b 20 if i = 5:设置条件断点
- ptype:查看变量类型
- bt/backtrace:列出当前程序线程正存活着的栈帧。(栈帧:随着函数调用在stack上开辟的一块内存空间,用于存放函数调用时产生的局部变量和临时值)
- frame/f:根据栈帧编号,切换栈帧
- display:设置跟踪变量
- undisplay:取消设置跟踪变量,使用跟踪变量的编号
其他
curl指令
Command Line URL
用来请求 Web 服务器
- 用法1
$ curl https://www.example.com
含义:向www.example.com
发出 GET 请求,服务器返回的内容会在命令行输出。
- 用法2
$ curl -o example.html https://www.example.com
- 小写的o需要指定名字, 大写的O不用指定名字
含义:参数将服务器的回应保存成文件,等同于wget
命令。
-L
参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。
last
用于显示用户最近登录信息
lastb
用于列出登入系统失败的用户相关信息
nm
查出二进制文件包含的符号表
scp命令
1、从本地复制到远程
在本地服务器上将/root/lk目录下所有的文件传输到服务器43.224.34.73的/home/lk/cpfile目录下,命令为:
scp -r /root/lk root@43.224.34.73:/home/lk/cpfile
2、从远程复制到本地
在本地服务器上操作,将服务器43.224.34.73上/home/lk/目录下所有的文件全部复制到本地的/root目录下,命令为:
scp -r root@43.224.34.73:/home/lk /root
netstat 命令
命令介绍
netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。
命令选项
-a:查看所有连接
-c:持续列出网络状态
-e:显示网络其他相关信息
-g:显示多重广播功能群组组员名单。
-i:显示网络界面信息表单
-l:显示监控中的服务器的SOCKET
-n:直接打印连接的IP地址与端口信息
-p:显示正在使用SOCKET的程序识别码和程序名称
-r:显示路由信息
-s:显示网络工作信息统计表
-t:显示TCP传输协议的连线状况
-u:显示UDP传输协议的连线状况
-v:显示指令执行过程
-w:显示RAW传输协议的连线状况
-F:显示FIB
-C:显示路由器配置的快取信息
-A:列出该网络类型连线中的相关地址
-N:显示网络硬件外围设备的符号连接名称
-M:显示伪装的网络连线
常用 sudo netstat -tanp 显示TCP传输协议的连线状况端口程序
ldconfig
添加动态库文件搜索路径
ldconfig
是一个用于配置动态链接器运行时链接的程序。它主要用于在默认的动态库搜索路径中添加或移除路径。要添加或移除动态库搜索路径
添加或移除动态库搜索路径:
编辑 /etc/ld.so.conf
文件,在文件中添加你想要添加的路径。每个路径应该独立占一行。例如:
/usr/local/lib
/opt/mylib
然后运行ldconfig
命令,更新动态链接器的缓存
想临时性地添加路径/usr/local/newlib
作为动态库搜索路径,你可以使用以下命令:
ldconfig /usr/local/newlib
这将会临时性地将/usr/local/newlib
添加到动态链接器的运行时链接路径中,以便它可以找到该路径下的动态库。
这种形式的ldconfig
命令只会在当前会话中生效,当会话结束后,动态链接器会恢复到原来的状态,不再包含临时添加的路径。