快捷键或命令 | 作用 |
---|---|
ctrl+ alt + t | 打开终端窗口 |
tab | 命令补全,补全命令,补全目录、补全命令参数 |
ctrl + c | 强行终止当前命令 |
ctrl + d | 键盘输入终止 |
ctrl + s | 暂停命令,任意键继续 |
ctrl + z | 将当前程序放到后台运行,恢复到前台为命令fg |
ping + 网址 | 检测网络 |
ifconfig | 查看网络默认分配地址 |
clear | 清除界面 |
ping + 默认分配ip地址 | 检测与路由器连接状况 |
ping + 127.0.0.1 | 检测与本机连接情况 |
sudo(获取超级命令权限) apt install(下载安装命令) … | 安装… |
sudo apt update | 更新软件列表 |
cat /etc/… | 查看… |
cat /etc/issue | 查看发行版本 |
history | 查看历来命令(从你装了这个系统开始) |
man … | 查看某命令的相关命令及解释 |
cd / | 切换到根目录,cd用于改变当前工作目录 要加路径 |
ll | 显示当前目录的文件(附详细信息) |
ls | 罗列当前目录的文件 |
pwd | 显示当前工作目录 |
cd . | 返回当前目录 |
cd … | 返回上层目录 |
cd ~ | 切换的该用户家目录 |
cd - | 返回上一次的目录cd |
cd /…/ | 进入…的目录 |
ls(后面的符号i与cd相同) | 显示指定目录的内容 |
mkdir xxx | (make directory)在当前目录下创建文件夹,也可一次性创建多个,即mkdir xxx xxx xxx … |
rmdir xxx | 删除当前目录的xxx文件夹 |
rm xxx(或者对应路径下的xxx) | 删除当前目录的xxx文件 |
cp file1 file2 | 将某目录file1文件复制到某目录file2文件下,如果存在file2则覆盖,如果不存在则创建,-r时可以操作文件夹 |
mv file1 file2 | 将file1移动到file2所在位置,如果在同目录下且file2不存在,则可认为是将file1改名为file2,如果file2不存在则创建文件,如果文件存在则覆盖文件 |
ln aaa bbb | 硬链接bbb链接到aaa |
ln /…/aaa bbb -s | 软链接bbb存储指向aaa的路径 |
echo “aaabbb” > xxx | 把字符串aaabbb写入到xxx文件中 |
find -name “xxx” | 查找指定xxx名称的文件的路径 |
chmod xxx file | 数字设定法改变一个文件对三类用户的权限 |
umask | 查看文件掩码 |
umask xxxx | 临时修改当前用户文件掩码 |
Linux入门期
网络设置
桥接模式:处于同一个网络,路由器给主机分配一个ip地址也给虚拟机分配一个ip地址
NAT模式:本机虚拟一个路由器,该路由器用来连接虚拟机,即创建了一个内网
内网可以访问外网,外网无法访问内网(一般情况,NAT穿透技术可以实现外网访问内网)
设置静态IP地址
- 选择自动DHCP模式
2.重启网络(网络打开再关闭),检测有无网络
3.查看网络detail信息,记录下来
4.在ipv4分页改为手动
5.填写记录信息,子网掩码设置为255.255.255.0,子网掩码用于获取ip地址的网段,网关填写默认路由地址
6.应用设置,测试网络
远程连接(连接虚拟机)
1.C/S架构,客户端(client)服务器(sever)架构,如果连接虚拟机,服务器就是虚拟机,客户端即远程连接工具所在机器,服务器端需要安装服务端程序(sshd)
$sudo apt install ssh
//安装ssh客户端
$ps -elf|grep sshd
//确认ssh客户端是否运行,如果有根目录就说明安装成功
2.切换到客户端xshell程序,open命令打开会话,新建会话
3.协议选择ssh,主机名为虚拟机静态ip地址
建立一个c/cpp文件并编译运行
$ cd hello.cpp #进入源文件所在目录
$ touch hello.c #新建空白的源文件
$ gedit hello.c #编辑源文件
$ gcc hello.c #生成可执行程序
$ ./hello.out #运行可执行程序
hello
$ #继续输入其它命令
linux内核
内核(kernel)作用:
1.管理硬件资源
2.为上层应用软件提供了运行环境
系统调用(system calls) 内核对上层应用程序提供的的接口
库函数 对系统调用进行的包装
shell 命令解释器,解析命令,执行命令/脚本,脚本(命令的集合)
用户子系统
用户分类
1.特权用户/root用户 啥都能干
2.普通用户 sudoers 临时拥有一些权限
3.其他用户
查看所有用户命令
$ cat /etc/passwd
为某用户申请特权
$ sudo useradd xxx
删除用户及其所拥有文件
$ sudo userdel xxx
//并删除其目录
$sudo userdel -r xxx
正确创建用户
$ sudo useradd -m -s bin/bash xxx
//-m表示自动创建家目录
//-s表示指定路径下,比如当前命令为指定bash为默认的shell
切换用户
$su xxx
//切换到root时因为每次开机都会随机root密码,所以需要用命令
$sudo passwd root来两次更改新root密码
banner打印字符串
//一般打印
使用banner xxx打印xxx
//指定参数打印
//竖向
printerbanner -w len xxx
//-w表示打印指定宽度,len为指定宽度
//横向
toilet -w len xxx
//多次打印知道ctrl+c结束
figlet -w len xxx xxx xxx xxx ... (ctrl + c)
xxx的这种参数一般可放在命令末尾也可以放在主命令后面
4.文件子系统
文件名 | 意义 |
---|---|
bin | binary 可执行程序 |
dev | device 设备文件 |
home | 普通目录家目录的根目录 |
root | root用户的家目录 |
sbin | system binary 和系统相关的可执行程序 |
var | variable 经常发生变化的文件(e.g. 日志文件) |
etc | 配置文件 |
lib | 库文件 |
proc | process 进程映射文件 |
usr | 普通用户能够访问的文件 |
文件夹与文件操作
$mkdir xxx
//在当前目录下创建xxx文件夹
$mkdir xxx xxx xxx xxx
//在当前目录下创建多个文件夹
$mkdir xxx -v
//创建的同时得到创建的详细信息
$rmdir xxx
//与mkdir操作相同,不过从创建变为了删除,且删除的只能是空目录空文件夹
$mv aaa bbb
//将aaa文件移动到bbb文件夹内
$ll
//完全显示当前目录的文件(隐藏文件也可显示,附带详细信息)
$ls
//显示当前目录文件
$ll/ls -a
//-l表示显示文件的详细信息,-a显示当前目录所有文件 -t表示以时间排列显示文件,-i表示显示id,这些参数可以组合使用,h表示将文件大小以人类易读的方式显示
//例如 ls -li
在ll或者ls - l显示文件时
第一列如果前缀时dir则表示文件夹,如果是-开头则表示普通文件,l开头则表示符号链接,c代表字符设备(键盘),b代表块设备(硬盘),p代表管道文件(进程之间进行通信的文件),s表示套接字文件(网络通信)
后面跟着的w,r,e分别代表write,read,execute,表示普通用户能够行使的权限,总共出现三次即三组,第一组表示自己的权限,第二组表示同组的其他成员的权限,第三组表示其他组成员的权限,例如 drwxr-xr-x
第二列 硬链接个数
第三列 用户名称
第四列 用户所属组名
第五列 文件大小 单位比特byte
第六列 最近修改时间
最后一列 文件名称
通配符(wild card)
通配符 | 意义 |
---|---|
* | 可以匹配任意多个字符(包括0个字符) |
? | 可以匹配任意一个字符 |
[…] | 匹配这个集合(即这个括号内)的任意一个字符 |
[!..] | 匹配集合外的任意一个字符 |
[0-9],[a-z],[A-Z],[A-Za-z] | 匹配内部的任意一个字符 |
cp(copy)
//可以复制一个文件或一个文件夹
cp /.../xxx .
//把某路径下的xxx复制到当前目录下,'.'也可以换成某个路径
cp file1 file2
//把文件file1复制到另一个文件file2中
//如果文件file2不存在,则创建这个文件,如果文件存在则覆盖这个文件
//-i会诊断要覆盖文件原本是否有信息,并提示是否覆盖,-r表示递归地复制文件夹,-u表示复制多个文件到某个目录下时,会选择性的进行复制,如果某个文件不在这个目录下或者某个文件的修改时间新于该目录下同名文件,则会将这个文件复制或覆盖到该目录下,-v表示复制时的详细信息
//-r的时候,如果file2文件夹存在,则会将file1文件夹复制到file2目录下
cp *.cpp dir
把通配符后带有.cpp的文件全部复制到dir目录中
mv
//将一个文件移动到另一目录下
mv file1 file2
//将file1移动到file2所在位置,如果在同目录下且file2不存在,则可认为是将file1改名为file2
//-i表示如果同名是提示是否覆盖
mv file dir
//如果dir存在,则将file移动到dir中,如果不存在,则认为dir是一个普通的文件,并创建
mv dir1 dir2
//如果dir2存在,则将dir1文件夹移动到dir2中,如果不存在则会创建文件夹,将dir1内的文件复制到dir2中,如果是同目录则起到重命名的效果
//-v,-u与cp的-v,-u相同效果
rm
//删除文件或者删除文件夹(与rmdir不同,既可以删除空文件夹也可以删除有文件的文件夹)
rm /.../ xxx xxx xxx
//删除xxx或多个文件
//-i提示要不要删除,-r递归删除即能删除文件夹,-v删除的详细过程,-f忽略提示
rm-rf / 删库跑路
//自己删除时建议不要使用root用户进行删除,删除之前要通过ls确认要删除的选项,同时添加-i参数
链接
硬链接
目录本质也是一个文件
通过ls - la可以看到开头的两个文件分别是 . 和 …
目录会存储一些目录项,. 和 … 就是目录项,分别指向当前目录和上级目录,目录项以链表进行链接,每个节点就是一个目录项(entry),目录中的普通文件不算目录项
通过目录项可以直接访问某个目录,就称为硬链接
如果想在一个目录中添加或删除目录项,该用户需要拥有该目录的写权限
一个普通文件的硬链接数默认为1
软链接(符号链接)
某个文件存储的是一个路径,这条路径指向了一个目录,这个间接访问目录的方式就成为软链接
符号链接类似与指针,和windows的快捷方式
ln(link)
//创建链接
ln aaa bbb
//创建一个链接到aaa的目录项,目录项名为bbb
ln /.../aaa bbb
//创建一个链接到某目录的aaa文件的bbb软链接,例如ln ../aaa bbb意为bbb的文件存储了指向上级目录aaa文件的路径,且以..或.等目录项写的路径成为相对路径,具体描述则为绝对路径 ln /home/niepandou/aaa bbb
//为了避免文件转移导致的绝对路径找不到文件,一般都选择相对路径进行描述
查找文件
locate
//全盘查找某文件
locate xxx
//查找所有与xxx相关的文件,如果某个文件已经在linux的数据库中,查找起来会非常快
//如果是新创建的一个文件,暂时是查不到该文件的
which(常用)
//定位一个command(可执行程序)
which xxx
//which sshd可查找到sshd程序的位置
find
//在该目录下进行搜索,如果有子目录也会在子目录中进行搜索, 可以使用通配符进行查找
find xxx
//-name表示以名字(-name 具体名字)进行查找,输出的是他的路径
//-a 表示逻辑与and,-o表示或or,!表示取反
组合查找
find /.../ -name "*.a" -o -name "*.b"查找以.a或.b结尾的文件
//-gid n表示查找属于id号为n的用户组的所有文件
//-uid n表示查找属于id号为n的用户的所有文件 uid也可写为user
//-type c表示查找类型为c的文件 b块设备文件,c字符设备文件,d文件夹(目录)文件,p管道文件,f普通文件,l软链接,s表示套接字文件,硬链接文件可以看作是一个普通文件
e.g.: find ~ -name "*hello*" -a -type f//在家目录中寻找包含hello且为类型为普通文件的文件
//-size n表示以存储单元查找 b表示块,一般512字节称之为块,c(character)表示字节,K,M,G则为其原来的意思,默认查找块
e.g: find ~ -size 8980c //精确查找字节为8980的文件 +8090c则表示查找大于8090c的文件,如果有小数要记住查找是向上取整
//如果要查找0字节则选择 -empty(可以用来查找空文件和空目录)
//-perm表示这个文件对不同用户的权限,-rw-rw-r--每一组用二级制表示为110 110 100(开头的-表示普通文件),因为一个用户最多用的的权限有rwx,二进制转十进制为7,所以每一组可以用八进制表示,-perm就是通过三个八进制数来作为指标进行find查找的,-rw-rw-r--用三个八进制表示为664,则可以写为-perm 664
//一般普通文件的perm就是664
//如果查找是通过用户的单个权限 也可以这样写 -perm -u=x 表示的是查找用户拥有执行权限的文件
//-exec 可以以行为单位把一个命令的输出结果当作另一个命令的参数,一般可用于组合命令
find -name “* .cpp” -exec ls -l {} \; //{} 将find命令输出的结果以行为单位作为ls -l的参数
权限
一般用linux执行.py文件时是没有足够权限的
在执行该文件时提示权限不足
./hello.py Permisson Denied
chmod(change mode)改变权限
//文字设定法
chmod [ugoa][+=-][rwx] file/dir//第一组表示哪类用户,a表示all,第二组表示增加减少某个权限, =时表示该用户只有某个权限,第三组表示的就是具体权限
组合修改权限
e.g: chmod u=rw, g=rw, o=r hello.py
//数字设定法
chmod [三个八进制数] file/dir //第一组分别表示ugo三类用户的权限
umask(文件掩码)
文件掩码指的是在创建文件(0666)或目录时(0777)在全部权限中要去掉的一些权限
//获取文件掩码
直接输入umask会得到0002,002为普通用户的文件掩码,0022为root用户掩码
创建文件夹时,默认掩码为777,即所有用户都拥有所有权限,最终得到的却是775,最后得到的文件掩码775 = 777 & (~umask)
创建普通文件时,默认掩码为666,最终文件掩码为664 = 666 & (~0002)
计算的过程可以直接简化成 666 - umask
//临时改变当前用户的umask
umask xxxx//umask 0222
查看文件
文件描述符(一般为非负整数)
stdin 标准输入 0
stdout 标准输出 1
stderror 标准错误输出 2
‘>’ 标准输出重定向(可以认为是c++的输入)
’<‘ 标准输入重定向(可以认为是c++的输出)
2 > 标准错误重定向(2就是strerror)
‘>>’ 标准输出重定向(追加方式)
cat(查看文件内容)
//查看一个文件的内容(速度慢,因为和strcat一样是在输出流直接拼接内容)
cat file
//将file1文件的内容输出到file2中,类似cp
cat file1 > file2
//将键盘输入的内容输输出(写入)到file文件中,如果不写file则是输出到显示器上,ctrl + D结束输入
cat > file
//下次再对这个file进行相同操作时是重新写入, >>则会追加写入
echo(打印一行文本)
//打印xxx
echo "xxx"
//如果echo后面不带任何东西,则会打印一行空行
//将文本xxx输出(写入)到file文件中,同样是重新写入
echo "xxx" > file
head(显示文件的头几行信息)
//默认输出10行
//打印file文件前n行
head -n n file
tail(显示文件的后几行信息)
//默认输出10行
//指定n行与head相同
tail -n n file
//可以用于查看最近日志文件
more/less(单页浏览文件)
//每次查看文件的某页
//查看a文件的首页,f(forward)浏览下一页,b(backward)浏览上一页,q(quit)退出
more a.txt
正则表达式
sort
//对文件内容进行排序(以行为单位)
//对file文件排序,比如文件内第一行为bbb,第二行为aaa,sort之后则打印aaa,第二行bbb,原本的内容不会发生改变
sort file
//不能够文件重定向自己,这样做会使文件内容清零
sort file > file
//cat sort会发现没有任何输出
//但可以文件重定向另一个文件
sort file1 > file2
uniq(unique)
//去重连续重复的几行
//对file文件读取并以行为单位去重,打印,原本的内容不会改变
unique file
对一个文件操作得到排序且没有重复元素的文件
sort sort.txt > sortt.txt;uniq sortt.txt > sort.txt;rm sortt.txt
xargs
// | 管道连接两个命令,管道相当于一个缓冲区,通过第一条命令将结果输送到管道中,然后对管道的内容执行第二条命令,xargs是对内容每一行执行一次命令2
//命令1输出的每一行都执行一次命令2
commmand1 | xargs command2
e.g: find ~ -name "*.cpp" | xargs ls -l
//对命令1得到的结果整体进行命令2
command1 | command2
e.g : sort sort.txt | uniq
file
//得到一个文件的信息(比ls-la更详细)
ls file
wc(what count)
//记录文件中的行数,字节数,单词数
//记录文件中有多少个c
wc file -c
//-c表示字节数
//-l表示行数
//-w表示单词书
iconv
//修改字符集
iconv -f gbk -t uft-8 xxx
//将xxx文件的字符集从gbk转译成uft-8
正则表达式
基本单位:普通字符,转义字符,‘.’,(任意一个字符),[] 集合(只要集合里的一个元素能匹配上就是能匹配 ),()这个整体作为基本单位
基本操作:1.连接:ab
2.重复(必须是连续的):’?‘ 表示重复1次或0次
’+‘ 表示重复一次或多次
‘*’ 表示重复任意次数
{m,n}表示重复m-n次,m和n可以有一个没有,m没有可以认为最多重复n次,n没有可以认为至少重复m次
{n}表示连续出现特定n次
[ ^abc]匹配任意字符,但不包含a,b,c
特殊符号:
^行首 “^abc”
行尾 " a b c 行尾 "abc 行尾"abc"
\<词首 “\<a”
\>词尾 “a\>”
gerp(搜索文件内容)
//globally regex(regular experssion) print
//以行为单位进行查找
grep -en "bbb" aaa//在aaa文件中搜索带有bbb文本的内容
//-e 使用扩展的正则表达式,一般组合使用放在最后
//-n 显示行号
//-i 忽略正则表示的大小写
e.g:grep -ne "cpp" test.txt
grep -ne "h\{1\}" test.txt
find ~ -name "*.cpp" |xargs grep -ne "int main\(\)"
alias
alias//别名
alias
//显示目前所有已有的别名
alias aaa=bbb
//给bbb起一个别名为aaa,临时生效
打包和压缩
//打包
打包文件一般比原文件大,打包文件会预留空间
tar(主选项+辅选项) 目标文件名 源文件或目录
主选项:只能选择其中一个
c(create)r(追加)x(释放)
辅选项:
f(生成指定使用包文件或设备,指定文件名称)
v(显示打包过程)
z(用gzip压缩/解压缩文件,后缀名为.gz)
e.g:tar cvzf a.gz a.out//创造a.gz压缩文件将a.out放进该压缩文件中
tar xvf hello.gz//解压缩hello.gz文件,解压的文件放到该目录下
//注意参数没有-
scp
df(disk full查看磁盘状态)
-h增加可读性
du(disk used查看磁盘使用情况)
du /.../ 查看某目录下的使用情况,默认为当前目录
-h同上
-d n 最多显示n个目录层数
du -h -d 1 //显示当前目录下文件和目录所占空间
du -h -d 2//显示当前目录及子目录下文件和目录所占空间
scp(s_cp远程拷贝secure copy)
//在网络上传下载
scp source dest
本地路径:绝对路径,相对路径
远程路径:用户名@IP地址:+路径
上传
scp Debugger.pdf niepandou@192.168.8.130: ~//将debugger文件传输给远程用户的家目录下
下载
scp -r niepandou@192.168.8.130:~/cpp .//将远程用户的家目录下的cpp文件夹下载到当前目录下
//-r 复制文件夹
上述操作每次操作时都需要验证用户密码,使用密钥后可以跳过该过程
ssh-keygen密钥
产生密钥
id-rsa密钥
id-rsa-pub公钥
用scp将公钥传给远程用户,然后将pub文件放进ssh目录下(注意采用>>追加)的authorized_keys文件
之后每次访问都不需要密码验证
git仓库
修改远程仓库过程
1.修改本地仓库(远程仓库文件传到本地仓库)
2.add(将修改添加到缓存中,stage操作)
3.commit(确认修改)
4.push(将修改内容传到远程仓库)
如果有多人同时进行修改,系统会检验当前文件是否为原先的文件,如果不是则不会进行修改
git用法与scp用法相同
编辑器
vim
vim三种模式
短命令
普通模式(命令模式)【ESC切换】
编辑模式(插入模式)【INSERT切换】
i插入到光标的前面,a插入到光标的后面(append),o光标切换到下一行
I行首,A行尾,O前一行
视图模式
命令模式:
长命令
以':'开头
wq写入并退出
光标移动
上下左右键 kjhl
翻页 ctrl+f(forward),ctrl+b(backword)
翻半页 ctrl+u(up)ctrl+d(down)
H:页首
L:该页最后一行的行首
gg:文件的开始
G:文件的末尾
w;下一个单词(word)
b:下一个单词(back)
n- 往上走n行
n+ 往下走n行
nG / :n 到第n行
删除操作(相当于剪切)
x:删除一个字符
dd:删除一行
ndd 删除光标往下 n行
:n,md:删除n-m行
d^:删除该行光标到行首部分
d$ / D:删除该行光标到行尾部分
dw:删除一个单词
[n]dw:删除n个单词
d[n]w:删除n个单词
dt):删除到)
dt":删除到“
u,撤销上一次操作undo
crtl+r:恢复修改 recover
p:粘贴操作(paste)
yy:拷贝一行(yank)
[n]yy / y[n]y:拷贝n行
:x,y y拷贝x-y行
yw:拷贝一个单词
[n]yw / y[n]w:拷贝n个单词
查找替换
:set hlsearch高亮显示
/xxx 查找xxx(配合高亮显示使用更佳)(也可使用正则表达式匹配)
匹配到后 n移动到下一个匹配项,N移动到下一个匹配项
:s/aaa/bbb/选项(aaa替换为bbb,默认情况下只会替换第一个)
选项为g表示global全部替换
:x,ys/aaa/bbb/选项(将x到y行根据选项对aaa替换为bbb)
:%s/aaa/bbb/g(将该文件内所有aaa替换为bbb)
插入模式:
i插入到光标的前面,a插入到光标的后面(append),o光标切换到下一行
I行首,A行尾,O前一行
视图模式(用于选择范围):
v:行选模式
ctrl+v:列选模式
选完后d删除y拷贝
批量/批量删除注释
1:将光标移动到要注释的第一行
2:进入列选模式选中范围
3:进入插入模式(I)
4:输入//
5:回到命令模式
删除时在列选模式下用d删除//
gg=G 代码对齐命令
文件操作
:w 保存
:q 退出
:q! 不保存强制退出
:wq 保存修改并退出
:new / split / sp file 打开新的窗口
ctrl+w移动到下一个窗口
:qa 退出所有窗口
:vnew / vsplit / vsp 左右分屏
:tabnew 标签分屏(像浏览器一样的标签)
gt 下一个标签 gT下一个标签
:set number 显示行(每次退出再重进会刷新)
设置vim配置文件
配置文件类似于预处理
1.在家目录下创建.vimrc文件
2.打开.vimrc文件
常用配置命令
syntax on//语法检查
set hlserach//查找高亮显示
set tabstop=4//tab缩进为4个空格,默认8个
set autoindent//自动对齐
vimtutor vim练习手册
编译工具链
sdk(software development kit)
gcc
clang
gcc -v 查看gcc版本
一个程序从创建到可执行的过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7nEVMp2O-1683459961327)(C:\Users\niepandou\AppData\Roaming\Typora\typora-user-images\image-20230507185757060.png)]
图裂了看这个:https://postimg.cc/1VGBqvky
预处理
预处理文件常以.i结尾
gcc -E xxx.c -o xxx.i 生成预处理文件
E表示进行预处理 -o表示生成文件的名字
-D xxx 再定义一个宏xxx
编译
gcc -S xxx.i -o xxx.s //生成汇编文件
/ gcc -S xxx.c -o xxx.s