how-to-use/linux/Linux-knowledge.txt

313 lines
9.9 KiB
Plaintext

ctrl+p 上一个命令,ctrl+n 下一个命令
ctrl+b 光标回移, ctrl+f 向后移动, ctrl+a 行首, ctrl+e 行尾
ctrl+h 删除前, ctrl+d 删除后。Linux中光标盖住的是后一个字符。
ctrl+u 删除光标前面所有。ctrl+l 清屏。
vim 基础操作:
j :下移一行
k :上移一行
h :左移一个字符
l :右移一个字符
gg :跳到第一行
G :跳到最后一行
0 :左移到行首
$ :右移到行尾
ctrl + f :向下翻页
ctrl + b :向上翻页
ctrl + d :向下翻半页( d 代表 down )
ctrl + u :向上翻半页( u 代表 up )
H :移动到屏幕最上面(页面本身不动)( H 代表 high )
L :移动到屏幕最下面(页面本身不动)( L 代表 low )
M :移动到屏幕中间行(页面本身不动)( M 代表 middle )
zt :把当前行移动到屏幕最上面( t 代表 top )
zb :把当前行移动到屏幕最下面( b 代表 bottom )
z. :把当前行移动到屏幕中间
:<n> :跳到第 <n> 行(需要回车)
ls 可传一个目录参数。
Liunx的目录结构:
/bin: 常用命令
/boot: 启动系统的核心文件
/dev: Linux的外部设备,访问设备与访问文件的方式是一样的。
/etc: 系统管理所需要的配置文件和子目录。
/home: 用户目录。
/lib: 库文件。
/lost+found: 一般是空的,非法关机之后存放一些文件。
/media: Linux会自动识别一些设备,如U盘,自动挂载到Media下面。
/mnt: 让用户临时挂载别的文件系统时用。
/opt: 给主机额外安装软件所摆放的目录, 默认为空。
/proc: 虚拟的目录,内存的映射,可以直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘而是在内存中, 可以直接修改。
/root: 超级用户目录。
/sbin: 系统管理员的程序。
/selinux: 是Redhat/Centos特有的一个安全机制,类似防火墙。
/srv: 服务启动之后需要提取的数据。
/sys: Liunx2.6内核的大变化
/tmp: 存放临时文件。
/usr: 很多用户程序和文件放在这里。
/usr/bin: 系统用户程序。
/usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序。
/usr/src: 内核代码默认放置目录。
/var: 存放不断扩充的东西,比如各种日志文件。
cd -: 切换到临近目录。
yun@debian:
yun是当前登录的用户名,debian是安装系统时设置的主机名。
$: 普通用户
#: 超级用户
直接cd,回家目录。
创建软链接:
ln -s /home/yun/hello.c /home/yun/hello.soft
ln -s /home/yun/download xxx.soft
创建硬链接(并没有拷贝):
ln /home/yun/hello.c hello.hard
wc: 获取文本文件的行数,单词数,字符数。
od: 查看二进制文件,od -t 指定显示格式。
du: 查看当前目录的大小。du -h
-rw-rw-r--,-文件,rw-文件所有者权限,rw-所属组权限。r--其他人权限。
chmod:
1.文字设定,[who]文件所有者u, 文件所属组g, 其他人o, 所有人a
+-= (增减覆盖) [mode]读r,w写,x执行。
2.数字设定,r->4, w->2, x->1, chmod -001 xxx
修改文件所属组所有者:
chown Lisi main.cpp 所有者变了,但是所有组没有变化。
chown Zhangsan:group2 都变了。
chgrp 仅修改所有组。chgrp group3 xxx.cpp
mkfifo 创建管道
所有的目录能查看和进入,必须有x,可执行权限。
find [path] -name "xxx.cpp"
?: 通配一个字符
*: 通配所有字符。
find [path] -size +10k[-10 k,M,]
查找范围,多个-size即可。
find [path] -type d
文件类型-所有者权限-同组用户权限-其他人权限-硬链接数-所有者-所属组-占用-时间
Linux 文件类型:
-: 普通文件(f)
d: 目录
l: 链接符
b: 块设备
c: 字符设备
s: socket设备
p: 管道
卸载硬盘:umount /media/user/xxx-usb
sudo fdisk -l 查看设备信息。比如U盘是/dev/sdb
挂载硬盘:mount devicename /mnt
sd->SCSI Device
hd->Hard Disk
fd->Floppy Disk
主分区最多有4个。sda4
压缩相关:
gzip 打包:g(un)zip *.txt ->xxx.gz 文件
b(un)zip2 *.txt 都不会保留原文件,没有打包压缩。->bz2文件
tar: c-创建,x-解压缩, v-显示信息, f-指定名字,
z-使用gzip的方式压缩,j-使用bzip2的方式压缩,不添加zj只能打包。
压缩:tar zcvf xxx -> xxx.tar.gz tar jcvf xxx -> xxx.tar.bz2
完整示例:tar zcvf result.tar.gz *.txt
解压到指定目录:
tar zxvf xxx.tar.gz -C /home/yun/test/
终端[文字终端][图形界面终端]
tty1->tty6 tty7
who
pts: 设备终端
PID 进程的ID
ps [a 查看当前所有用户][u 显示用户的信息][x 查看没有终端的应用程序]
使用管道重定向(|){输出作为另外一个命令的输入}
ps aux | grep bash
kill -l 查看信号
kill -SIGKILL 2351 或者 kill -9 8311 也可以
env 环境变量
网络相关命令:
ip addr, ping [-c 4 -i xx s], ifconfig,
nslookup www.baidu.com 查看IP地址。
用户的添加:
adduser (脚本) + Zhangsan
useradd (命令)
su Zhangsan 切换用户
useradd [-s 什么解析器(/bin/bash)][-g 所属组(Robin)][-d 目录(/home/xxx)]
usermod -s /bin/bash xxx 中的 -s 意思与上述一致。
[-m 如果没有xxx目录就创建Robin]
更改所属组: chown xxx:xxx somedir_or_file
groupadd xxxGroup 增加组
passwd Zhangsan 修改密码
删除用户:deluser, userdel -r
/etc/passwd下可以查看用户
vsftpd: FTP服务器的一个软件。
service xxx restart
lftp: 可以上传和下载目录。
alias: 查看命令是否被封装
ldd: 查看so文件依赖。
Linux会优先搜索LD_LIBRARY_PATH,之后再去默认位置查找。
也可以设置:/etc/ld.so.conf, ldconfig更新生效。
gdb xxx
l 查看源码,包含main函数的文件。
否则 l qimen.c:20 查看这块代码
l qimen.c:run 也可以。
继续查看后面的继续输入l或者直接回车。
break xxx行(b 行) 普通断点。
特殊断点:b 20 if i==15
i b: 查看断点信息。(info break)
start开始运行,执行一步。
r 直接跑。[run]
单步调试:n, 直接到断点:c (continue)
进入函数:s (step)
p 打印值。
ptype 查看变量类型。
display i 追踪变量i的值。
undisplay 变量编号取消追踪。
u 跳出单次循环
finish 跳出进入的函数体。取消里面的断点才可以退出。
d 编号删除断点。[del]
set var i=10 设置变量的值。
quit 退出。
Makefile的编写:
三要素:目标,依赖,命令。 --> 一条规则
result: sub.h sub.cpp
g++ main.cpp sub.h sub.cpp -o result
分开编译,防止每次全部编译。
math.o: sub.cpp
g++ -c sub.cpp
main.o: main.cpp
g++ -c main.cpp
result: main.o math.o
g++ -o result main.o math.o
Makefile中的变量。
obj=main.o math.o
result: $(obj)
g++ -o result $(obj)
vim 替换:3,4s/prestr/afterstr
makefile语法一样的情况:
{模式规则}
%.o:%.c
g++ -c $< -o $@
原理:
1.例如依赖sub.o,那么%.o中的%就对应成了sub,
即sub.o: sub.c
2.$<: 自动变量, 规则中的第一个依赖。
$@: 规则中的目标。
$^: 规则中的所有依赖。
以上只能在命令模式中使用。
一般:CPPFLAGS:预处理器需要的参数,例如: -I
CFLAGS:编译参数,例如: -Wall
LDFLAGS:链接库参数,例如: -L
makefile中的函数,所有的函数都有返回值。
src=$(wildcard ./*.c)
obj=$(patsubst ./%.c, ./%.o, $(src))
.PHONY:clean 声明伪目标,不检查文件。
-rm [-]如果当前命令失败,继续执行。
全局变量不初始化=0,局部的未知。
FILE* 结构体:文件描述符,读写指针,I/O缓冲区(addr)de:8KB
Linux 启动一个进程后内存模型:{虚拟地址}
虚拟地址作用:1.空间隔离 2.访问不连续物理空间 3.物理内存分配。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Linux kernel[内存管理,进程管理,设备驱动管理,文件系统]
| 内核区32位是,3G~4G
环境变量
命令行参数
栈(向下增长)
共享库
堆(向上增长)
>>>>>>>>>
.bss未初始化变量
.data已初始化变量
xxx 其他
.text代码段
>>>>>>>>> ELF段
受保护的地址(0~4K)。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
PCB进程控制块。文件描述符表[一个数组]。
默认打开了三个,标准输入输出错误。
打开一个文件占用一个描述符,最小占用原则。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
file xxx可以查看xxx信息。
C库函数与系统函数之间的关系:
例如[printf]
->系统API(应用层write)
->系统调用(sys_write) {用户空间到内核空间转换}
->内核层(驱动)
->硬件显示。
Linux系统IO函数:open, read, write, lseek 可使用man文档。
man 章节号 open
errno 全局变量
perror(const char* s)[stdio.h]
open系统函数中指定的权限与umask掩码取反做一个按位与的操作。
在vim中,可以直接使用K查看函数文档。
守护进程
1.后台服务
2.不受登录注册影响
3.一般以d结尾。
4.周期性执行任务
5.独立于终端
简述秘钥使用方法:
非对称加密算法:加密使用的密钥和解密使用的密钥是不同的。 公钥密码体制就是一种非对称加密算法
私钥,公钥。服务器持有公钥,本地私钥可以登录。
加密解密过程如下:
加密:通过加密算法和公钥对内容(或者说明文)进行加密,得到密文。
解密:通过解密算法和私钥对密文进行解密,得到明文。
注意:由公钥加密的内容,只能由私钥进行解密。
服务:[debian]
/etc/systemd/system/
xxx.service
[Unit]
Description=EyeblueTank
Documentation=https://tank-doc.eyeblue.cn
Wants=network.target
After=network.target mariadb.service
[Service]
Type=simple
ExecStart=/home/yun/program/tank/tank
[Install]
WantedBy=multi-user.target
# 装载tank服务
systemctl daemon-reload
# 设置tank开机启动
systemctl enable tank.service
# 查看tank状态
systemctl status tank.service
# 启动tank
systemctl start tank.service
# 重启tank
systemctl restart tank.service
# 停止tank
systemctl stop tank.service
1.安装mariadb 记录安装版本为10.5
sudo apt-get install mariadb-server
sudo mysql_secure_installation设置密码即可。
CREATE DATABASE boys CHARACTER SET = utf8 COLLATE = utf8_general_ci;
neofetch