Linux dumpkeys命令

简介

dumpkeys命令是Linux系统中用于导出当前虚拟控制台(tty)键盘映射表的命令行工具。它可以将当前的键盘映射设置以可读的格式输出到标准输出或文件,方便用户查看、备份或修改键盘配置。

特点:dumpkeys通常与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发行版默认已安装。如果未安装,可以使用以下命令:

Debian/Ubuntu系统:
sudo apt update
sudo apt install kbd
RHEL/CentOS/Fedora系统:
sudo yum install kbd

# 或使用dnf(Fedora/RHEL8+)
sudo dnf install kbd
Arch Linux系统:
sudo pacman -S kbd
注意:dumpkeys只影响虚拟控制台(tty),不影响图形界面(X Window)。对于X Window系统的键盘映射,需要使用xmodmapxkbcomp等工具。

使用示例

示例1:显示完整键盘映射

显示当前虚拟控制台的完整键盘映射:

# 显示完整键盘映射(包括注释和所有定义)
dumpkeys

# 输出可能会很长,可以使用less分页查看
dumpkeys | less

# 或者重定向到文件
dumpkeys > keymap.txt
示例2:显示简化格式

使用简化格式显示键盘映射:

# 每个键码单独一行(简化格式)
dumpkeys -l

# 只显示键码映射,不显示功能键字符串
dumpkeys -d

# 只显示普通键映射
dumpkeys -k
示例3:显示功能键字符串

只显示功能键的字符串定义:

# 只显示功能键字符串
dumpkeys -t

# 显示所有字符串定义(包括功能键和其他字符串)
dumpkeys | grep "^string"

# 查看特定功能键的定义
dumpkeys | grep "string F1 ="
示例4:备份和恢复键盘映射

备份当前键盘映射并在需要时恢复:

# 备份当前键盘映射
dumpkeys > mykeymap.kmap

# 查看备份文件
head -20 mykeymap.kmap

# 恢复键盘映射(使用loadkeys)
loadkeys mykeymap.kmap

# 或者直接通过管道恢复
dumpkeys | loadkeys
示例5:查找特定键的映射

查找特定键码或键名的映射:

# 查找CapsLock键的映射
dumpkeys | grep -i "capslock"

# 查找回车键的映射
dumpkeys | grep -i "enter\|return"

# 查找键码为58的映射
dumpkeys | grep "keycode.*58"

# 使用十六进制显示键码
dumpkeys -n | grep "0x3a"  # 0x3a = 58
示例6:显示键盘映射统计信息

显示键盘映射的统计信息:

# 显示简短统计信息
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"
示例7:创建自定义键盘映射

基于当前键盘映射创建自定义映射:

# 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
示例8:比较不同键盘映射

比较两个键盘映射文件的差异:

# 导出两个不同布局的键盘映射
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 "^[+-][+-]"

高级用法

1. 创建键盘映射分析报告

创建详细的键盘映射分析报告:

#!/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"
2. 自动修复常见键盘映射问题

自动检测和修复常见的键盘映射问题:

#!/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 "检查完成。"
3. 提取键盘映射为编程语言数据结构

将键盘映射转换为编程语言可用的格式:

# 提取为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
4. 监控键盘映射变化

监控键盘映射的变化并记录日志:

#!/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:用于导出(读取)当前键盘映射表,可保存为文件或显示在屏幕上
  • loadkeys:用于加载(写入)键盘映射表,从文件读取配置并应用到系统
  • 两者配合使用可以实现键盘映射的备份、修改和恢复
  • 典型的用法:dumpkeys > backup.kmap 然后 loadkeys backup.kmap

可能的原因和解决方案:

  1. 不在虚拟控制台中执行(如SSH会话),尝试切换到tty:sudo chvt 1
  2. 权限不足,尝试使用sudo:sudo dumpkeys
  3. 控制台设备不存在或不可用,检查/dev/tty是否存在
  4. 尝试指定控制台设备:dumpkeys -C /dev/console
  5. 检查内核是否支持键盘映射功能

有几种方法可以查看键码:

# 方法1:使用showkey命令
showkey
# 按下要查看的键,显示扫描码和键码,按Esc退出

# 方法2:从dumpkeys输出中查找
dumpkeys | grep -i "capslock"

# 方法3:使用showkey -k查看扫描码
showkey -k

# 方法4:使用evtest工具(需要安装)
sudo evtest
# 选择键盘设备,按键时会显示事件代码

0xff通常表示"无符号"或"未定义":

  • 在键盘映射中,0xff(或0xff??)表示该键码未定义任何功能
  • 某些键码可能未被使用,因此显示为0xff
  • 可以使用dumpkeys -n查看十六进制表示
  • 如果想清理这些未定义项,可以过滤输出:dumpkeys | grep -v "0xff"
  • 在创建自定义键盘映射时,可以忽略这些行

不可以。dumpkeys只适用于Linux虚拟控制台(tty):

  • 对于X Window图形界面,使用xmodmap -pke显示键盘映射
  • 使用xkbcomp导出XKB键盘配置
  • 使用setxkbmap -query查看当前X键盘设置
  • X Window系统和虚拟控制台使用不同的键盘系统
  • 某些设置可能需要在两个系统中分别配置

dumpkeys与相关工具对比

工具 适用环境 主要功能
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快速查看键盘映射统计信息
  • 在脚本中使用dumpkeys检查键盘布局:if dumpkeys | grep -q "keymaps 0-127"; then
  • 通过管道将dumpkeys输出传递给其他命令处理:dumpkeys -l | awk '{print $2}' | sort -n
  • 创建键盘映射差异报告:diff <(dumpkeys -l) <(loadkeys fr && dumpkeys -l)
  • 使用dumpkeys --funcs-only只查看功能键定义,避免冗长输出

相关命令

loadkeys

加载键盘映射表的工具

showkey

显示键码和扫描码的工具

xmodmap

X Window系统的键盘映射工具

kbd_mode
显示或设置键盘模式(RAW/XLATE/MEDIUMRAW/UNICODE)