命令行工具整理

名称

作用

mosh

UDP 控制的、可自动重连的 ssh 客户端

rigrep

更简单的 grep

fd

更简单的 find

fzf

模糊搜索工具

mycli

带补全功能的 mysql 客户端

jq

json cli 工具

axel

多线程下载

htop

监控工具

tmux

终端复用工具

cppman

c++ 手册查询工具

tldr

以用例为主的manpage

figlet

生成 ASCII 字符画

powertop

查看电源信息

ImageMagick

为图片添加带下划线的字体 :

convert -pointsize 20 -fill Red -draw "decorate UnderLine text 145,190 '20µm'" in.png out.png

in.png 和 out.png 可同名

Pandoc

指定输出格式

对于某些格式而言,其可能具有多种变体(比如 MarkDown ),我们可以使用 -t 选项指定某一种变体以获得更好的观感:

例如对于 rst 而言,其默认的 markdown 就会出现明显的格式错误,这时我们可以使用 gfm 变体:

pandoc 1.rst -t gfm -o 1.md

对于 markdown 而言,其变体有:

变体

变体说明

commonmark

CommonMark

commonmark_x

CommonMark Markdown with extensions

gfm

Github Flavored Markdown

markdown (默认)

Pandoc’s Markdown

markdown_mmd

MultiMarkdown

markdown_phpextra

PHP Markdown Extra

markdown_strict

原始无拓展的 Markdown

一般而言, 对于 Python 工具链而言, CommonMark 是支持最广泛的语法,但是对于各种应用软件而言,GFM 已经成为事实上的标准。

另外一个问题是 pandoc 可能会添加一些格外的换行。可以通过 --warp=none 删除。

wget

批量下载文件

情形如下:[1]

  • 需要下载指定网页内的资源

  • 需要将网页下载到指定文件夹

代码:

wget -r -l1 -nd -A"zip,pdf,mdd" url

上述代码的意思为:

  • -r -l1 :递归下载网页,递归层数为 1

  • -nd :不创建文件夹

  • -A"zip,pdf,mdd" :只下载 zip、pdf、mdd 文件

html 文件是肯定需要下载的。但是如果不需要的话会保存为 html.tmp 文件。在不需要 html 文件时其会被删除。

Proton

要执行 Proton,需要两个关键的环境变量:

  • STEAM_COMPAT_CLIENT_INSTALL_PATH 指向 steam 配置路径,一般为 ${HOME}/.steam/steam

  • STEAM_COMPAT_DATA_PATH 指向游戏的 Proton 路径,一般为 …​/SteamLibrary/steamapps/compatdata/${APPID}

其中,如果路径 STEAM_COMPAT_DATA_PATH 不存在,需要自行创建

这样,一个 Proton 的运行形式为 xxxx/proton command ,可用的命令为:

  • run: 运行 Proton,如果 STEAM_COMPAT_DATA_PATH 是空路径,则自动创建 WINE_PREFIX

  • runinprefix: 在 STEAM_COMPAT_DATA_PATH/pfx 中运行 wine。后面直接跟 wine 的命令

ffmpeg 使用

常见参数

  • -i : 后接文件名

  • -s :指定分辨率

  • -r :指定帧率

  • -b :指定比特率

  • -ac :指定声道数

  • -ar :指定采样率。一般有 11025、22050、24000、44100、48000 五个等级

  • -b:a :audio 比特率

  • -ss :开始时间

  • -codec copy :指定编码方式

由于 ffmpeg 使用了关键帧技术加速转换,在剪切视频时时间可能不对,这时可以使用 ffmpeg -i video.mp4 -ss 134.0 而不是 ffmepg -ss 134.0 -i video.mp4

去除视频中的声音:-vcode copy -an

GDB

GDB 调试器的使用

前提需求

  • 如果是使用 GCC 编译程序的时候,需要使用 -ggdb3 -Wall 参数

  • 如果是使用 CMake,则 CMAKE_BUILD_TYPE 需要设置为Debug/RelWithDebInfo

另外,调试时如果用到了动态库,gdb 会自动下载动态库的 debuginfo。对于 Fedora 而言,还可以使用 dnf debuginfo-install 手动安装。包名与提供动态库的包名相同

设置断点

gdb 通过 breakpoint 进行打断点,此指令的简写形式为 break、b。命令格式为 :

break location
break location if cond

其中 location 的值为:

location

含义

行号

入口函数所在文件的行号

文件名:行号

指定文件的行号

函数名

在函数内部的第一行代码暂停

文件名:函数名

在执行指定文件的指定函数时暂停

此外,上述所有 location 都可以接 location offset 的形式进行偏移。offset 可为正负,单位为行

命令

做用

d [n]

删除所有断点或者删除 n 号断点

clear [行号]

删除指定行断点

disable

禁用断点

enable

启用断点

info breakpoints

查看断点

运行代码

执行有两种方式:

命令

作用

run

直接运行到断点

start

在 main() 处中断

next

Step Over

step

Step Into

cont

执行到下一个断点

查看运行时信息

bt

显示栈帧

bt full

显示局部变量

print/p

计算并打印表达式的结果

display

跟踪表达式的结果

info reg

查看寄存器内容

watch

表达式变化时暂停

awatch

表达式 rw 时暂停

rwatch

表达式 r 时暂停

step

修改变量的值

多线程如何调试?

线程里直接加个 while(true) 等线程开始后 attach 进去,然后手动退出循环

进程调试

命令

作用

info proc

查看进程信息

set follow-fork-mode parent/child

fork 后跟踪 parent/child 的代码

set detach-on-fork off

fork后暂停 parent 的代码

catch exec

在 fork/exec 函数后面打断点

GDB 脚本

将 gdb 调试过程写入一个文件中,就成为了一个 gdb 脚本。此脚本可在启动时通过参数 -x 引入,以自动完成某些工作。例如:

b threadpool.cpp:8
run
b if terminate_ == true
c

然后通过命令 gdb ./build/Debug/threadpool_test -x ./debug.gdb 启动命令即可

调试 Core 文件

首先拷贝并解压 Core 文件 :

cp /var/lib/systemd/coredump/core.test_threadpool.zst .
extract core.test_threadpool.zst

然后使用 gdb ./build/Debug/threadpool_test core.test_threadpool 开始调试。之后可以通过 bt 查看栈帧

跟踪过程调用

有三个相关工具:strace, ltrace 和 ftrace 分别用于跟踪系统调用、用户态程序调用和所有函数调用

多线程调试

多线程情况下崩溃有以下几种原因:

  • 对失效的锁(对象失效)调用了 lock

  • 加锁解锁顺序不对

  • 加锁解锁不在同一线程中

  • 对无锁的锁尝试解锁

动态库调试

动态库的调试与普通二进制文件的调试差不多,在加载可执行文件后,直接通过 breakpoint function_name 打断点,之后出现的提示选 y,正常执行即可

信号

信号使用 handle 指令。格式为:

handle signal mode

其中 signale 为:

all
SIGINT
...

mode 为:

mode作用

nostop

当信号发生时,GDB 不会暂停程序,其可以继续执行,但会打印出一条提示信息,告诉我们信号已经发生;

stop

当信号发生时,GDB 会暂停程序执行。

noprint

当信号发生时,GDB 不会打印出任何提示信息;

print

当信号发生时,GDB 会打印出必要的提示信息;

nopass(或者 ignore)

GDB 捕获目标信号的同时,不允许程序自行处理该信号;

pass(或者 noignore)

GDB 调试在捕获目标信号的同时,也允许程序自动处理该信号。

tmux

tmux 是终端复用器。可以在断开与服务器的连接后依然执行任务

tmux 依赖于一系列快捷键,其默认前缀键是 Ctrl+b

tmux 的基本配置

下面是我的 tmux 的配置。配置文件位于 ~/.tmux.conf :

# 真彩色
set -g default-terminal "screen-256color"
set-option -ga terminal-overrides ",*256col*:Tc"

set-option -g mouse on

unbind "Enter"
bind Enter splitw -h -c '#{pane_current_path}'

unbind "n"
bind n splitw -v -c '#{pane_current_path}'

unbind "k"
bind k kill-session

快捷键

下面是一些常用快捷键:

会话类:

快捷键

作用

Leader+s

在会话之间进行转换

Leader+d

与当前会话分离

Leader+k

杀死当前会话

在退出 tmux 后,可以使用 tmux a attach 到退出前的会话上

窗口类:

快捷键

作用

Leader+c

创建新窗口

Leader+n

切换到下一个窗口

Leader+w

在窗口之间进行转换

面板类:

快捷键

作用

Leader+%

左右分隔面板

Leader+"

上下分隔面板

Leader+z

当前窗格全屏现实,再按一次恢复

Leader+o

切换到下一个窗格

去除 <200b>

sed 's/\xe2\x80\x8b//g' inputfile

keepalived

keepalived 是高可用方案。最常见的使用场景是主从备份,当主机挂掉时让备份机自动顶替。但是在使用时有几点需要注意:

  • 同一个局域网内的多台主机可以拥有同一个 VIP

  • 状态为 MASTER 的机器会抢占状态为 BACKUP 的机器的 VIP

  • 优先级越高,机器获得 VIP 的次序越高

  • 默认情况下 keepalived 不允许开多个进程。解除限制需要修改源码

  • vrrp 是 未知组播

如果在 Master 重启后不希望抢占 Backup 的 VIP,就需要将 Master 和 Backup 的状态都设置为 BACKUP,且优先级相同

ssh

SSH 路径的权限如下:

文件

权限

.ssh

744

id_rsa

600

剩余

644

另外,ssh 要求属主家路径的权限为 700

免密登陆

免密登陆最简单的方式是将 .ssh 路径直接拷贝到目的电脑上。另外,root 的免密登陆首先需要保证 /etc/ssh/sshd_config 文件中打开了 PermitRootLogin yes 选项

ssh-copy-id -i ~/.ssh/id_rsa 192.168.122.64

远程执行命令

远程执行的命令的方式为:

ssh root@192.168.122.128 "ls /"

这种方式会将远程进程的 stdout, stderr, stdin 绑定到当前终端,这意味一旦当前终端退出,远程进程会自动退出,要解决这种办法,需要将远程终端的相关文件描述符进行重定向:

ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"

如果需要 在远程电脑 上执行图形界面,需要设置环境变量,例如:

ssh tea@192.168.122.128 "DISPLAY=:0 mate-terminal </dev/null > /tmp/tmplog 2>&1 &"

如果这种方式仍然没法执行,则需要将登陆用户更改为远程电脑上跑 xorg 的用户

另一种问题是需要测试远程服务器文件是否存在:

ssh root@aaa test -e /opt

ssh 优化选项

####普通ssh选项,相同任务每次执行时间基本相同 (OpenSSH 5.6之前版本使用)
#ssh_options=" -o StrictHostKeyChecking=no"
ssh_options="  -o StrictHostKeyChecking=no -o PubkeyAuthentication=no "
####闪速ssh优化选项,采用ssh长连接复用技术,相同任务在10s内,第二次及以后执行时间在3s内 (OpenSSH 5.6之后版本使用)
#ssh_options=" -T -q -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -o ConnectTimeout=5  -o ControlMaster=auto -o ControlPath=$tmp_dir/.ssh_mux_%h_%p_%r -o ControlPersist=600s "
####闪速ssh优化选项,启用压缩选项,在低速网络链接环境使用,采用ssh长连接复用技术,相同任务在10s内,第二次及以后执行时间在3s内 (OpenSSH 5.6之后版本使用)
#ssh_options=" -C -tt -q -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -o ConnectTimeout=5  -o ControlMaster=auto -o ControlPath=$tmp_dir/.ssh_mux_%h_%p_%r -o ControlPersist=600s"
ssh_cmd="/usr/bin/sshpass -p${remote_ssh_user_pass} /usr/bin/ssh ${ssh_options}"

转自

tc

摘抄自

模拟丢包

sudo tc qdisc add dev eth0 root netem loss 10%

模拟延迟

sudo tc qdisc add dev eth0 root netem delay 40ms

对发往 199.91.72.192:36000 的网络包产生 13% 的丢包和 40ms 的延迟

sudo tc qdisc add dev eth0 root handle 1: prio
sudo tc qdisc add dev eth0 parent 1:3 handle 30: netem loss 13% delay 40ms
sudo tc filter add dev eth0 protocol ip parent 1:0 u32 match ip dst 199.91.72.192 match ip dport 36000 0xffff flowid 1:3

删除规则:

sudo tc qdisc del dev eth0  root

linux 模拟延时和丢包

转至

这是 RHCA 中的一个 BDP 的测试,这也是公司很常用的一种延时和丢包的模拟,现在分享给大家。

我们做的应用软件,还有测试 TCP/UDP 对比,测试 BDP 对 TCP/IP 的影响时,我们都需要一些网络中的延时和丢包模拟,很多商业的软件可以做这个事,其实完美的 Linux 本身就可以使用 TC 来实现这个功能。TC 中的 Netem 可以模拟时延,丢包,重复包,乱序等功能

建议大家如果测试的话,使用 tc 当中间的路由器,来接二个网卡,然后打开路由功能来测试。

tc 的最最基本的使用

tc qdisc show    # 显示
tc qdisc  add dev eth0 root ----.. # 加入
tc qdisc  change  dev eth0 root ----.. # 修改存在的 qdisc ,记的,加入同一条后只能用 change 来修改
tc qdisc del dev eth0 root  # 删除

Linux 中延时模拟

设置延时 3s :

tc qdisc add dev eth0 root netem delay 3000ms

可以在 3000ms 后面在加上一个延时,比如 ’3000ms 200ms‘表示 3000ms ± 200ms ,延时范围 2800 – 3200 之间. 结果显示如下

Linux 中丢包模拟

设置丢包 50% ,iptables 也可以模拟这个,但一下不记的命令了,下次放上来:

tc qdisc change dev eth0 root netem loss 50%

上面的设丢包,如果给后面的 50% 的丢包比率修改成 ‘50% 80%’ 时,这时和上面的延时不一样,这是指丢包比率为 50-80% 之间. 显示如下

求文件交集和差集

作用方式

a 交 b

sort a.txt b.txt | uniq -d

a 交 b

comm -12 a.txt b.txt

a 并 b

sort a.txt b.txt | uniq

a - b

sort a.txt b.txt b.txt | uniq -u

a - b

comm -23 a.txt b.txt

a - b

grep -F -v -f b.txt a.txt
comm 要求文件是已排序的

二进制补丁

二进制补丁有三种工具:

  • rdiff

  • bsdiff / bspatch

  • git diff / apply

ping

  • ping -b 可以向广播地址发送 ICMPv4 报文

  • ping 224.0.0.251 多播 可以向 响应 mDNS 地址 224.0.0.251 的主机发送 ICMPv4 报文

Last moify: 2024-03-25 06:24:11
Build time:2025-07-18 09:41:42
Powered By asphinx