这里汇总不适合作为长文博文的“教程 + 速查”,覆盖常用工具、安装配置与故障处理:what to do if X occurs, and why.

GDB

gdb调试带参程序

1. 编译程序:
   gcc/g++ -g prog.c/cpp -o prog
2. 启动 GDB 调试器:
   gdb prog
3. 设置程序参数:
   在 GDB 调试界面中,使用命令 set args "参数" 来设置参数,例如:
   set args -l a -C abc
4. 开始调试:
   按下回车后,使用命令 r 开始程序执行
指向原始笔记的链接

gdb显示intel和at&t汇编

在windows下使用习惯了intel汇编,在Linux下看的难受,在gdb下使用下面的命令行进行切换:

set disassembly-flavor intel
set disassembly-flavor att
指向原始笔记的链接

gdb中x的用法

本文转载自:gdb ---- x命令详解

作者:Adam_0 链接:https://www.jianshu.com/p/589308dd36dc 来源:简书

examine命令缩写为x 格式:

x/<n/f/u>  <addr>
n:是正整数,表示需要显示的内存单元的个数,即从当前地址向后显示n个内存单元的内容,
一个内存单元的大小由第三个参数u定义。
 
f:表示addr指向的内存内容的输出格式,s对应输出字符串,此处需特别注意输出整型数据的格式:
  x 按十六进制格式显示变量.
  d 按十进制格式显示变量。
  u 按十进制格式显示无符号整型。
  o 按八进制格式显示变量。
  t 按二进制格式显示变量。
  a 按十六进制格式显示变量。
  c 按字符格式显示变量。
  f 按浮点数格式显示变量。
  i 指令地址格式
 
u:就是指以多少个字节作为一个内存单元-unit,默认为4。u还可以用被一些字符表示:
  如b=1 byte, h=2 bytes,w=4 bytes,g=8 bytes.
 
<addr>:表示内存地址。
Format letters are o(octal), x(hex), d(decimal), u(unsigneddecimal),
t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8bytes)

举例: x/3uh buf 表示从内存地址buf读取内容,

3表示三个单位, u表示按十六进制显示 h表示以双字节为一个单位

指向原始笔记的链接

gdb插件自动切换

本文转载自:gdb 的配置、插件plugin与多彩显示

若未下载这些插件:Linux下gdb(插件pwndbg、pead、gef)安装及调试常用指令

PwnDbg、gef、peda 的自动切换,其实就是切换配置文件:

先把他们全部装上,当然你可以选择自己感兴趣的安装,他们的配置都需要通过 ~/.gdbinit 来配置,因此他们是互斥的,配置里只能配置一种,但是可以用下面的这种方法解决,下面的示例只写了 peda、PwnDbg和gef,其它自己加。

1、Open your .gdbinit file, delete any contents and paste the following configuration:

define init-peda
source ~/peda/peda.py
end
document init-peda
Initializes the PEDA (Python Exploit Development Assistant for GDB) framework
end
 
define init-pwndbg
source ~/.gdbinit_pwndbg
end
document init-pwndbg
Initializes PwnDBG
end
 
define init-gef
source ~/.gdbinit-gef.py
end
document init-gef
Initializes GEF (GDB Enhanced Features)
end

Then, create the following 3 files in one of your PATH folder: 然后,分别创建下列三个文件在你的 \PATH 文件夹中(查看$PATH文件夹命令:echo $PATH):

First create a file named by gdb-peda and paste the following: 首先创建一个名为 gdb-peda 的文件,并将下列内容复制进去:

创建文件指令:sudo touch gdb-peda

#!/bin/sh
exec gdb -q -ex init-peda "$@"

Then gdb-pwndbg: 然后是 gdb-pwndbg:

#!/bin/sh
exec gdb -q -ex init-pwndbg "$@"

Then gdb-gef: 然后是 gdb-gef:

#!/bin/sh
exec gdb -q -ex init-gef "$@"

最后分别修改它们的可执行权限:(注:gdb-* 代表 gdb-gef、gdb-peda、gdb-pwndbg

chmod +x /usr/bin/gdb-*

然后你就可以使用 gdb-peda, gdb-pwndbg 或 gdb-gef 来运行相应的gdb plugin版了。

指向原始笔记的链接

IDA

IDA远程调试

参考:

linux漏洞分析入门笔记-栈溢出

Windows下IDA远程调试Linux程序,无法连接

ida7.5

kylin v10

0x00:环境配置

使用IDA远程调试Linux程序步骤如下:

\1. 在进行远程调试之前需要对Linux平台进行一些准备工作。在IDA的安装目录中的dbgsrv文件夹中,选择linux_server或者linux_serverx64复制到需要调试Linux程序所在的目录下。将复制过来的文件赋予执行权限chmod 777 linux_server*。执行该文件./linux_server或者./linux_server64。

\2. 在IDA中选择菜单Debugger-Run-Remote Linux debugger。如图。分别将程序所在位置,程序所在目录,参数(没有可不写),主机IP,主机端口,点击OK。相对路径路径要填写相对

linux_server或者linux_serverx64的相对路径。

图1

图2

图3

\3. 此时,下关键函数下好断点后,即可进行动态调试,如下图:

图4

常用快捷键包括:

a. 单步步过:F8

b. 单步步入:F7

c. 执行到光标位置:F4

d. 设置断点:F2

e. 顺序执行:F9

0x01 问题

您在远程调试过程中,可能出现能ping通,但就是连不上的情况,这可能是因为您开启了防火墙。

centos从7开始默认用的是firewalld,这个是基于iptables的,虽然有iptables的核心,但是iptables的服务是没安装的。所以你只要停止firewalld服务即可:

sudo systemctl stop firewalld.service && sudo systemctl disable firewalld.service

如果是其他的系统,在linux中关闭防火墙即可

service iptables stop

ubuntu或者centos都可以用以上方法解决,如果是kali的话,获取到ip,直接sudo执行linux_server即可。

指向原始笔记的链接

linux安装ida

本文转载自:安装IDA7.0

以 Ubuntu18.04 为例。您可以将idafree70_linux.run下载到本地主机,然后使用以下命令安装 IDA。

git clone https://github.com/AngelKitty/IDA7.0.git
cd IDA7.0/
chmod +x idafree70_linux.run
./idafree70_linux.run

如果您之前没有安装过 git,可以运行以下命令来获取 git。

sudo apt-get install git

下载完成后,在该目录下打开命令行,并运行 ./ida ,进入安装步骤。

然后您必须单击“下一步”才能完成安装。遇到安装目录解决方案时,建议更改默认路径,然后选择/opt/...IDA要安装的目录。

然后创建一个指向该/usr/bin文件夹的符号链接。

sudo ln -s /opt/idafree-7.0/ida64 /usr/bin

然后你可以测试 ida64 命令,它应该可以工作。

也许你遇到了“Package ‘libstdc++.so.5’ has no installation Candidate”这样的问题,可以运行以下命令来解决。

sudo apt-get install libstdc++5:i386

然后你就可以开始你的ida之旅了。

指向原始笔记的链接

Git

Git快速入门

[toc]

阅前提示:本文来自小甲鱼的极客Python之Git实用教程总结,完全是我自己记得笔记,在这里分享给大家,如有不足和错误,请在评论区告诉我

Git 记录的是什么?

Git 是将每个版本独立保存

image-20220111133553859

工作区域、暂存区域和 Git 仓库

工作区(WORKING DIRECTORY): 直接编辑文件的地方,肉眼可见直接操作;

  暂存区(STAGIN AREA):数据(快照)暂时存放的地方;

  **版本库(GIT DIRECTORT(RESPOSITORY)):**存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程git仓库了。

image-20220111133716264

Git 工作流程

  • Git的工作流程一般是酱紫:

    1. 在工作目录中添加、修改文件

    2. 需要进行版本管理的文件放入暂存区域

    3. 将暂存区域的文件提交到Git仓库

  • Git管理的文件有三种状态:

    • 已修改(modified)
    • 已暂存(staged)
    • 已提交(committed)

实战

  • 将工作目录的文件放到Git仓库只需要两步:

    • git add 文件名 //添加文件
    • git commit -m “你干了啥” //提交并注释
  • 其它命令

    • git status //查看状态
    • git log //查看历史提交的最终版本,即 commit实体
    • reset //撤回提交,即将最后一次存放到Git仓库里的文件撤回到暂存区
    • checkout //从历史快照(或者暂存区域)中拷贝文件到工作目录

image-20220111143815229

image-20220111144429661

几个命令的功能

  • add
    • 用于把工作目录的文件放入暂存区域
  • commit
    • 用于把暂存区域的文件提交到 Git 仓库
  • reset
    • 用于把 Git 仓库的文件还原到暂存区域
  • checkout
    • 用于把暂存区域的文件还原到工作目录

reset 命令选项(危险)

  • git reset —mixed HEAD~

    • 移动 HEAD 的指向,将其指向上一个快照
    • 将 HEAD 移动后指向的快照回滚到暂存区域
  • git reset —soft HEAD~

    • 移动 HEAD 的指向,将其指向上一个快照
  • git reset —hard HEAD~

    • 移动 HEAD 的指向,将其指向上一个快照
    • 将 HEAD 移动后指向的快照回滚到暂存区域
    • 将暂存区域的文件还原到工作目录

reset 命令回滚快照三部曲

  1. 移动 HEAD 的指向(—soft)
  2. 将快照回滚到暂存区域([—mixed],默认)
  3. 将暂存区域还原到工作目录(—hard)

回滚个别文件

  • git reset 版本快照 文件名/路径
    • HEAD 指针不会移动,回滚
  • git reset 版本快照的 ID 号
    • 前滚

比较

比较暂存区域与工作目录

  • git diff //比较差异

    image-20220111162726582

  • 第二行

    比较暂存区域和工作目录下的 README.md a 代表暂存区域下的文件夹 b 代表工作区域下的文件夹

  • 第三行

    1a5af1f..20f3146 表示文件ID, 100644 指定文件类型和权限

  • 第四行

    --- 三个减号,表示是旧文件存放在暂存区域

  • 第五行 +++ 三个加号,表示是新文件存放在工作目录

  • 第六行

    中间的减号(-)代表旧文件,后面紧接着的数字代表开始行号,逗号后面的数字代表持续的行数

  • 第七行 减号后面,代表删减的内容

  • 第八行 加号后面,代表增加的内容

  • 第九行 两个版本共有的内容

  • 如果后面有冒号(:)代表文件内容未完全显示,需要输入命令查看或退出

    • 常用命令
      • j 向下移动一行
      • f 向下移动一页
      • b 向上移动一页
      • d 向下移动半页
      • u 向上移动半页
      • g 跳到第一行
      • G 跳到最后一行
      • 3g 跳到第3行
      • / 从上往下搜索
      • ? 从下往上搜索
      • /+搜索内容 按内容查找
      • h 显示帮助文档
      • q 退出

比较当前工作目录和 Git 仓库中的快照

  • git diff 快照ID

比较暂存区与 Git 仓库中的快照

  • git diff —cached 快照ID

终极奥义图

image-20220111171122255

修改最后一次提交

  • 在实际开发中,你可能会遇到以下两种情景:

    • 情景一:版本刚一提交(commit)到仓库,突然想起漏掉两个文件还没有添加( add ) 。
    • 情景二:版本刚一提交( commit)到仓库,突然想起版本说明写得不够全面,无法彰显你本次修改的重大意义…
  • 执行带 — amend 选项的 commit 提交命令, Git 就会 “更正” 最近的一次提交 git commit —amend

删除文件后恢复

  • git checkout —文件名 恢复已删除的文件

删除文件

  • git rm 文件名
    • 删除工作区域和暂存区域的文件,也就是取消跟踪,不纳入下一个版本管理,但不能删除已经提交在 git 仓库里的文件
    • git rm -f 文件名
      • 强制删除工作区域和暂存区域所有【文件名】文件,在工作目录和暂存区的同一个文件不同内容时使用
    • git rm —cached 文件名
      • 只删除暂存区的文件
  • git reset —soft HEAD~
    • soft 修改指针

重命名文件

  • git mv 旧文件名 新文件名
    • ren/mv 旧文件名 新文件名
    • git rm 旧文件名
    • git add 新文件名

Git 分支

image-20220111190210804

创建分支

  • git branch 分支名

  • 切换分支前

    image-20220111191533654

切换分支

  • git checkout 分支名

    切换到feature分支后 image-20220111191550366

向 feature 分支添加内容后

image-20220111193039175

向 master 添加新内容后

image-20220111193407423

  • git log —oneline —graph —all
    • 以图形化显示所有分支

合并和删除分支

实际开发中的分支

image-20220111194027008

合并分支

  • git merge 分支名

删除分支

  • git branch -d 分支名
    • git branch —delete 分支名

匿名分支

checkout 命令

功能

  1. 从历史快照(或者暂存区域)中拷贝文件到工作目录 git checkout — README.md 加(—)是预防你恰好有一个 README.md 的分支,产生矛盾
  2. 切换分支 image-20220111201613854

checkout 命令与 reset 命令区别

恢复文件

checkout 命令和 reset 命令都可以用于恢复指定快照的指定文件,并且它们都不会改变 HEAD 指针的指向。

下面开始划重点∶

它们的区别是 reset 命令只将指定文件恢复到暂存区域(—mixed ),而 checkout 命令是同时覆盖暂存区域和工作目录。

注意∶也许你试图使用 git reset --hard HEAD~README.md 命令让 reset 同时覆盖工作目录,但 Git 会告诉你这是徒劳(此时 reset 不允许使用 —soft 或 —hard 选项)。

这样看来,在恢复文件方面,reset 命令要比 checkout 命令更安全一些。

恢复快照

reset 命令是用来 “ 回到过去 ” 的,根据选项的不同,reset命令将移动 HEAD 指针 ( —soft ) 覆盖暂存区域 ( —mixed,默认 ) 覆盖工作目录 ( —hard )。

checkout 命令虽说是用于切换分支,但前面你也看到了,它事实上也是通过移动 HEAD 指针和覆盖暂存区域、工作目录来实现的。

那问题来了:它们有什么区别呢?

下面开始划重点∶

第一个区别是,对于 reset --hard 命令来说,checkout 命令更安全。因为 checkout 命令在切换分支前会先检查一下当前的工作状态,如果不是 “clean” 的话,Git 不会允许你这样做;而 reset —hard 命令则是直接覆盖所有数据。

另一个区别是如何更新 HEAD 指向,reset 命令会移动 HEAD 所在分支的指向,而 checkout 命令只会移动 HEAD 自身来指向另一个分支。

指向原始笔记的链接

IDE 与编辑器

QT安装教程

本文转载自:Linux下安装QT开发环境

Linux下安装QT开发环境

零、下载安装包

从以下网址可以下载QT的所有版本:

https://download.qt.io/

这次演示安装5.9.0版本,因为是长期支持的版本,所以进入到archive/qt/5.9/5.9.0

img

这里,我们是Linux,因此选择Linux版本的安装包,点击文件名下载并保存文件。如果下载较慢建议使用迅雷等下载工具。

安装包下载地址:https://download.qt.io/archive/qt/5.9/5.9.0/qt-opensource-linux-x64-5.9.0.run

壹、安装

下载完成后打开终端,进入到下载目录,一般在 ~/下载 文件夹(输入不了中文可以用ls命令列出后复制过去)。

img

给安装包分配运行权限

命令:

chmod +x qt-opensource-linux-x64-5.9.0.run

img

运行安装程序,进入到安装界面

命令:

./qt-opensource-linux-x64-5.9.0.run

img

需要登录,可以点Skip跳过

img

选择安装组件,根据自己的需要勾选需要安装的组件,但是建议这样选择(带QT的和gcc全选)

img

之后根据向导一步一步来就能安装好了~

贰、错误解决

一般安装好之后会遇到两个问题

一个提示,执行qmake时出错

15:50:56: Could not determine which "make" command to run. Check the "make" step in the build configuration.
Error while building/deploying project planets-qml (kit: Desktop Qt 5.9.0 GCC 64bit)
 
When executing step "qmake"

另一个提示,找不到lGL

../../../../5.9/gcc_64/include/QtGui/qopengl.h:139:13: fatal error: GL/gl.h: No such file or directory
  139 | #   include <GL/gl.h>
      |             ^~~~~~~~~
compilation terminated.
make: *** [Makefile:1009: main.o] Error 1
15:55:01: 进程"/usr/bin/make"退出,退出代码 2
Error while building/deploying project planets-qml (kit: Desktop Qt 5.9.0 GCC 64bit)
When executing step "Make"

原因是没安装对应的软件。

解决第一个错误:

sudo apt install cmake g++

解决第二个错误:

sudo apt install libgl1-mesa-dev

叁、结果

执行上述操作后,能正常编译运行示例: img

肆、参考:

http://c.biancheng.net/view/3851.html

http://c.biancheng.net/view/3886.html

http://c.biancheng.net/view/3858.html

https://blog.csdn.net/aaa123524457/article/details/82668194

指向原始笔记的链接

QTCreater食用技巧

Qt Creater使用技巧

image-20220925142033220

image-20220925143842790

QT报错

0x1

/usr/bin/ld: 找不到 -lpulse-mainloop-glib ,-lpulse ,-lglib-2.0,collect2: error: ld returned 1

注意:如果QT中在proj中加了multimedia、multimediawidgets,使用了QCamera就有可能出现该错误。这是由于没有找到链接库:

解决方法: 1)在usr目录下输入命令行:

sudo find / -name libpulse.so*
 
sudo cp /usr/lib/x86_64-linux-gnu/libpulse.so.0 /usr/lib/libpulse.so
 
在lib下就出现了libpulse.so

2)在usr目录下输入命令行:

sudo find / -name libpulse-mainloop-glib.so*
 
sudo cp /usr/lib/x86_64-linux-gnu/libpulse-mainloop-glib.so.0.0.5 /usr/lib/libpulse-mainloop-glib.so
 
在lib下就出现了libpulse-mainloop-glib.so

3)在usr目录下输入命令行:

sudo find / -name libglib-2.0.so*
 
sudo cp /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 /usr/lib/libglib-2.0.so
 
在lib下就出现了libglib-2.0.so

image-20220928221619195

0x2

image-20220929094743081

[Qt【Could not parse stylesheet of object 0x7f7990 】

查找自己所写的 setstylesheet();

然后看里面的括号标点什么的有没有多余的,删除即可解决。

我的是图片路径前缺少 url,如下光标处添加 url 字符即可

image-20220929094916223

指向原始笔记的链接

typora快捷键

无序列表:输入-之后输入空格

有序列表:输入数字+“.”之后输入空格

任务列表:-[空格]空格 文字

标题:ctrl+数字

表格:ctrl+t

生成目录:[TOC]按回车

选中一整行:ctrl+l

选中单词:ctrl+d

选中相同格式的文字:ctrl+e

跳转到文章开头:ctrl+home

跳转到文章结尾:ctrl+end

搜索:ctrl+f

替换:ctrl+h

引用:输入>之后输入空格

代码块:ctrl+alt+f

加粗:ctrl+b

倾斜:ctrl+i

下划线:ctrl+u

删除线:alt+shift+5

插入图片:直接拖动到指定位置即可或者ctrl+shift+i

插入链接:ctrl+k

最近我发现了一篇超强文章:

Typora使用&Markdown基础语法

指向原始笔记的链接

Web 与建站

安装LNMP

[TOC]

开启端口

服务器:22,80,3389

LNMP 是什么?

Linux Nginx MySQL PHP

安装 LNMP

安装 screen:

yum install screen

安装时会出现提问,都填 y

接着输入:

screen -S lnmp

继续输入:

wget http://soft.vpser.net/lnmp/lnmp1.6.tar.gz -cO lnmp1.6.tar.gz && tar zxf lnmp1.6.tar.gz && cd lnmp1.6 && ./install.sh lnmp

之后会选选项,都选默认(Default)

等待安装完成后,按下Ctrl+C 退出。

image-20220722010005501

现在打开浏览器,输入[服务器地址]/p.php

image-20220722011725678

现在把你的域名解析到该服务器,以阿里云为例。

注意:这里我是为了测试主机能否启用,所以用内网ip进行解析,如果您需要外网访问,请用公网ip,百度 ‘ip’ 就能看到主机IP地址。

image-20220722010346358

接下来,在主机上绑定域名

lnmp vhost add

输入你的域名:test.rgzzplus.com

接下来是问你是否需要继续解析,不用就直接回车

然后是设置文件路径,回车默认

之后的按需选择 y/n

image-20220722011100668

现在,来到刚刚的默认文件路径

cd /home/wwwroot/test.rgzzplus.com/

ls 后发现是空文件夹,接着就是存放我们的网站文件了

我这里直接使用小甲鱼老师提供的简历网站

wget https://test-fishc.oss-cn-hangzhou.aliyuncs.com/HWC/resume.zip

下载完后,解压文件

unzip resume.zip

接下来,输入

chown www:www -R /home/wwwroot/test.rgzzplus.com/

接着就能打开浏览器,查看网站了

image-20220722011559834

img

参考资料

【后端开发】10分钟教你从0搭建一台专属“云服务器”

【技术交流】小甲鱼10分钟教你从0搭建一台服务器

指向原始笔记的链接

免费建站

[TOC]

免费建站

注册 Github 账号,并创建仓库

创建仓库(仓库名格式:账户名.github.io)

https://blog.csdn.net/weixin_43729943/article/details/103915046

添加ssh

https://blog.csdn.net/u013778905/article/details/83501204

本地nodejs,Git环境搭建

教程

https://hexoscript.gitbook.io/hexo-script/v/1.3-1/shi-yong-bu-zhou/zhun-bei-gong-ju

利用hexo搭建博客

教程

https://hexoscript.gitbook.io/hexo-script/v/1.3-1/shi-yong-bu-zhou/yi-jian-an-zhuang-hexo-bo-ke

官方文档

https://hexo.io/zh-cn/docs/

主题

挑选主题

https://hexo.io/themes/

配置主题

自行阅读主题文件夹下的 README.md文件

百度收录

https://zhuanlan.zhihu.com/p/100922816

最后

在此附上B站大佬的建站视频教程:https://www.bilibili.com/video/BV1mU4y1j72n

指向原始笔记的链接

hexo写作

[toc]

创建新文章

在命令行中输入:

hexo new [layout] <title>

如果没有设置 layout 的话,默认使用 _config.yml 中的 default_layout 参数代替。(默认在博客文件夹下的source文件夹)如果标题包含空格的话,请使用引号括起来。

参数描述
-p, --path自定义新文章的路径
-r, --replace如果存在同名文章,将其替换
-s, --slug文章的 Slug,作为新文章的文件名和发布后的 URL

创建草稿

在命令行中输入:

hexo new draft <title>

如果你从未使用过草稿功能,这条指令会自动在博客文件夹下的source文件夹内创建一个_draft文件夹,以后你创建的草稿都会被保存到这个文件夹下。同时这条指令也是创建草稿的命令。title标题如果有空格也是要用引号括起来的。

然后你就可以到_draft文件里用编辑器编辑文件。

发表草稿

在命令行中输入:

hexo publish [layout] <filename>

在编辑完文件后,就要发表文章,就是把草稿变成新文章,实际上是将草稿文件从source/_draft移动到source/_postslayout默认就是source/_postsfilename是你要发表的文件名。如果你是按照上面创建的草稿,那filename就是title

预览文章

在命令行中输入:

hexo g
hexo s

hexo ghexo generate的缩写,生成静态文件。

hexo shexo server的缩写,启动服务器。默认情况下,访问网址为: http://localhost:4000/

在将文章上传到网站前,我们要想预览一下效果,看看文章在网站上好不好看,排版是否清晰,就输入上面两条指令先进行本地渲染。然后再浏览器中输入上面的网址,就能访问本地服务器来预览网站了。

发表文章

在命令行中输入:

hexo g
hexo d

hexo dhexo deploy的缩写,部署网站,即把文章上传到网站中。

参考链接

指向原始笔记的链接

Python

python解析markdown修改时间格式

由于hugo的时间格式和之前hexo的时间格式不一样,需要修改一下,这里写一个脚本,将时间格式修改为hugo的格式,具体格式为:2024-04-22T13:30:04+08:00。脚本还有bug,但是能满足我的需求,就不继续修改了。

使用Python解析Markdown文件的frontmatter | Marvin’s Blog【程式人生】 (marvinsblog.net)

#!/usr/bin/env python3
 
import glob
import shutil
import dateutil.parser
import frontmatter
from datetime import datetime, timedelta
import pytz
 
def main():
    files = glob.glob('*.md')
    if files:
        files.remove('_index.md')
    for f in files:
        post,front_matter = read_markdown_file(f)
        date = front_matter.get('date')
        if date==None:
            print(f"{f} has no date")
            continue
        print(date)
        new_date_string = convert_date_format(date)
        front_matter['date'] = new_date_string
        save_markdown_file(f, post)
 
def read_markdown_file(md_file):
    with open(md_file, 'r', encoding='utf-8') as f:
        post = frontmatter.load(f)
        front_matter  = post.metadata #.get('date')
        return post,front_matter  
 
def convert_date_format(date_obj):
    # 添加时区信息
    # local_tz = pytz.timezone('Asia/Shanghai')  # 假设时区为Asia/Shanghai
    # date_obj_with_tz = local_tz.localize(date_obj)
    # date_obj = datetime.strptime(old_date_obj, "%Y-%m-%d %H:%M:%S")
 
    # 将 datetime 对象格式化为新的日期字符串
    new_date_string = date_obj.strftime("%Y-%m-%dT%H:%M:%S+08:00")
 
    return new_date_string
 
def save_markdown_file(md_file, post):
    with open(md_file, 'w', encoding='utf-8') as file:
        file.write(frontmatter.dumps(post))
 
if __name__ == '__main__':
    main()
指向原始笔记的链接

通用速查

正则表达式

image-20220305224352594

image-20220305224903048

匹配IP: \b((25[0-5]|2[0-4]\d|[01]?\d\d?).){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b

指向原始笔记的链接

高级搜索

高级搜索模式

  • 双引号 (” ”) 表示完全匹配。 例:搜索 “操作系统”,则会完全匹配关键字搜索。

  • * 常用的通配符可用来表示字符串。 例:搜索我的*不是梦,则会匹配出 我的未来不是梦 等结果。

  • ? 类似*,只不过它表示单个字符。 例:计算机?级考试,则会匹配出 计算机等级考试 等结果

  • 波浪号 (~) 寻找同义词,**PS:**经过我的测试,不怎么好用

  • OR 多个关键字默认为和,用 OR 可以表示或,可用 | 来代替。 例:古诗词or名人名言

  • and 关键词组合,可用 +空格 代替。 例:乔布斯+名人名言

  • not 可用 - (减号) 代替,表示不包含后面的元素,前面是空格,后面无空格。 例:搜索 JavaScript -jquery,则得到的结果中不包含jquery。

  • site: 用来搜索某个域名下的所有文件。 例:python site:www.runoob.com

  • filetype: 用于搜索特定文件格式。 例:filetype:txt 斗罗大陆

  • inurl: 用于搜索查询词出现在url中的页面,支持中文。 例:inurl:vue

  • intitle: 返回页面title中包含关键字的页面。 例:intitle:大王饶命

  • allintitle: 包含多个关键字。 例:allintitle:大王饶命 吕小鱼

  • related: 搜索相似网站。 例:related:http://www.google.com

  • define: 相当于字典,支持汉字。 例:define:引擎,**PS:**经过我的测试,不怎么好用

指向原始笔记的链接

Linux 常用(跨目录)

查看linux内核版本

 [linuxmi@linux:~/www.xxx.com]$ uname -r
 5.3.0-28-generic 
指向原始笔记的链接

查看glibc版本号

本文转载于:glibc查看版本号

glibc是标准C库的GNU实现。我们采用C/C++所写的程序,运行时基本都依赖与它。如果我们想看当前机器glibc的源代码,首先需要知道当前机器glibc的版本号,然后到glibc的官网下载对应版本的源代码。

查看当前机器glibc的版本号

第一种方法:使用命令ldd,查看可执行程序依赖libc的路径。 img 由上可知,系统采用的是libc-2.19.so的动态库,那么glibc的版本号是2.19。

第二种方法:执行libc.so查看输出的glibc编译信息,里面包含了版本号。 img

第三种方法:使用命令 ldd —version(ldd是glibc提供的命令,由此可知glibc的版本号)。 img

第四种方法:使用命令 getconf GNU_LIBC_VERSION。 img

下载glibc源代码

指向原始笔记的链接

Linux查看系统进程

本文转载于:LINUX查看进程的4种方法(小结)

进程是在 CPU 及内存中运行的程序代码,而每个进程可以创建一个或多个进程(父子进程)。

查看进程方法:

第一种:

ps aux

**ps命令用于报告当前系统的进程状态。**可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

a:显示当前终端下的所有进程信息,包括其他用户的进程。

u:使用以用户为主的格式输出进程信息。

x:显示当前用户在所有终端下的进程。

示例:

img

上图中各字段解释:

USER:启动该进程的用户账号名称 PID:该进程的ID号,在当前系统中是唯一的 %CPU:CPU占用的百分比 %MEM:内存占用的百分比

VSZ:占用虚拟内存(swap空间)的大小 RSS:占用常驻内存(物理内存)的大小

TTY:该进程在哪个终端上运行。“?”表未知或不需要终端 STAT:显示了进程当前的状态,如S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程)。对处于僵死状态的进程应予以手动终止。

START:启动该进程的时间 TIME:该进程占用CPU时间 COMMAND:启动该进程的命令的名称

总结:ps aux 是以简单列表的形式显示出进程信息。

指向原始笔记的链接

linux命令行

[toc]

apt 软件包管理服务

apt命令负责安装,更新,删除和管理基于Ubuntu和Debian的系统的软件包。

安装软件包

 
sudo apt install [package name1] [package-name2] [package-name3]

卸载软件包

这是使用apt命令从我们的系统中删除程序或服务的语法。

 
sudo apt remove [package name]

但是,即使已删除软件包,在安装的软件包中也会有一些孤立的文件。 在这种情况下,您可以使用“清除清除”选项。

 
sudo apt --purge remove [package-name]

自动删除孤立的软件包

删除软件包时,仅删除关键的依赖项。 其余的留在我们的系统中

 
sudo apt autoremove

上面的命令将从系统中卸载所有孤立的软件包。 这包括已安装为依赖项且不再需要的任何软件包。

更新APT存储库

 
sudo apt update

它检查在线存储库,并将所有更新的软件包下载到本地存储库。

升级系统软件包

 
sudo apt upgrade

这将扫描系统上所有已安装的软件包,并找到在旧版本上运行的程序或服务。 接下来,它将所有此类程序和服务升级到最新的可用版本。

这是必不可少的命令,因为它使您可以使用单个命令来启动系统范围的升级。

但是上面的命令只会升级非关键软件包。 如果有可用的内核更新,则需要使用以下命令执行完整的系统升级:

 
sudo apt full-upgrade

上面的命令将升级Linux内核以及所有未使用先前命令升级的系统关键软件包。 全面升级后,通常需要重新启动,以便启动新内核。

搜索包

apt search命令是用于在Ubuntu上搜索软件包的最常用命令。 它旨在搜索包名称及其元数据,例如描述,依赖项,源和版本。

该命令返回名称或元数据与指定搜索关键字匹配的所有软件包。 以下是使用apt search命令搜索软件包的语法。

sudo apt search [keyword]

探索 Linux 系统

选项与参数

大多数命令格式:

command -options arguments

-options

  • -l 用于产生长格式的输出结果
  • -t 用于按修改时间顺序对输出结果排序
  • —reverse 以降序排列输出结果

显示当前工作目录名称

pwd

更改当前工作目录

cd [绝对路径/相对路径]

cd便捷写法

列出目录内容

ls

ls 命令选项

ls 命令选项

进一步了解长格式

ls -l 后的输出

ls -l 后的输出

不同字段的含义:

不同字段的含义

使用 file 命令确定文件类型

file filename

使用 less 命令查看文本文件

less 命令进入文本后常用命令

less

复制粘贴技巧

使用鼠标,双击可以复制文件名,单击中键可以将其粘贴到命令中。

系统目录

IMG_20220331_191837_edit_461000882512987

符号链接

image-20220331201930857

第一个字母是 L ,表示一种特殊的文件叫符号链接(也叫软链接),在Unix中,一个文件可以被多个名称引用。

操作文件和目录

通配符

通配符,帮助快速指定一组文件名。

通配符及其含义

常用字符类

通配符示例

mkdir---创建目录

mkdir directory...

cp---复制文件和目录

将单个文件或目录 item1 复制到文件或目录 item2

cp item1 item2

将多个文件或目录 item 复制到目录 directoty 中

cp item... directory

有用的选项和示例

cp命令常用选项

cp命令示例

mv---移动和重命名文件

将文件或目录 item1 移动或重命名为 item2

mv item1 item2

将一个或多个 item 从一个目录移动到另一个目录

mv item... directory

mv命令选项

mv命令示例

未完待续。。。

参考:《linux命令行大全》 第二版

指向原始笔记的链接

linux指令

[toc]

Linux 命令

名字语法用法全称或备注
.当前目录
..上级目录
~用户主目录普通用户的主目录为/home;
超级用户的主目录为/root
-前一个工作目录
/表示根目录
cdcd [相对路径或绝对路径]切换到目标工作目录change directory
pwdpwd查看或打印当前目录print working directory
typetype [命令名]用来显示指定命令类型
lsls显示当前目录下的文件
llll显示当前目录下文件详细信息ls -l —color=auto
ll -all -a显示当前目录下文件及隐藏文件详细信息
mkdirmkdir -p a/b/c/d/e/f 会自动创建文件父目录
mkdir -p lucky/{1234}ls 一次可以创建多个子目录
创建文件目录make directory
rmrm -rf [目录名]删除文件夹,强制删除remove
rmdirrmdir [目录名]删除文件目录,要求该文件夹是空文件夹remove directory
cpcp [选项] 源路径 存放路径
cp 源路径 存放路径
拷贝文件到文件夹,复制copy
*shiren*所有以’shiren’开头的文件夹
mvmv 源路径 存放路径1、移动文件到文件夹,剪切
2、修改文件名字
move
touchtouch 文件名如果没有该文件,则创建新文件;如果有该文件,则修改该文件的三个时间
stat文件属性state
catcat 文件名正序查看文件内容
tactac 文件名倒序查看文件内容
moremore 文件名分页查看文件内容敲回车,一行行显示后续内容;敲 ‘b’ 返回上一行;敲空格,一页页显示后续内容;敲 ‘h’ 显示帮助,更多指令
lessless 文件名与more功能基本一样,区别是less的操作命令更多
headhead -10 文件名查看文件前10行
tailtail -10 文件名
tail -f 文件名
tail -F文件名
查看文件后10行
监控文件变化,按Inode查找
监控文件变化,按文件名查找
| 竖杠head -8 文件名 | tail -1’|’ 将前面查询结果传递给后面,只查询第8行
findfind / -name 文件名在 / 内查找叫[文件名]的文件
echo
lnln -s 目标文件名 链接文件名 |创建软链接,类似指针
ln 目标文件名 链接文件名 |创建硬链接,类似取别名
创建文件链接
ip addrip addrip查询

终端相关

  • 快捷键 Ctrl+Alt+T:桌面打开终端
  • exit 或 快捷键 Ctrl+D:结束终端会话

时间相关

  • date:显示当前时间和日期
  • cal:默认显示当前月份的日历

磁盘相关

  • df:查看磁盘的当前可用空间
  • free:查看内存容量

文件相关

  • pwd:输出当前的工作目录名称,【print working directory】
  • ls:列出目录内容
  • cd:修改目录

tips:

焦点跟随鼠标 $ 代表普通用户; # 代表超级用户

linux命令 ll信息详解

参考文章

image-20220106143643107

第一列:文件类型

’-’ 普通文件

‘d’ 文件夹、目录

‘l’ 链接文件,类似于windows的快捷方式

‘p’ 管理文件

‘b’ 块设备文件

‘c’ 字符设备文件

‘s’ 套接字文件

后列:文件属性

r(Read,读取权限):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。 w(Write,写入权限):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。 x(execute,执行权限):对文件而言,具有执行文件的权限;对目录来说,该用户具有进入目录的权限。 另外,这里还有2个很特殊的属性,平时不怎么常见,这里也顺带解释一下:

s或S(SUID,Set UID):可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。 t或T(Sticky):/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。 综合起来可得,对于back_init文件,其创建者/所有者具有可读可写可执行的权限,其创建者/所有者所在的组的其他用户具有可读可写可执行的权限,其他组的其他用户则具有可读可执行但不可写的权限。

type详解

参考文章

一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法。

  1. 判断一个名字当前是否是alias、keyword、function、builtin、file或者什么都不是:

    type ls 的输出是 ls 是 ‘ls —color=auto’ 的别名

    type if 的输出是 if 是 shell 关键字

    type type 的输出是 type 是 shell 内嵌

    type frydsh 的输出是 bash: type: frydsh: 未找到

  2. 判断一个名字当前是否是alias、keyword、function、builtin、file或者什么都不是的另一种方法(适用于脚本编程):

    type -t ls 的输出是 alias

    type -t if 的输出是 keyword

    type -t type 的输出是 builtin

    type -t gedit 的输出是 file

    type -t frydsh 没有输出

  3. 显示一个名字的所有可能:

    type -a kill 的输出是 kill 是 shell 内嵌 和 kill 是 /bin/kill

    type -at kill 的输出是 builtin 和 file

  4. 查看一个命令的执行路径(如果它是外部命令的话):

    type -p gedit 的输出是 /usr/bin/gedit

    type -p kill 没有输出(因为kill是内置命令)

  5. 强制搜索外部命令:

    type -P kill 的输出是 /bin/kill

cp命令相关选项

参考文章

cp命令的各选项含义如下:

- a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。

- d 拷贝时保留链接。

- f 删除已经存在的目标文件而不提示。

- i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。

- p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。

- r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。

- l 不作拷贝,只是链接文件。

需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项。

例子: Cp -i file1 file2 (将文档 file1 复制成 file2 . –i为提示确认。)

cp file1 dir1 将文档 file1 复制到目录 dir1 下,文件名仍为 file1.

cp /tmp/file1 . 将目录 /tmp 下的文档 file1复制到现行目录下,档名仍为 file1.

cp /tmp/file1 file2 将目录 /tmp 下的文档 file1现行目录下,档名为file2

cp -r dir1 dir2 (recursive copy) 复制整个目录.若目录 dir2 不存在,则将目录dir1,及其所有文档和子目录,复制到目录 dir2 下,新目录名称为dir1.若目录dir2不存在,则将dir1,及其所有文档和子目录,复制为目录 dir2.

stat 文件属性详解

File:文件名

Size:大小

Blocks:块

IO Block:分配(一般为 4k=4096 )

Device:存放在硬盘区位置

Inode:文件绝对位置

Links:静态硬连接数量

Access:文件权限

Uid:所属用户

Gid:所属组

Access:访问文件时间

Modify:文件内容发生变化时间

Change:文件权限改变时间

ln 创建文件详解

image-20220107192816485

ln -s 目标文件名 链接文件名 |创建软链接,形式是 ‘l’ 链接,链接文件 Inode 属性不同,类似于指针
ln 目标文件名 链接文件名 |创建硬链接,形式是 ’-’ 文件,链接文件 Inode 属性相同,类似于别名

VI 和 VIM 编辑器

image-20220107200548033

指向原始笔记的链接

Linux二级目录

Linux二级目录

  • /bin 存放二进制可执行文件,‘binary’ 二进制
  • /sbin 存放超级管理员可执行的一些权限和命令,‘system binary’
  • /boot 存放Linux系统启动的文件,启动配置以及内核的镜像 ‘boot’ 引导
  • /dev 存放系统下的所有设备文件,‘device’ 设备
  • /etc 存放系统配置文件,意思是等等,etc来源见文末
  • /home 普通用户家目录 类似 windows 的 c:user 目录
  • /lib 存放系统使用函数库的目录,‘library’ 图书馆,库
  • /media 软盘或者光盘等的挂载点,‘media’ 媒体,介质
  • /mnt 硬盘默认挂载目录,‘mount’ 嵌入
  • /opt 自定义(第三方)软件安装位置,‘optional’ 可选择
  • /proc 一个虚拟的文件系统(只存在内存中,不是实际贮存在磁盘上的),包括被某些程序使用的系统信息,‘process’ 进程
  • /root 超级用户家目录,‘root’ 根,(注:它不是系统的根”/” )
  • /run 运行时的一些临时文件,‘run’ 运行
  • /srv 存放服务启动后所需数据,‘service’ 服务
  • /sys 存放系统内核信息文件,‘system’ 系统
  • /tmp 系统临时文件目录,重启清除,‘temporary’ 临时的
  • /usr 操作系统软件资源所放置的目录,即系统默认软件放置位置,‘Unix Software Resource’
  • /var 系统产生经常变化的文件目录,‘variable’ 可变的

etc来源”: etc不是什么缩写,是and so on的意思,来源于法语的 et cetera 翻译成中文就是 等等 的意思. 至于为什么在/etc下面存放配置文件, 按照原始的UNIX的说法 ( Linux文件结构参考UNIX的教学实现MINIX ) 这下面放的都是一堆零零碎碎的东西, 就叫etc, 这其实是个历史遗留.这个是来源于拉丁语全称etcetera. n.等等之人(或物),附加的人(或物);加s:附加(或额外)的项目;零星杂物。或者分开的et cetera, adv. 等等,以及其他等等(略作etc.或&c.)但得注意,人名后不宜用,要用and others。这个目录在LINUX里很重要哦,里面装的都是些杂七杂八的配置文件。

指向原始笔记的链接

使用linux时的问题总结

[TOC]

vim /etc 写入时 出现 E121:无法打开并写入文件

解决方案:

  1. 保存的时候用:w !sudo tee %
  2. 输入密码,即可

安装中文输入法

安装步骤

1.更新源文件,使用的是阿里云源

打开sources.list文件

leafpad /etc/apt/sources.list

复制源地址到文本中

deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib

更新安装源

apt-get update

2.下载IBus完后重启系统

apt-get install ibus
apt-get install ibus-pinyin
reboot //重启

3.IBus配置 鼠标右键选择设置(setting)>区域和语言(Region&Language),在输入源中添加汉语(PinYin),可通过搜索PinYin找到。

Linux 编程

gcc 多线程编译失败

image-20220403144624296

今天写一个线程的程序,已经在c文件中包含了线程的头文件<pthread.h>,可是编译的时候却报错“对pthread_create未定义的引用“,原来时因为 pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:gcc createThread.c -lpthread -o createThread. 加上这个以后编译成功!

image-20220403144755741

image-20220403152451357

{//线程创建相关函数
 
pthread_t tid;   //创建线程 ID
 
pthread_create(&tid, NULL,  threadFunc, NULL);
/*
    线程创建函数,参数列表:
    1.  线程 ID 地址
    2.  线程 属性
    3.  线程 函数地址
    4.  线程 传递给线程函数的参数
*/
 
pthread_join(tid, NULL);   //等待指定的线程结束
 
}
#include<time.h>
{//统计程序运行时间
 
	clock_t start,delta;
	double time_used;	//程序开头加上这两行代码
 
	/*
		程序变量在这里定义
	*/
 
	start = clock();
 
	/*
		程序执行代码放在这里
	*/
 
	delta = clock() - start;
	printf("The time taken in total : %lf seconds\n",(double)delta/CLOCKS_PER_SEC);	 //程序末尾输出运行时间
 
	return 0;
}
 
//统计程序时间,除了在代码中统计外,还能再运行程序前加上 [time ./程序名] ,让系统去统计

互斥锁

image-20220404145450778

信号量

image-20220404195520172

image-20220405143220745

image-20220405143628664

参考:《操作系统原理及Linux实践》

指向原始笔记的链接

ubuntu 20.04突然无法联网

解决方法:

terminal 下执行如下指令:

ping www.baidu.com sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start

ping www.baidu.com

之后显示下图表示连接成功。按 Ctrl+C 即可停止。

ping后

指向原始笔记的链接

ubuntu命令行编C语言

首先在文本编辑器中编写C代码,并将名字保存为hello.c

hello.c

terminal中打开Documents(因为我的hello.c保存在Documents中)

terminal中输入:cc hello.c 编译hello.c

执行文件 :./a.out (在Documents中生成可执行文件,同时也会输出)

terminal

详情链接

指向原始笔记的链接

ubuntu虚拟机磁盘拓展

今天,我在 VMware 上使用 ubuntu 虚拟机时碰到了一个很棘手的问题---磁盘空间不够用了,我想很多使用 ubuntu 的小伙伴或多或少都会碰到这种情况。

然而,我搜遍了 CSDN 和百度却没有找到答案,让我很是苦恼,最终还是在B站上发现了大佬的视频,帮我解决了磁盘拓展问题。感谢迪迪亚与前端与Linux大佬。

磁盘拓展视频链接

指向原始笔记的链接