当 telnet 到 HP 设备发生混乱后,如何恢复(xterm|gnome-terminal)包装?

当 telnet 到 HP 设备发生混乱后,如何恢复(xterm|gnome-terminal)包装?

我从我的 (xterm|gnome-terminal) telnet 到 HP 交换机。退出 telnet。这会破坏终端的行为。(如果您没有 HP 交换机可以 telnet 到,可以cat 这个文件在终端中)。

现在输入一个非常长的命令(超过一行,并且看到第二行不会换到下一行,而是“停留在当前行”。这使得无法编辑先前的命令或使用终端执行任何超过一行的内容。

看看cat filewithlonglines.txt是否git log -p仅显示长度超过 80 个字符的行的前 80 个字符。

reset不起作用。stty -g > stty.works运行 telnet,stty $(stty.works)恢复更改的stty设置,但行为仍然不正确。

我必须关闭终端并启动一个新的终端。:-(

reset除了保存/恢复之外,我还能做什么stty来修复 telnet 之后损坏的终端?

编辑:我发现如果我screen在以下命令之一中使用类似命令:

screen bash -c "cat hptelnet.escape ; bash"

或者

screen telnet hpswitch

然后当屏幕退出时我的终端仍然正常工作。所以解决方法是将屏幕放在弄乱我的终端的命令前面,但我仍然想知道如何恢复已经弄乱的终端......

答案1

在由 HP 交换机引起的问题的特定情况下,我发现(通过使用script,记录发送到终端的每个字节),终端的自动换行模式已通过 VT100 代码“ <ESC>[?7l”关闭,然后再也没有重新打开。

重新打开自动换行的 VT100 代码是“ <ESC>[?7h”,您可以使用以下命令将其发送到终端:

printf "\033[?7h"

但是,这假设您的终端符合 VT100 标准,虽然这是一个不错的选择,但并不一定。 更正确的方法是依靠您的 terminfo 设置并运行以下命令:

tput smam

printf假设终端为 VT100 样式,则该命令将生成与上述命令完全相同的输出。terminfo 功能“smam”是“设置模式:自动边距”。其配对是“rmam”:“重置模式:自动边距”。

顺便说一句,我真的希望ssh有一个“LocalEndCommand”配置选项(类似于“LocalCommand”),这样我就可以让它在每个 HP 交换机 ssh 连接结束时自动运行这个取消操作。


† 谢谢,HP!

‡ 您认为 HP 是否下了这样的赌注?我猜他们下了,并且总是发送 VT100 代码。在这种情况下,如果您的终端不兼容 VT100,那么您一开始就不会遇到这个问题。

答案2

此外,reset我还经常尝试其他一些方法。有时,这些方法有助于恢复终端的正常运作:

  1. resize(在某些系统上它不在 $PATH 中,通常位于 /usr/X11/bin/ 之类的位置)
  2. echo "^v^o"(按下CTRL+V然后,这是一个古老的 Unix 技巧,在我无意中对二进制文件CTRL+O执行此操作后,它经常帮助我。)cat
  3. stty sane

答案3

另外尝试:

# https://gist.github.com/raw/1294767/a1ea19be2f70b092057a5232c2d05a0ee9bf145b/hptelnet.escape
cat hptelnet.escape

tput reset

# each of the following commands may work as well
tput smcup   # string to start programs using cup
tput is2     # initialization string; init_2string


# ... and as a last resort try ...
# cf. "The Alternate Character Set", 
# http://www.in-ulm.de/~mascheck/various/alternate_charset/

# added \033c to clear screen
alias vtn='echo "X[mX(BX)0OX[?5lX7X[rX8Xc" | tr "XO" "\033\017"'   
vtn

相关内容