Linux终端下强制Telnet/SSH使用Ctrl+H作为退格键的解决方案


阅读 5 次

问题现象描述

在使用Cisco串口终端服务器连接设备时,发现部分设备无法正确处理Telnet默认的退格键映射。具体表现为:


# 典型问题重现
$ telnet 192.168.1.100 2001
Trying 192.168.1.100...
Connected to 192.168.1.100.
Escape character is '^]'.

Login: admin
Password: 
# 此时按Backspace键无法删除字符

关键诊断步骤

首先需要确认本地终端和远程设备的键位映射情况:


# 查看本地键盘映射
$ sudo showkey -a
Press any keys - Ctrl-D will terminate this program

^?      127 0177 0x7f  # Backspace实际发送的代码
^H        8 0010 0x08  # Ctrl+H发送的代码

# 查看当前键位映射表
$ sudo dumpkeys | grep -Ei "backspace|127"
keycode   8 = BackSpace        ampersand        braceleft       
keycode  14 = BackSpace        Delete          
        control keycode  14 = BackSpace       
keycode 127 =

解决方案实现

针对不同连接方式,有以下几种解决方案:

Telnet解决方案


# 方法1:使用telnet的转义序列强制模式
$ telnet
telnet> toggle crlf
telnet> mode character
telnet> open 192.168.1.100 2001

# 方法2:通过stty预先设置
$ stty erase ^h
$ telnet 192.168.1.100 2001

SSH解决方案


# 创建SSH配置文件
$ vi ~/.ssh/config
Host problematic-device
    HostName 192.168.1.100
    Port 22
    User admin
    RemoteCommand stty erase ^H; bash -i

# 或者使用命令行参数
$ ssh -t admin@192.168.1.100 "stty erase ^H; bash"

永久性配置方案

对于需要频繁访问的设备,建议修改本地终端配置:


# 修改键盘映射表(需root权限)
$ sudo vi /etc/console-tools/remap

# 添加以下内容
keycode 14 = BackSpace
keycode 127 = BackSpace

# 应用配置
$ sudo loadkeys /etc/console-tools/remap

设备端问题判断标准

如果出现以下情况,可以判定为设备固件问题:

  • 通过netcat直连时Backspace工作正常
  • 设备日志显示接收到DEL(127)而非BS(8)字符
  • 设备厂商文档明确说明只支持Ctrl+H退格

自动化处理脚本

以下脚本可自动检测并配置正确的退格键设置:


#!/bin/bash

DEVICE_IP=$1
PORT=${2:-23}

check_backspace() {
    expect <<EOF
    spawn telnet $DEVICE_IP $PORT
    expect "login:"
    send "test\r"
    expect "Password:"
    send "test\r"
    expect {
        "Login incorrect" { exit 1 }
        timeout { exit 2 }
    }
EOF
}

if ! check_backspace; then
    echo "Configuring Ctrl+H as backspace..."
    stty erase ^h
    telnet $DEVICE_IP $PORT
fi