这里汇总不适合作为长文博文的“教程 + 速查”,覆盖常用工具、安装配置与故障处理: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与多彩显示
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) endThen, 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远程调试
参考:
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的相对路径。
\3. 此时,下关键函数下好断点后,即可进行动态调试,如下图:
常用快捷键包括:
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 stopubuntu或者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 是将每个版本独立保存
工作区域、暂存区域和 Git 仓库
工作区(WORKING DIRECTORY): 直接编辑文件的地方,肉眼可见直接操作;
暂存区(STAGIN AREA):数据(快照)暂时存放的地方;
**版本库(GIT DIRECTORT(RESPOSITORY)):**存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程git仓库了。
Git 工作流程
Git的工作流程一般是酱紫:
在工作目录中添加、修改文件
将需要进行版本管理的文件放入暂存区域
将暂存区域的文件提交到Git仓库
Git管理的文件有三种状态:
- 已修改(modified)
- 已暂存(staged)
- 已提交(committed)
实战
将工作目录的文件放到Git仓库只需要两步:
- git add 文件名 //添加文件
- git commit -m “你干了啥” //提交并注释
其它命令
- git status //查看状态
- git log //查看历史提交的最终版本,即 commit实体
- reset //撤回提交,即将最后一次存放到Git仓库里的文件撤回到暂存区
- checkout //从历史快照(或者暂存区域)中拷贝文件到工作目录
几个命令的功能
- 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 命令回滚快照三部曲
- 移动 HEAD 的指向(—soft)
- 将快照回滚到暂存区域([—mixed],默认)
- 将暂存区域还原到工作目录(—hard)
回滚个别文件
- git reset 版本快照 文件名/路径
- HEAD 指针不会移动,回滚
- git reset 版本快照的 ID 号
- 前滚
比较
比较暂存区域与工作目录
git diff //比较差异
第二行
比较暂存区域和工作目录下的 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
终极奥义图
修改最后一次提交
在实际开发中,你可能会遇到以下两种情景:
- 情景一:版本刚一提交(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 分支
创建分支
git branch 分支名
切换分支前
切换分支
git checkout 分支名
切换到feature分支后
向 feature 分支添加内容后
向 master 添加新内容后
- git log —oneline —graph —all
- 以图形化显示所有分支
合并和删除分支
实际开发中的分支
合并分支
- git merge 分支名
删除分支
- git branch -d 分支名
- git branch —delete 分支名
匿名分支
checkout 命令
功能
- 从历史快照(或者暂存区域)中拷贝文件到工作目录 git checkout — README.md 加(—)是预防你恰好有一个 README.md 的分支,产生矛盾
- 切换分支
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的所有版本:
这次演示安装5.9.0版本,因为是长期支持的版本,所以进入到archive/qt/5.9/5.9.0
这里,我们是Linux,因此选择Linux版本的安装包,点击文件名下载并保存文件。如果下载较慢建议使用迅雷等下载工具。
安装包下载地址:https://download.qt.io/archive/qt/5.9/5.9.0/qt-opensource-linux-x64-5.9.0.run
壹、安装
下载完成后打开终端,进入到下载目录,一般在 ~/下载 文件夹(输入不了中文可以用ls命令列出后复制过去)。
给安装包分配运行权限
命令:
chmod +x qt-opensource-linux-x64-5.9.0.run
运行安装程序,进入到安装界面
命令:
./qt-opensource-linux-x64-5.9.0.run
需要登录,可以点Skip跳过
选择安装组件,根据自己的需要勾选需要安装的组件,但是建议这样选择(带QT的和gcc全选)
之后根据向导一步一步来就能安装好了~
贰、错误解决
一般安装好之后会遇到两个问题
一个提示,执行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叁、结果
执行上述操作后,能正常编译运行示例:
肆、参考:
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使用技巧
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.so2)在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.so3)在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
0x2
[Qt【Could not parse stylesheet of object 0x7f7990 】
查找自己所写的 setstylesheet();
然后看里面的括号标点什么的有没有多余的,删除即可解决。
我的是图片路径前缺少 url,如下光标处添加 url 字符即可
指向原始笔记的链接
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
最近我发现了一篇超强文章:
指向原始笔记的链接
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 退出。
现在打开浏览器,输入[服务器地址]/p.php
现在把你的域名解析到该服务器,以阿里云为例。
注意:这里我是为了测试主机能否启用,所以用内网ip进行解析,如果您需要外网访问,请用公网ip,百度 ‘ip’ 就能看到主机IP地址。
接下来,在主机上绑定域名
lnmp vhost add输入你的域名:test.rgzzplus.com
接下来是问你是否需要继续解析,不用就直接回车
然后是设置文件路径,回车默认
之后的按需选择 y/n
现在,来到刚刚的默认文件路径
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/接着就能打开浏览器,查看网站了
指向原始笔记的链接参考资料
免费建站
[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
官方文档
主题
挑选主题
配置主题
自行阅读主题文件夹下的 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/_posts。layout默认就是source/_posts,filename是你要发表的文件名。如果你是按照上面创建的草稿,那filename就是title。预览文章
在命令行中输入:
hexo g hexo s
hexo g是hexo generate的缩写,生成静态文件。
hexo s是hexo server的缩写,启动服务器。默认情况下,访问网址为:http://localhost:4000/在将文章上传到网站前,我们要想预览一下效果,看看文章在网站上好不好看,排版是否清晰,就输入上面两条指令先进行本地渲染。然后再浏览器中输入上面的网址,就能访问本地服务器来预览网站了。
发表文章
在命令行中输入:
hexo g hexo d
hexo d是hexo 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()
通用速查
正则表达式
指向原始笔记的链接匹配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的路径。
由上可知,系统采用的是libc-2.19.so的动态库,那么glibc的版本号是2.19。
第二种方法:执行libc.so查看输出的glibc编译信息,里面包含了版本号。
第三种方法:使用命令 ldd —version(ldd是glibc提供的命令,由此可知glibc的版本号)。
第四种方法:使用命令 getconf GNU_LIBC_VERSION。
指向原始笔记的链接下载glibc源代码
- glibc官网地址:https://www.gnu.org/software/libc/
- glibc源代码包:https://ftp.gnu.org/gnu/glibc/
Linux查看系统进程
本文转载于:LINUX查看进程的4种方法(小结)
进程是在 CPU 及内存中运行的程序代码,而每个进程可以创建一个或多个进程(父子进程)。
查看进程方法:
第一种:
ps aux**ps命令用于报告当前系统的进程状态。**可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。
a:显示当前终端下的所有进程信息,包括其他用户的进程。
u:使用以用户为主的格式输出进程信息。
x:显示当前用户在所有终端下的进程。
示例:
上图中各字段解释:
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 [绝对路径/相对路径]
列出目录内容
lsls 命令选项
进一步了解长格式
ls -l 后的输出
不同字段的含义:
使用 file 命令确定文件类型
file filename使用 less 命令查看文本文件
less 命令进入文本后常用命令
复制粘贴技巧
使用鼠标,双击可以复制文件名,单击中键可以将其粘贴到命令中。
符号链接
第一个字母是 L ,表示一种特殊的文件叫符号链接(也叫软链接),在Unix中,一个文件可以被多个名称引用。
操作文件和目录
通配符
通配符,帮助快速指定一组文件名。
mkdir---创建目录
mkdir directory...cp---复制文件和目录
将单个文件或目录 item1 复制到文件或目录 item2
cp item1 item2将多个文件或目录 item 复制到目录 directoty 中
cp item... directory有用的选项和示例
mv---移动和重命名文件
将文件或目录 item1 移动或重命名为 item2
mv item1 item2将一个或多个 item 从一个目录移动到另一个目录
mv item... directory
未完待续。。。
指向原始笔记的链接参考:《linux命令行大全》 第二版
linux指令
[toc]
Linux 命令
名字 语法 用法 全称或备注 . 当前目录 .. 上级目录 ~ 用户主目录 普通用户的主目录为/home;
超级用户的主目录为/root- 前一个工作目录 / 表示根目录 cd cd [相对路径或绝对路径] 切换到目标工作目录 change directory pwd pwd 查看或打印当前目录 print working directory type type [命令名] 用来显示指定命令类型 ls ls 显示当前目录下的文件 ll ll 显示当前目录下文件详细信息 ls -l —color=auto ll -a ll -a 显示当前目录下文件及隐藏文件详细信息 mkdir mkdir -p a/b/c/d/e/f 会自动创建文件父目录
mkdir -p lucky/{1234}ls 一次可以创建多个子目录创建文件目录 make directory rm rm -rf [目录名] 删除文件夹,强制删除 remove rmdir rmdir [目录名] 删除文件目录,要求该文件夹是空文件夹 remove directory cp cp [选项] 源路径 存放路径
cp 源路径 存放路径拷贝文件到文件夹,复制 copy * shiren* 所有以’shiren’开头的文件夹 mv mv 源路径 存放路径 1、移动文件到文件夹,剪切
2、修改文件名字move touch touch 文件名 如果没有该文件,则创建新文件;如果有该文件,则修改该文件的三个时间 stat 文件属性 state cat cat 文件名 正序查看文件内容 tac tac 文件名 倒序查看文件内容 more more 文件名 分页查看文件内容 敲回车,一行行显示后续内容;敲 ‘b’ 返回上一行;敲空格,一页页显示后续内容;敲 ‘h’ 显示帮助,更多指令 less less 文件名 与more功能基本一样,区别是less的操作命令更多 head head -10 文件名 查看文件前10行 tail tail -10 文件名
tail -f 文件名
tail -F文件名查看文件后10行
监控文件变化,按Inode查找
监控文件变化,按文件名查找| 竖杠 head -8 文件名 | tail -1 ’|’ 将前面查询结果传递给后面,只查询第8行 find find / -name 文件名 在 / 内查找叫[文件名]的文件 echo ln ln -s 目标文件名 链接文件名 |创建软链接,类似指针
ln 目标文件名 链接文件名 |创建硬链接,类似取别名创建文件链接 ip addr ip addr ip查询 终端相关
- 快捷键 Ctrl+Alt+T:桌面打开终端
- exit 或 快捷键 Ctrl+D:结束终端会话
时间相关
- date:显示当前时间和日期
- cal:默认显示当前月份的日历
磁盘相关
- df:查看磁盘的当前可用空间
- free:查看内存容量
文件相关
- pwd:输出当前的工作目录名称,【print working directory】
- ls:列出目录内容
- cd:修改目录
tips:
焦点跟随鼠标 $ 代表普通用户; # 代表超级用户
linux命令 ll信息详解
第一列:文件类型
’-’ 普通文件
‘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命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法。
判断一个名字当前是否是alias、keyword、function、builtin、file或者什么都不是:
type ls 的输出是 ls 是 ‘ls —color=auto’ 的别名
type if 的输出是 if 是 shell 关键字
type type 的输出是 type 是 shell 内嵌
type frydsh 的输出是 bash: type: frydsh: 未找到
判断一个名字当前是否是alias、keyword、function、builtin、file或者什么都不是的另一种方法(适用于脚本编程):
type -t ls 的输出是 alias
type -t if 的输出是 keyword
type -t type 的输出是 builtin
type -t gedit 的输出是 file
type -t frydsh 没有输出
显示一个名字的所有可能:
type -a kill 的输出是 kill 是 shell 内嵌 和 kill 是 /bin/kill
type -at kill 的输出是 builtin 和 file
查看一个命令的执行路径(如果它是外部命令的话):
type -p gedit 的输出是 /usr/bin/gedit
type -p kill 没有输出(因为kill是内置命令)
强制搜索外部命令:
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 创建文件详解
ln -s 目标文件名 链接文件名 |创建软链接,形式是 ‘l’ 链接,链接文件 Inode 属性不同,类似于指针
ln 目标文件名 链接文件名 |创建硬链接,形式是 ’-’ 文件,链接文件 Inode 属性相同,类似于别名VI 和 VIM 编辑器
指向原始笔记的链接
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:无法打开并写入文件
解决方案:
- 保存的时候用:w !sudo tee %
- 输入密码,即可
安装中文输入法
安装步骤
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 update2.下载IBus完后重启系统
apt-get install ibus apt-get install ibus-pinyin reboot //重启3.IBus配置 鼠标右键选择设置(setting)>区域和语言(Region&Language),在输入源中添加汉语(PinYin),可通过搜索PinYin找到。
Linux 编程
gcc 多线程编译失败
今天写一个线程的程序,已经在c文件中包含了线程的头文件<pthread.h>,可是编译的时候却报错“对pthread_create未定义的引用“,原来时因为 pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:gcc createThread.c -lpthread -o createThread. 加上这个以后编译成功!
{//线程创建相关函数 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 ./程序名] ,让系统去统计互斥锁
信号量
指向原始笔记的链接
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即可停止。指向原始笔记的链接
ubuntu命令行编C语言
首先在文本编辑器中编写C代码,并将名字保存为hello.c
在
terminal中打开Documents(因为我的hello.c保存在Documents中)
terminal中输入:cc hello.c编译hello.c执行文件 :
./a.out(在Documents中生成可执行文件,同时也会输出)指向原始笔记的链接
ubuntu虚拟机磁盘拓展
今天,我在 VMware 上使用 ubuntu 虚拟机时碰到了一个很棘手的问题---磁盘空间不够用了,我想很多使用 ubuntu 的小伙伴或多或少都会碰到这种情况。
然而,我搜遍了 CSDN 和百度却没有找到答案,让我很是苦恼,最终还是在B站上发现了大佬的视频,帮我解决了磁盘拓展问题。感谢迪迪亚与前端与Linux大佬。
指向原始笔记的链接





































由上可知,系统采用的是libc-2.19.so的动态库,那么glibc的版本号是2.19。






























