常用命令¶
个人高频 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
运行后会在项目下生成包含全部依赖的 requirements.txt。
pyinstaller 打包
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
🟢终端环境¶
别名(alias)、历史记录 HISTTIMEFORMAT、readline 自定义按键、ctrl-r / xargs / 括号扩展等交互式技巧;通用语法请直接问 AI 或查 man。
写入 ~/.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 最常用」。
# 将历史命令的时间戳、用户名和 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:
"\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-dir、cp somefile{,.bak}。 - 参数列表过长(Argument list too long)时改用
find或xargs。 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 # 统计行数
集合运算(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
批量下载当前目录中匹配的链接:
批量替换目录中的字符串(# 作分隔符避免 URL 斜杠):
列出当前目录及子目录下最大的五个文件:
监视配置文件变化并自动重启服务的脚本见下方「监控文件夹变化」标签。
| 选项 | 作用 |
|---|---|
set -e |
任一行出错即退出 |
set -u |
使用未赋值变量时报错退出 |
set -o pipefail |
管道中任一环节失败即视为失败 |
set -x |
执行前打印每条命令,便于调试 |
Python(watchfiles)
Shell(inotifywait)
🟢网络工具¶
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 # 删除配置
查看当前配置
限速规则重启后失效;如需持久化,可写入系统启动脚本。
烧录镜像
# 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 禁止网卡重命名
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/。
🟢SSH 隧道与密钥¶
ssh -L / -R / -D 隧道与转发、SOCKS5 代理、sshd_config 要点、~/.ssh/config 按域名分配密钥;HTTP 代理环境变量见本页「速查」标签 →「代理环境变量」。
期望(被搬运的服务)在前,已有服务在后,即
本地IP:本地端口:已有IP:已有端口。
| 类型 | 参数 | 说明 |
|---|---|---|
| 反向代理 | -R |
把本地端口搬运到远端 |
| 正向代理 | -L |
把远端端口搬运到本地 |
| SOCKS5 | -D |
把自己当成中转站 |
常用参数:-f 后台运行、-N 不执行远程命令、-C 压缩、-g 允许远程主机连接本地转发端口(需服务端 GatewayPorts yes)。
服务端配置
SOCKS5(配合浏览器插件 switchyomega 使用)
关闭 DNS 反查(
UseDNS no)、登录限制(PermitRootLogin、PasswordAuthentication、Match、AllowUsers)见本页「权限与 SELinux」标签 →「SSH 登录限制」。
🟢系统与服务¶
systemd 开机自启与 ~/.ssh/rc 登录后执行、禁用 IPv6、tmpfs 挂载、strace 跟踪后台进程。
systemd 开机自启
写入 unit 与自启脚本(ConditionPathExists 保证存在 /etc/autoup 目录时才启动):
#!/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
ssh 登录后默认执行
登录后默认执行 ~/.ssh/rc,记得赋予可执行权限。
临时禁用
永久禁用
也可直接编辑 /etc/sysctl.conf:
改完执行 sysctl -p /etc/sysctl.conf 使之生效。
| 片段 | 含义 |
|---|---|
mount |
挂载文件系统的命令 |
-t tmpfs |
指定文件系统类型为 tmpfs |
12345 |
超级块标记,任意非空字符串,用于唯一标识该 tmpfs |
memory |
挂载点名称/路径,可自定义 |
-o size=1G |
指定 tmpfs 大小为 1GB |
执行后会在 memory 路径创建一个 1GB 的 tmpfs;tmpfs 是临时文件系统,系统重启后内容清空。
磁盘加密(LUKS)见本页「磁盘与加密」标签。
| 选项 | 作用 |
|---|---|
-p |
指定要跟踪的进程 pid;同时跟踪多个 pid 就重复多次 -p |
-s |
系统调用参数为字符串时,最多输出指定长度,默认 32 字节 |
-e |
控制要跟踪的事件/行为;可指定系统调用名(-e trace=file 文件、network、process、signal、read、write) |
-tt |
每行输出前显示毫秒级时间 |
-T |
显示每次系统调用所花费的时间 |
-v |
对相关调用打印完整环境变量、文件 stat 结构等 |
-f |
跟踪目标进程及其创建的所有子进程 |
-o |
把 strace 输出单独写到指定文件 |
更多定位工具见 故障定位。
🟢磁盘与加密¶
fdisk / parted 分区、ext4 resize2fs 与 xfs_growfs 扩容、LVM 多盘合并、LUKS 磁盘加密。
fdisk只支持 2T 以下磁盘,超过 2T 用parted。
ext4 离线调整需先卸载;提示磁盘忙时用 fuser -m /dev/sdb1 找出占用进程。
1、调整磁盘大小
2、parted /dev/sdb
3、resizepart
4、选择分区号(如 1)
5、输入结束位置
6、q 退出
7、partprobe 重读分区表
8、挂载
9、xfs_growfs /dev/sdb1 扩容文件系统
分区后大小没变先
partprobe;resize2fs只用于 ext 系列,xfs 用xfs_growfs。
完整流程:
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:
三种运行状态: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_config 的 Match、AllowUsers、DenyUsers、PasswordAuthentication 控制谁、从哪、用什么方式登录,改完 systemctl restart sshd。
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 . && 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 分支
- 当前分支正在开发,突然需要切到其他分支改 bug 或处理问题时使用。
git stash把当前分支的修改暂存起来,再切到其他分支处理。- 处理完切回原分支,
git stash pop弹出之前的修改,继续未完成的工作。
bash 历史记录与常用别名(
ll/dockerps/push/gc()等)见本页「终端环境」标签。