问题现象描述
在使用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