dumpkeys命令是Linux系统中用于导出当前虚拟控制台(tty)键盘映射表的命令行工具。它可以将当前的键盘映射设置以可读的格式输出到标准输出或文件,方便用户查看、备份或修改键盘配置。
loadkeys命令配合使用,dumpkeys用于导出键盘映射,loadkeys用于加载键盘映射。dumpkeys还可以显示键盘映射的详细信息,包括键码、符号、修饰键组合等。
dumpkeys [选项]
| 选项 | 说明 |
|---|---|
-h, --help |
显示帮助信息 |
-V, --version |
显示版本信息 |
-c, --charset=charset |
指定字符集名称 |
-f, --full-table |
以完整格式输出(包括注释) |
-l, --separate-lines |
每个键码一行(简化格式) |
-n, --numeric |
以十六进制显示键码 |
-s, --short-info |
显示简短信息(键码总数等) |
-t, --funcs-only |
只显示功能键字符串 |
-k, --keys-only |
只显示普通键映射,不显示功能键 |
-d, --dont-print-strings |
不显示功能键字符串 |
-C, --console=dev |
指定控制台设备(默认为当前控制台) |
-S, --shape=shape |
指定输出格式:0=默认,1=完整 |
-1 |
单列输出(某些版本支持) |
--compose-only |
只显示组合键(compose)定义 |
--keys=范围 |
只显示指定键码范围的映射 |
dumpkeys命令的输出包含多个部分:
# 普通键映射示例
keycode 1 = Escape
keycode 2 = one exclam
keycode 3 = two at
keycode 4 = three numbersign
# 修饰键组合示例
alt keycode 59 = F1
control alt keycode 59 = Console_1
# 功能键字符串示例
string F1 = "\033[[A"
string F2 = "\033[[B"
string F3 = "\033[[C"
# 组合键示例
compose '`' 'a' to 'à'
compose '\'' 'e' to 'é'
| 部分 | 说明 | 示例 |
|---|---|---|
| 键码定义 | 定义键码对应的符号(无修饰键、Shift修饰) | keycode 2 = one exclam |
| 修饰键组合 | 定义修饰键(Alt、Ctrl等)组合的功能 | alt keycode 59 = F1 |
| 功能键字符串 | 定义功能键(F1-F12)发送的字符串 | string F1 = "\033[[A" |
| 组合键 | 定义组合键产生的字符(如重音符号) | compose '\'' 'e' to 'é' |
| 包含指令 | 包含其他键盘映射文件 | include "linux-with-alt-and-altgr" |
dumpkeys命令通常包含在kbd(键盘工具)包中,大多数Linux发行版默认已安装。如果未安装,可以使用以下命令:
sudo apt update
sudo apt install kbd
sudo yum install kbd
# 或使用dnf(Fedora/RHEL8+)
sudo dnf install kbd
sudo pacman -S kbd
xmodmap或xkbcomp等工具。
显示当前虚拟控制台的完整键盘映射:
# 显示完整键盘映射(包括注释和所有定义)
dumpkeys
# 输出可能会很长,可以使用less分页查看
dumpkeys | less
# 或者重定向到文件
dumpkeys > keymap.txt
使用简化格式显示键盘映射:
# 每个键码单独一行(简化格式)
dumpkeys -l
# 只显示键码映射,不显示功能键字符串
dumpkeys -d
# 只显示普通键映射
dumpkeys -k
只显示功能键的字符串定义:
# 只显示功能键字符串
dumpkeys -t
# 显示所有字符串定义(包括功能键和其他字符串)
dumpkeys | grep "^string"
# 查看特定功能键的定义
dumpkeys | grep "string F1 ="
备份当前键盘映射并在需要时恢复:
# 备份当前键盘映射
dumpkeys > mykeymap.kmap
# 查看备份文件
head -20 mykeymap.kmap
# 恢复键盘映射(使用loadkeys)
loadkeys mykeymap.kmap
# 或者直接通过管道恢复
dumpkeys | loadkeys
查找特定键码或键名的映射:
# 查找CapsLock键的映射
dumpkeys | grep -i "capslock"
# 查找回车键的映射
dumpkeys | grep -i "enter\|return"
# 查找键码为58的映射
dumpkeys | grep "keycode.*58"
# 使用十六进制显示键码
dumpkeys -n | grep "0x3a" # 0x3a = 58
显示键盘映射的统计信息:
# 显示简短统计信息
dumpkeys -s
# 输出示例:
# keycode number = 128
# string number = 0
# accent table size = 0
# action table size = 128
# 计算键码总数
dumpkeys -s | grep "keycode number" | awk '{print $4}'
# 统计不同类型映射的数量
dumpkeys | grep -c "^keycode"
dumpkeys | grep -c "^string"
dumpkeys | grep -c "^compose"
基于当前键盘映射创建自定义映射:
# 1. 导出当前键盘映射
dumpkeys > base.kmap
# 2. 创建修改文件
cat > modifications.kmap << 'EOF'
# 交换CapsLock和左Ctrl
keycode 58 = Control
keycode 29 = Caps_Lock
# 修改功能键字符串
string F1 = "Help Screen"
string F2 = "Save File"
EOF
# 3. 合并映射
cat base.kmap modifications.kmap > custom.kmap
# 4. 加载自定义映射
loadkeys custom.kmap
比较两个键盘映射文件的差异:
# 导出两个不同布局的键盘映射
loadkeys us
dumpkeys -l > us.kmap
loadkeys de
dumpkeys -l > de.kmap
# 比较差异
diff us.kmap de.kmap | less
# 只显示有差异的行
diff -u us.kmap de.kmap | grep "^[+-]" | grep -v "^[+-][+-]"
创建详细的键盘映射分析报告:
#!/bin/bash
# 键盘映射分析脚本
REPORT_FILE="keymap_report_$(date +%Y%m%d).txt"
echo "键盘映射分析报告 - $(date)" > "$REPORT_FILE"
echo "=======================================" >> "$REPORT_FILE"
# 基本信息
echo "系统信息:" >> "$REPORT_FILE"
uname -a >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
# 键盘映射统计
echo "键盘映射统计:" >> "$REPORT_FILE"
dumpkeys -s >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
# 特殊键映射
echo "特殊键映射:" >> "$REPORT_FILE"
for key in Escape Return BackSpace Tab Delete Caps_Lock; do
echo " $key:" >> "$REPORT_FILE"
dumpkeys | grep -i "$key" | head -2 >> "$REPORT_FILE"
done
echo "报告已生成: $REPORT_FILE"
自动检测和修复常见的键盘映射问题:
#!/bin/bash
# 键盘映射自动修复脚本
echo "检查键盘映射..."
# 检查Enter键是否正常
if ! dumpkeys | grep -q "keycode.*28.*=.*Return"; then
echo "修复Enter键映射..."
echo "keycode 28 = Return" | loadkeys
fi
# 检查Backspace键是否正常
if ! dumpkeys | grep -q "keycode.*14.*=.*BackSpace"; then
echo "修复Backspace键映射..."
echo "keycode 14 = BackSpace" | loadkeys
fi
# 检查CapsLock是否被错误映射
if dumpkeys | grep -q "keycode.*58.*=.*Control"; then
echo "注意: CapsLock被映射为Control键"
read -p "是否恢复为CapsLock? (y/n): " choice
if [ "$choice" = "y" ]; then
echo "keycode 58 = Caps_Lock" | loadkeys
fi
fi
echo "检查完成。"
将键盘映射转换为编程语言可用的格式:
# 提取为JSON格式
dumpkeys -l | awk '
BEGIN { print "{" }
{
if ($1 == "keycode") {
if (NR > 1) print ","
printf " \"%s\": {\"normal\": \"%s\"", $2, $4
if ($5 != "") printf ", \"shift\": \"%s\"", $5
print "}"
}
}
END { print "}" }' > keymap.json
# 提取为Python字典
dumpkeys -l | awk '
BEGIN { print "keymap = {" }
{
if ($1 == "keycode") {
if (NR > 1) print ","
printf " %s: {\"normal\": \"%s\"", $2, $4
if ($5 != "") printf ", \"shift\": \"%s\"", $5
print "}"
}
}
END { print "}" }' > keymap.py
监控键盘映射的变化并记录日志:
#!/bin/bash
# 键盘映射监控脚本
LOG_FILE="keymap_changes.log"
PREV_MAP="/tmp/keymap.prev"
# 保存初始状态
dumpkeys -l > "$PREV_MAP"
echo "开始监控键盘映射变化..."
echo "按Ctrl+C停止"
while true; do
sleep 5
CURRENT_MAP="/tmp/keymap.current"
dumpkeys -l > "$CURRENT_MAP"
if ! diff -q "$PREV_MAP" "$CURRENT_MAP" > /dev/null; then
echo "$(date): 键盘映射发生变化" >> "$LOG_FILE"
diff "$PREV_MAP" "$CURRENT_MAP" >> "$LOG_FILE"
echo "---" >> "$LOG_FILE"
mv "$CURRENT_MAP" "$PREV_MAP"
echo "检测到键盘映射变化,已记录到 $LOG_FILE"
fi
done
dumpkeys > backup.kmap 然后 loadkeys backup.kmap可能的原因和解决方案:
sudo chvt 1sudo dumpkeys/dev/tty是否存在dumpkeys -C /dev/console有几种方法可以查看键码:
# 方法1:使用showkey命令
showkey
# 按下要查看的键,显示扫描码和键码,按Esc退出
# 方法2:从dumpkeys输出中查找
dumpkeys | grep -i "capslock"
# 方法3:使用showkey -k查看扫描码
showkey -k
# 方法4:使用evtest工具(需要安装)
sudo evtest
# 选择键盘设备,按键时会显示事件代码
0xff通常表示"无符号"或"未定义":
0xff(或0xff??)表示该键码未定义任何功能0xffdumpkeys -n查看十六进制表示dumpkeys | grep -v "0xff"不可以。dumpkeys只适用于Linux虚拟控制台(tty):
xmodmap -pke显示键盘映射xkbcomp导出XKB键盘配置setxkbmap -query查看当前X键盘设置| 工具 | 适用环境 | 主要功能 |
|---|---|---|
| dumpkeys | 虚拟控制台(tty) | 导出控制台键盘映射 |
| xmodmap | X Window图形界面 | 显示和修改X键盘映射 |
| xkbcomp | X Window图形界面 | 编译和反编译XKB键盘配置 |
| showkey | 虚拟控制台(tty) | 显示键码和扫描码 |
| loadkeys | 虚拟控制台(tty) | 加载键盘映射表 |
dumpkeys -l > backup.kmap创建键盘映射备份grep命令查找特定键的映射:dumpkeys | grep -i "escape"dumpkeys -s快速查看键盘映射统计信息if dumpkeys | grep -q "keymaps 0-127"; thendumpkeys -l | awk '{print $2}' | sort -ndiff <(dumpkeys -l) <(loadkeys fr && dumpkeys -l)dumpkeys --funcs-only只查看功能键定义,避免冗长输出加载键盘映射表的工具
显示键码和扫描码的工具
X Window系统的键盘映射工具