跳转至

常用命令

个人高频 Linux 命令速查:速查、终端环境、脚本与文本处理、网络工具、SSH 隧道与密钥、系统与服务、磁盘与加密、权限与 SELinux、Git。 同类主题用内容标签页并列切换,单组标签页不超过 5 个,标签内不再嵌套标签,点标题即可切到对应面板。

🟢速查

镜像源与 pip 源、代理环境变量、文件传输(scp / nc / rsync)、pyinstaller 打包等环境配置速查。

export http_proxy=http://192.168.1.100:8080
export https_proxy=http://192.168.1.100:8080
export ALL_PROXY="socks5://10.66.30.100:60120"

# 带认证
export http_proxy=http://username:password@proxy_host:proxy_port
export https_proxy=https://username:password@proxy_host:proxy_port

密码含特殊字符时先做 URL 编码再写入:

字符 编码 字符 编码
~ %7E ! %21
@ %40 # %23
$ %24 % %25
^ %5E & %26
* %2A ? %3F

SSH 隧道(-L / -R / -D)、SOCKS5 与按域名分配密钥见本页「SSH 隧道与密钥」标签。

镜像源

用途 地址
北大镜像(含帮助页) https://mirrors.pku.edu.cn/Help
重庆大学镜像 https://mirrors.cqu.edu.cn/
CERNET 镜像站帮助 https://help.mirrors.cernet.edu.cn/

全局 pip 源

pip install pip -U -i https://mirrors.pku.edu.cn/pypi/web/simple
pip config set global.index-url https://mirrors.pku.edu.cn/pypi/web/simple

或者直接创建配置文件:

mkdir -p ~/.config/pip/
echo '[global]
index-url = https://mirrors.pku.edu.cn/pypi/web/simple

[install]
trusted-host = pypi.douban.com
' > ~/.config/pip/pip.conf

requirements.txt

pipreqs ./ --encoding=utf-8

运行后会在项目下生成包含全部依赖的 requirements.txt

pyinstaller 打包

pyinstaller -F --upx-dir="D:\01-Soft\upx" xxx.py

scp / ssh 管道

# 远端文件拉到本地:在远端打 tar,本地解包
ssh -p 22 root@10.2.3.4 tar -cf - -C /root log2.txt | tar -xf -

# 本地文件上传到远程设备
tar -cf - log.txt | ssh -p 22 root@10.2.3.4 tar -xf - -C /tmp/000/

nc

文件输入一方需要添加 -N 参数,判断文件是否传输完毕

接收端监听
nc -l -p 9999 | tar xf -
发送端发送
tar cf - * | nc 10.2.3.4 9999

单个文件
nc -l [port] > file_name                 # 服务端,指定文件名作为输出
nc -N [ip_addr] [port] < file_name       # 客户端,指定文件名作为输入

rsync

rsync -av -e 'ssh -p PORT_NUMBER' /path/to/source user@remote_host:/path/to/destination

🟢终端环境

别名(alias)、历史记录 HISTTIMEFORMAT、readline 自定义按键、ctrl-r / xargs / 括号扩展等交互式技巧;通用语法请直接问 AI 或查 man

写入 ~/.bashrc,或追加到 /etc/bashrc

~/.bashrc 或 /etc/bashrc
alias ll='ls -l -h --time-style="+%Y-%m-%d %H:%M:%S"'
alias now='date "+%Y-%m-%d %H:%M:%S"'
alias vpn='export https_proxy=http://xl.hoao.fun:7890 && export http_proxy=http://xl.hoao.fun:7890'
alias dockerps='docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Command}}"'
alias push='git add . && git commit -m "`date`" && git push'

# 克隆仓库:别名无法处理空格,用函数完成
gc() {
  git clone https://账户:令牌@github.com/账户/$1.git
}

Git 命令速查见本页「速查与 Git」标签 →「Git 最常用」。

~/.bashrc
# 将历史命令的时间戳、用户名和 IP 地址格式化
USER_IP=$(who -u am i 2>/dev/null | awk '{print $NF}')
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S - ${USER_IP}: "

# 增加历史命令文件的大小上限到 100 万条
export HISTFILESIZE=1000000

# 每次执行命令时将历史命令追加到文件,并重新加载历史命令到内存中
export PROMPT_COMMAND="history -a; history -n; ${PROMPT_COMMAND}"

# 在历史命令文件中追加新命令,而不是覆盖旧命令;防止历史被清空
shopt -s histappend

ALT+hjkl 移动光标,写入 ~/.inputrc

~/.inputrc
"\eh": backward-char
"\el": forward-char
"\ej": next-history
"\ek": previous-history
"\eH": backward-word
"\eL": forward-word
"\eJ": beginning-of-line
"\eK": end-of-line

该配置对所有使用 readline 的工具生效(bash/zsh/python/lua 等),帮助见 info rluserman

  • ctrl-r 反向搜索历史,!$ 取上条命令最后参数,!! 重复上条命令。
  • ctrl-x ctrl-e$EDITOR 编辑当前长命令。
  • alt-. 循环移向前一个参数,alt-# 把当前行注释掉再回车。
  • xargs -I{} 逐项处理;-P 控制并行度,-L 控制每行参数个数。
  • <(cmd) 把命令输出当文件:diff /etc/hosts <(ssh somehost cat /etc/hosts)
  • 括号扩展省输入:mv foo.{txt,pdf} some-dircp somefile{,.bak}
  • 参数列表过长(Argument list too long)时改用 findxargs
  • python -m http.server 7777 在当前目录起临时 HTTP 服务。

🟢脚本与文本处理

sed / awk / sort / cut / wc 文本处理、iptables 等常用一行脚本、set -euo pipefail 脚本严格模式、watchfiles / inotifywait 监控文件夹变化、SVN 证书忽略。

cut -d':' -f5 file                  # 冒号分隔取第 5 列
awk '{print $5}' file               # 空格分隔取第 5 列
awk -F ',' '{print $NF}' file       # 逗号分隔取最后一列
awk '{s+=$1} END {print s}' file    # 第一列求和
sed -i 's/find/replace/g' file      # 原地替换全部
sed -i '/^$/d' file                 # 删除空行
sed -i 's/\s\+$//' file             # 删除行尾空格
sort -t: -k 3n /etc/passwd          # 按第三列数值排序
sort -u file                        # 去重排序
wc -l file                          # 统计行数

集合运算(ab 为两个已排序文件):

sort a b | uniq > c        # 并集
sort a b | uniq -d > c     # 交集
sort a b b | uniq -u > c   # 差集 a - b

固定 iptables 防火墙规则(内网白名单):

iptables -A INPUT -s 10.66.30.100 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 80,443,22,139,445 -j REJECT
iptables -A INPUT -s 10.44.3.0/24 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/8 -j REJECT
iptables -A INPUT -s 172.16.0.0/16 -j REJECT
iptables -A INPUT -s 192.168.0.0/24 -j REJECT

批量下载当前目录中匹配的链接

grep -ohr 'https://wework.qpic.cn/[^)]*' . | wget -i - -P images/

批量替换目录中的字符串# 作分隔符避免 URL 斜杠):

find . -type f -exec sed -i 's#http://old.example.com/#https://new.example.com/#g' {} \;

列出当前目录及子目录下最大的五个文件

find . -type f -exec du -h {} + | sort -rh | head -n 5

监视配置文件变化并自动重启服务的脚本见下方「监控文件夹变化」标签。

set -euo pipefail
trap "echo 'error: Script failed: see failed command above'" ERR
选项 作用
set -e 任一行出错即退出
set -u 使用未赋值变量时报错退出
set -o pipefail 管道中任一环节失败即视为失败
set -x 执行前打印每条命令,便于调试

Python(watchfiles)

watch.py
from watchfiles import watch
for changes in watch('C://'):
    print(changes)

Shell(inotifywait)

watch.sh
#!/bin/bash

CONFIG_FILE="/var/www/html/nginx/default.conf"

while true; do
    if inotifywait -e modify,move,create,delete "$CONFIG_FILE"; then
       docker restart webserver
    fi
done
mv /usr/bin/svn /usr/bin/svn3
echo -e "/usr/bin/svn3 --non-interactive --trust-server-cert --trust-server-cert-failures=unknown-ca,cn-mismatch,expired,not-yet-valid,other $@" >> /usr/bin/svn
chmod +x /usr/bin/svn

🟢网络工具

curl、tc 限速与 netem 网络异常模拟、软路由 openwrt 踩坑,命令可直接复制。

curl -i https://example.com            # 打印响应头 + 正文
curl -I https://example.com            # 只发 HEAD,看响应头
curl -k https://example.com            # 跳过 SSL 证书检测
curl -L https://example.com            # 跟随重定向
curl -s -o /dev/null -w '%{http_code}\n' https://example.com   # 只看状态码
curl -d '{"k":"v"}' -H 'Content-Type: application/json' https://example.com/api
curl -u 'user:pass' https://example.com/login                  # Basic 认证
curl -x socks5://user:pass@proxy:1080 https://example.com      # 走代理
curl --limit-rate 200k -O https://example.com/big.iso          # 限速下载

限速

# 将 eth0 限速为 1000kbit/s,最大突发 32kbit,延迟 400ms
sudo tc qdisc add dev eth0 root tbf rate 1000kbit burst 32kbit latency 400ms

# 取消限速,恢复默认
tc qdisc del dev eth0 root

模拟网络异常

tc qdisc add dev eth0 root netem delay 100ms          # 固定延迟 100ms
tc qdisc add dev eth0 root netem delay 100ms 10ms     # 延迟 100ms ± 10ms
tc qdisc add dev eth0 root netem delay 100ms 10ms 30% # 30% 的包波动
tc qdisc add dev eth0 root netem loss 1%              # 随机丢包 1%
tc qdisc add dev eth0 root netem duplicate 1%         # 1% 重复包
tc qdisc add dev eth0 root netem corrupt 0.2%         # 0.2% 损坏包
tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%  # 乱序
tc qdisc del dev eth0 root netem delay 100ms          # 删除配置

查看当前配置

tc qdisc show dev eth0      # 查看 eth0 传输配置
tc -s qdisc show dev eth0   # 查看详情与丢包统计

限速规则重启后失效;如需持久化,可写入系统启动脚本。

烧录镜像

# openwrt-22.03.5-x86-64-generic-ext4-combined.img 存于 10.44.3.4
dd if=openwrt-22.03.5-x86-64-generic-ext4-combined.img of=/dev/sdd

grub 禁止网卡重命名

net.ifnames=0 biosdevname=0
menuentry "USB-5.4" {
        linux /boot/vmlinuz-5.4 root=UUID=b4bebba7-76c1-430c-bf28-1b14c4cf20b4 rootwait  console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0
        initrd  /boot/initramfs-5.4.img
}

内核替换踩坑

替换内核后若使用 root=PARTUUID=bf7a017b-03,系统可能卡在生成随机数处迟迟无法进入,改用 root=UUID=b4bebba7-76c1-430c-bf28-1b14c4cf20b4 即可。

驱动模块位于 /lib/modules/,开机自动加载的模块配置位于 /etc/modules-load.d/

find . | cpio -o -H newc | gzip > ~/initramfs-5.4.img   # 打包 initramfs
rpm2cpio ../123.rpm | cpio -ivdh                        # 解包 RPM 内容
zcat ~/initramfs.img | cpio -ivdm                       # 解包 initramfs

🟢SSH 隧道与密钥

ssh -L / -R / -D 隧道与转发、SOCKS5 代理、sshd_config 要点、~/.ssh/config 按域名分配密钥;HTTP 代理环境变量见本页「速查」标签 →「代理环境变量」。

期望(被搬运的服务)在前,已有服务在后,即 本地IP:本地端口:已有IP:已有端口

类型 参数 说明
反向代理 -R 把本地端口搬运到远端
正向代理 -L 把远端端口搬运到本地
SOCKS5 -D 把自己当成中转站

常用参数:-f 后台运行、-N 不执行远程命令、-C 压缩、-g 允许远程主机连接本地转发端口(需服务端 GatewayPorts yes)。

服务端配置

/etc/ssh/sshd_config
GatewayPorts no    # 使用代理时设为 yes,否则只监听 127.0.0.1

SOCKS5(配合浏览器插件 switchyomega 使用)

ssh -NfCD 0.0.0.0:8850 root@120.79.196.213

关闭 DNS 反查(UseDNS no)、登录限制(PermitRootLoginPasswordAuthenticationMatchAllowUsers)见本页「权限与 SELinux」标签 →「SSH 登录限制」。

正向代理:把远程服务搬到本地。访问本地 9900 等效于访问远程 120.79.196.213:80:

ssh -NfL 0.0.0.0:9900:0.0.0.0:80 root@120.79.196.213
ssh -fL 0.0.0.0:9900:0.0.0.0:8888 root@mibo.fun

反向隧道:把本地服务公开给远程服务器:

ssh -f -N -R 远程端口:0.0.0.0:本地端口 -g 用户@远程IP

需在 /etc/ssh/sshd_config 中添加 GatewayPorts yes 并重启 sshd,-g 才生效。

~/.ssh/config
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitee_id_rsa

Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id_rsa

🟢系统与服务

systemd 开机自启与 ~/.ssh/rc 登录后执行、禁用 IPv6、tmpfs 挂载、strace 跟踪后台进程。

systemd 开机自启

写入 unit 与自启脚本(ConditionPathExists 保证存在 /etc/autoup 目录时才启动):

写入 autoup.service 与自启脚本
#!/bin/sh -e
echo '[Unit]
Description=/etc/autoup Compatibility
# 即在文件系统中存在/etc/autoup目录时,才启动该服务
ConditionPathExists=/etc/autoup

[Service]
Type=simple
ExecStart=/bin/sh /etc/autoup
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
Restart=always
RestartSec=3
StartLimitInterval=5

[Install]
WantedBy=multi-user.target'>/etc/systemd/system/autoup.service

echo '''#!/bin/sh -e
# this is Boot on auto-start
''' >/etc/autoup
赋权、启动并加入自启
chmod +x /etc/autoup
systemctl start autoup.service
systemctl enable autoup.service

ssh 登录后默认执行

登录后默认执行 ~/.ssh/rc,记得赋予可执行权限。

临时禁用

sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1

永久禁用

echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

也可直接编辑 /etc/sysctl.conf

# 禁用全部
net.ipv6.conf.all.disable_ipv6 = 1
# 禁用指定接口
net.ipv6.conf.lo.disable_ipv6 = 1

改完执行 sysctl -p /etc/sysctl.conf 使之生效。

mount -t tmpfs 12345 memory -o size=1G
片段 含义
mount 挂载文件系统的命令
-t tmpfs 指定文件系统类型为 tmpfs
12345 超级块标记,任意非空字符串,用于唯一标识该 tmpfs
memory 挂载点名称/路径,可自定义
-o size=1G 指定 tmpfs 大小为 1GB

执行后会在 memory 路径创建一个 1GB 的 tmpfs;tmpfs 是临时文件系统,系统重启后内容清空

磁盘加密(LUKS)见本页「磁盘与加密」标签。

strace -p 3596 -e write -s 9999 -tt
选项 作用
-p 指定要跟踪的进程 pid;同时跟踪多个 pid 就重复多次 -p
-s 系统调用参数为字符串时,最多输出指定长度,默认 32 字节
-e 控制要跟踪的事件/行为;可指定系统调用名(-e trace=file 文件、networkprocesssignalreadwrite
-tt 每行输出前显示毫秒级时间
-T 显示每次系统调用所花费的时间
-v 对相关调用打印完整环境变量、文件 stat 结构等
-f 跟踪目标进程及其创建的所有子进程
-o 把 strace 输出单独写到指定文件

更多定位工具见 故障定位


🟢磁盘与加密

fdisk / parted 分区、ext4 resize2fs 与 xfs_growfs 扩容、LVM 多盘合并、LUKS 磁盘加密。

fdisk 只支持 2T 以下磁盘,超过 2T 用 parted

ext4 离线调整需先卸载;提示磁盘忙时用 fuser -m /dev/sdb1 找出占用进程。

umount /dev/sdb1
fdisk /dev/sdb      # p 记录磁柱号 → d 删除分区 → n 建分区(起始磁柱号须一致)→ w 保存
e2fsck -f /dev/sdb1 # 检查
resize2fs -p /dev/sdb1   # 实际调整
1、调整磁盘大小
2、parted /dev/sdb
3、resizepart
4、选择分区号(如 1)
5、输入结束位置
6、q 退出
7、partprobe 重读分区表
8、挂载
9、xfs_growfs /dev/sdb1 扩容文件系统

分区后大小没变先 partproberesize2fs 只用于 ext 系列,xfs 用 xfs_growfs

sudo pvcreate /dev/sdb1 /dev/sdc1
sudo vgcreate myvg /dev/sdb1 /dev/sdc1
sudo lvcreate -l 100%FREE -n mylv myvg
sudo mkfs.ext4 /dev/myvg/mylv
sudo mkdir -p /home/HSP
sudo mount /dev/myvg/mylv /home/HSP     # 写入 fstab 后重启验证
apt-get install cryptsetup

完整流程:

1、创建分区:使用 fdisk 或 parted 创建一个分区
2、设置加密:cryptsetup luksFormat /dev/sda
   输入大写 YES 确定并设置密码
3、打开加密分区
   cryptsetup open /dev/sdaX mibo                      # 输入密码
   cryptsetup luksOpen /dev/sda1 mibo -d /root/idrs    # 使用密钥文件
   cryptsetup open UUID=a9d4c1d4-4600-4612-a85c-0609cf0cc89f mibo
4、格式化分区:mkfs.ext4 /dev/mapper/mibo
5、挂载使用:mount /dev/mapper/mibo /mnt/mibo
6、卸载关闭
   umount /mnt/mibo
   cryptsetup close mibo
7、修改密码
   luksAddKey <device> [<new key file>]    - add key to LUKS device
   luksRemoveKey <device> [<key file>]     - removes supplied key or key file from LUKS device
   luksChangeKey <device> [<key file>]     - changes supplied key or key file of LUKS device

密钥文件方式:

openssl rand -out /root/secret.key -aes-256 32
chmod 400 /root/secret.key && chown root:root /root/secret.key
cryptsetup luksFormat /dev/sdb1 --key-file /root/secret.key
cryptsetup luksAddKey /dev/sdb1 --key-file /root/secret.key
命令 作用
cryptsetup luksFormat 初始化加密设备(破坏性)
cryptsetup luksOpen / open 打开并映射到 /dev/mapper/
cryptsetup luksClose / close 关闭映射
cryptsetup luksDump 查看 LUKS 设备信息
cryptsetup luksAddKey / luksRemoveKey / luksChangeKey 添加 / 移除 / 更换密钥

密钥文件权限设为 chmod 400,存放在加密设备之外并多处备份;脚本中通过环境变量或配置文件传路径,禁止硬编码。


🟢权限与 SELinux

SUID / SGID / SBIT 特殊权限位、sudoers 配置、SELinux getenforce / setsebool、sshd_config 登录限制(AllowUsers / Match)。

数字 作用
SUID chmod 4755 file 以文件所有者身份运行
SGID chmod 2755 dir 以文件所属组身份运行
SBIT chmod 1777 dir 仅目录有效,只有目录/文件所有者能删除其中文件

visudo 编辑 /etc/sudoers

/etc/sudoers
test ALL=(ALL:ALL) ALL                  # 用户全权限
%wheel ALL=(ALL) ALL                    # 组全权限
test ALL=(ALL) NOPASSWD: ALL            # 免密
lucy ALL=(ALL) NOPASSWD: /bin/useradd   # 免密执行指定命令
escape localhost=/sbin/shutdown -h now  # 仅本机可执行

三种运行状态:Disabled(禁用)、Permissive(只记录不拒绝)、Enforcing(默认,实际拒绝)。

getenforce / sestatus          # 查看状态
setenforce 0 / 1               # 临时切 Permissive / Enforcing
semanage boolean -l            # 列出所有 Booleans
setsebool httpd_can_network_connect_db on   # 运行时改策略

核心概念:SELinux 依据 Subject(进程)与 Object(文件)的 Context/Label 查询安全策略,决定某个 Action 是否放行;违反时记录 AVC 日志。

通过 /etc/ssh/sshd_configMatchAllowUsersDenyUsersPasswordAuthentication 控制谁、从哪、用什么方式登录,改完 systemctl restart sshd

/etc/ssh/sshd_config
PermitRootLogin yes         # 生产建议 no 或 prohibit-password
PasswordAuthentication no
UseDNS no

### root 只能从 10.66.30.100 登录
Match User root
    AllowUsers root@10.66.30.100

### 只允许从 10.66.30.140 登录这台设备
AllowUsers *                     # 默认情况下,允许所有用户登录
Match Address *,!10.66.30.140    # 针对所有其他地址,禁止所有用户登录
    DenyUsers *

### 只允许 mibo 用户用密码登录,其他只能密钥
PasswordAuthentication yes
Match User mibo
    PasswordAuthentication yes
Match all
    PasswordAuthentication no

### 只允许 127.0.0.1 用密码,其他只能密钥
Match Address 127.0.0.1
    PasswordAuthentication yes
    PubkeyAuthentication yes
Match all
    PasswordAuthentication no
    PubkeyAuthentication yes

隧道、端口转发与密钥配置见本页「SSH 隧道与密钥」标签。


🟢Git

orphan 分支重建、reset 回退与重置、账户 + 令牌拉取代码、stash 暂存的常用 Git 操作。

git checkout --orphan=bo
git add .
git commit -m 'commit'
git branch -D master
git branch -m master
git push -f origin master
git branch --set-upstream-to=origin/master
git pull
git checkout --orphan=bo
git add .
git commit -m 'commit'
git branch -D main
git branch -m main
git push -f origin main
git branch --set-upstream-to=origin/main
git pull
git checkout . && git clean -df  # 退回到上次的修改(会删除所有上次提交后至今的变更)
git reset <commit>          # 本地仓库覆盖到工作区(保存回退文件内容修改)
git reset --mixed <commit>  # 本地仓库覆盖到工作区(保存回退文件内容修改)
git reset --soft <commit>   # 本地仓库覆盖到工作区(保留修改并加到暂存区)
git reset --hard <commit>   # 本地仓库覆盖到工作区(不保留修改直接删除掉)
git commit --amend          # 改变当前最新一次提交记录
git push origin :dev        # 删除远端 dev 分支
# github:账户 + 私人令牌
git clone https://kaozb:私人令牌@github.com/kaozb/abcde.git

# gitlab:账户 + 私人令牌
https://username:私人令牌@gitlab.mibo.com/tp/OS/dpdk/dpdk-19.11.git
  • 当前分支正在开发,突然需要切到其他分支改 bug 或处理问题时使用。
  • git stash 把当前分支的修改暂存起来,再切到其他分支处理。
  • 处理完切回原分支,git stash pop 弹出之前的修改,继续未完成的工作。

bash 历史记录与常用别名(ll / dockerps / push / gc() 等)见本页「终端环境」标签。