一、openEuler & VMware
- 获取openEuler镜像
- VMware创建并安装openEuler
- 安装并重启openEuler之后,可能遇到的问题
- VMware Tools & 终端中文输入
二、学习笔记(1、2章)
- 知识点归纳
- 最有收获的内容
- 问题与解决思路
三、实践内容与截图
- openEuler的Git安装与使用
- history命令
- ll命令与结果解析
- cat命令
- cp命令
- rm命令
- ln命令
- find命令
- grep命令与ps命令
- tar命令
- man命令
- vim
- gcc
- gdb
- makefile
- 静态库制作
- 动态库制作
镜像官网,点击这里
下载镜像和其sha256文件
完整性检验
Windows下使用命令 certutil -hashfile 文件名 sha256
获取文件的sha256值
我这第一次莫名其妙地下载了LTS-SP1-x86_64,所以哈希值不对,重新下一下sp2
这回对了
阅读并操作了近十篇博客后,还是推荐这个教程
小白教程
安装很多次后,个人建议
安装系统时,软件选择中,选择最小安装后,还应该选择右侧的“标准、开发工具、系统工具”三项,
方便进入终端之后,有一定的工具可以用
检查网络和主机名一项,看看网络是否连接,是否有IP地址,默认路由,和DNS,顺便改一下主机名
不要锁定root用户,方便之后做一些需要root权限的操作
可以使用ukui的桌面环境,也可以考虑deepin、gnome等
SMBus Host Controller not enabled
Name or Service not known
表现:ping www.baidu.com 报错
首先检查ip地址,看看目前的IP地址能不能上网
Linux&VMware三种网络模式
方法一:静态IP,但是我发现隔壁的ubuntu和kali也上不了网了。。。这里对VMware的操作好像对所有虚拟机都生效
配置静态IP的博客
方法二:思前想后,回忆一下看过的二十几篇博客,研究了一下隔壁ubuntu的网络配置,a sudden enlightenment
- ifconfig 查看下网卡,应该有一个ens33
ifconfig 命令 之前在安装系统时应该已经安装了(软件选择一项),如果没有的话,现在又没有网,个人觉得只能重装一下系统。
使用ifconfig ens33 {某个IP}
配置ens33的IP地址
{某个IP} = 之前安装系统时,有个网络和主机名的选项界面,右侧有一个IP地址,顺便把默认路由也记下来
- route add default gw {某个网关IP}
{某个网关IP} = 之前安装系统时,有个网络和主机名的选项界面,右侧有一个默认路由
- 用 ifconfig -a 和 route 命令检查配置是否成功
- ping www.baidu.com 应该可以成功,然后重启后配置失效
- 永久生效,修改网卡配置文件
vi /etc/sysconfig/network-scripts/ifcfg-ens33.conf
reboot 重启,大概率就好了,之后就可以愉快地yum 和 wget 了
VMware Tools
安装VMware Tools时,相当于VMware给openEuler挂了个U盘。把里面的安装文件夹复制到桌面,
解压缩里面的压缩包,打开终端,sudo运行.pl文件,一路回车(默认配置)即可
openEuler终端中文输入
sudo yum install ibus-libpinyin
ibus-setup
全部默认配置即可- 安装好以后,在任务栏会有图标,可以点击图标切换中英文输入,也可以使用快捷键
最有收获的内容还是 堆栈和栈帧 的部分,以前也做过缓冲区溢出的攻击试验,当时就因为对底层的情况了解的不是很清楚,而导致shellcode没法运行。
虽然当时也查找了不少资料,但本书中的讲解,提到了之前没有注意到的知识,也加深了我对 程序执行时堆栈实际情况 的理解。
为了方便描述堆栈的情况,这里将函数调用过程,分为两个部分,函数调用和函数返回
函数调用
函数返回
关于缓冲区溢出
读写时怎么做的?
inode(index node)索引节点,inode本质是一个结构体,存储着文件详细信息,
删除时怎么做的?
只是删除硬链接计数,当删到0时,再真正去删除inode
函数调用之前,如果没有函数声明和函数定义,那么编译器会帮忙做隐式声明
int add(int ,int ) 变量都自动定义成int类型
这是一件危险的事情,这次是正好碰上了,所以能运行成功
解决方法就是为静态库 配套编写一个头文件
gcc src/ch1/staticlib.c -o bin/staticlib -L lib -l mymath -I include
参考资料
虽然没有现成的openEuler教程,但下面两个博客基本能解决问题
创建本地仓库
连接远程仓库
初始化好了之后,常用的git命令也就差不多,add、commit和push
创建好本地仓库的目录结构后,先编写个hello.c测试一下,makefile之后再写
本地gcc正常,hello.c正常执行,git正常工作,远程库正常更新
用 !数字
重新执行某条命令
ll命令 等价于 ls -l命令,
结果解析
第一部分,10个字母
第一个字母,代表文件类型,Linux下有七个文件类型,对应七个字母,列举三个常见的:普通文件 (-)目录文件(d) 符号链接(|)
剩下9个字母,被分成3组,每组3个字符,依次为rwx,代表三种权限,r(可读)w(可写)x(可执行),如果没有该项权限,则用 - 标志
第一组表示所有者(Owner)的权限,第二组表示同一组用户的权限(Group),第三组表示其他用户的权限(Others)
第二部分,一个数字,代表硬链接数,inode值,关于硬链接与inode
第三部分,所属用户
第四部分,所属组
第五部分,文件大小,如果没有单位,默认以字节为单位
第六部分,最后一次修改时间,可能是“月、日、时:分” ;或者“月、日、年”(最后一次修改时间不是今年)
第七部分,文件名
cat -n 文件名
显示行号
cat -b 文件名
显示行号,不算空行
cp -a 源文件 目标文件
保留链接、文件属性,并复制目录下的所有内容
cp -r 源文件 目标文件
通过ls -l查看,可以发现文件的最后一次修改时间发生了变化
cp -d 源文件 目标文件
复制软连接。正常不加-d,就会复制目标文件
软连接
正常rm命令是不询问的,直接做删除操作
如果希望它询问,加 -i
如果正常rm命令删除一些受保护的文件,不会直接删除,会先询问
如果不希望它询问,加-f
删除文件夹 加-r
ln -s 相对路径 文件名
将软连接换一个位置就会出错
ln -s 绝对路径 文件名
将软连接搬移到任意位置,都能找到对应的文件
虽然不论是cat还是vi,都会查看目标文件,而不是连接文件本身,
但我们可以从文件大小,以及一些资料推测:软连接文件中存储的就是路径
软连接记录相对位置,搬移后出错,记录绝对位置则没问题
ln 文件名 链接名
-type -maxdepth(find默认搜索所有子目录,如果不想这么做,需将-maxdepth作为第一个参数,指定搜索深度)
-name 结合正则表达式
-size -size (同时上下限,需要两个size)
单位:注意大小写
-atime -ctime -mtime(按照最近访问、更改、改动时间,查找)
-exec 命令 {} ; 不询问
-ok 命令 {} ; 询问
{}代表搜索结果集合
; 转义,语句结束标记
-r 进入子目录 -n 显示行号
ps aux (类似任务管理器)
ps aux | grep kernel(搜索进程,至少有一个,那是这条命令的进程)
kill + 进程id (杀死进程)
-zcvf 压缩
-zxvf 解压缩
/string 查找
n 查找下一个 N 查找上一个
末行模式,替换
:2,3s /thinked/thinks/g
:%s /thinks/thought/g
命令模式,man手册
3K
创建2.txt,并将1.txt的内容复制到2.txt
vi 1.txt
:vsp 2.txt
Ctrlww
ggyG
Ctrlww
P
:Wqall
hello.c
#include <stdio.h> #include "hello.h" void say_hello(){ printf("191206say hello\n"); } int main(){ say_hello(); return 0; }
hello.h
#ifndef _HELLO_H_ #define _HELLO_H_ /*comments*/ void say_hello(); #endif
gcc src/ch1/hello.c -I include -o bin/hello
gcc src/ch1/gdb.c -o bin/gdbtest -g
l(list)显示源代码
b(break)设置断点 r(run)运行,遇到断点自然停下
n(nextline)下一行代码 s(step)下一步,会进入函数
p(print)查看变量 display(持续展示变量值)
使用until,运行到指定行,用来跳出循环
使用finish,结束函数
条件断点 b 行号 if 条件
查看、切换栈帧 bt 和 frame (查看不在当前函数栈帧中的变量)
src = $(wildcard src/ch1/*.c) obj = $(patsubst %.c,%.o,$(src)) myArgs= -Wall -g ALL:a.out a.out:$(obj) gcc $^ -o $@ $(myArgs) $(obj):%.o:%.c gcc -c $< -o $@ -Iinclude $(myArgs) clean: -rm -rf $(obj) a.out .PHONY: clean ALL
因为现在项目里面有两个main函数,所以报错了,但头文件正常包含,目标文件正常生成了
ar rcs ../../lib/libmymath.a add.o sub.o div1.o
gcc src/ch1/staticlib.c -o bin/staticlib -L lib -l mymath
gcc src/ch1/staticlib.c -o bin/staticlib -L lib -l mymath -I include
gcc -c %.c -o %.o -fPIC (生成与位置无关的代码)
gcc -shared -o lib库名.so %.o
gcc -shared -o ../../lib/libmymath.so addd.o subd.o div1d.o
gcc src/ch1/staticlib.c -o bin/dynamiclib -L lib -l mymath -I include
bin/dynamiclib 运行报错,找不到文件???
原因:动态链接器,会到默认的地方寻找动态库,然而默认的地方,没有libmymath.so
解决:设置环境变量,export LD_LIBRARY_PATH = 库路径