![为什么执行可执行文件时 PuTTY 的标题会不断变化?](https://linux22.com/image/90424/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%89%A7%E8%A1%8C%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E6%97%B6%20PuTTY%20%E7%9A%84%E6%A0%87%E9%A2%98%E4%BC%9A%E4%B8%8D%E6%96%AD%E5%8F%98%E5%8C%96%EF%BC%9F.png)
通常可以看到,如果一个可执行文件被cat
编辑,只要它是一个巨大的文件,它就会不断地改变“PuTTY”的标题,直到用那些奇怪的字符application
将二进制文件打印到“PuTTY”上,前缀似乎对了解没有帮助。STDOUT
strace
到底发生了什么,导致了这种情况的发生?只是好奇。
答案1
尽管看起来不太可能,PuTTY 这样做是为了响应组合的字符。
PuTTY 可以识别很多(通过no
方法全部)用于xterm
Linux 控制台和一些不太熟悉的终端的转义序列。 PuTTY 的一位开发人员编制了一份所有可能感兴趣的列表,大约有 650 项。您可以在这里和那里找到名为“全部转义.txt”,这样开始:
# This file is hoped to document all the escape sequences supported by
# terminals that are vaguely compliant with ECMA-48 and friends.
# Changes should be submitted to <[email protected]>
# It includes everything from:
# <URL:http://www.cs.utk.edu/~shuford/terminal/dec_vt220_codes.txt> 1999-05-16
# <URL:http://www.cs.utk.edu/~shuford/terminal/vt100_reference_card.txt>
# 1993-02-01
# <URL:http://www.cs.utk.edu/~shuford/terminal/vt100_codes_news.txt>1998-09-18
# <URL:http://www.cs.utk.edu/~shuford/terminal/ansi_dec_controls_news.txt>
# 1999-05-16
# <URL:http://www.cs.utk.edu/~shuford/terminal/xterm_controls.txt> 1999-10-12
# <URL:http://www.cs.utk.edu/~shuford/terminal/color_control_news.txt>
# 1999-11-13
# ECMA-48 5th Ed. control functions (section 8.3, annex F)
# Linux console_codes(4)
# SunOS 5.7 wscons(7D)
# UnixWare 7 display(7)
# IRIX 6.5.5 xwsh(1G)
# VT220 Reference manual (<URL:http://vt100.net/docs/vt220-rm/>, EK-VT220-RM)
# <URL:http://vt100.net/ctrlseq_dec.html> 1999-11-24
# <URL:http://vt100.net/ctrlfunc_dec.html> 1999-12-01
# <URL:http://www.wyse.com/service/support/kbase/SEQwt.asp?Q=9> (wy75)
# 1999-07-19
# <URL:ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/rbcom346.zip#TERM-EMU.DOC>
# 1999-09-13
# <URL:http://www.itscj.ipsj.or.jp/ISO-IR/2-1.htm> 1999-04-19
# <URL:http://www.itscj.ipsj.or.jp/ISO-IR/2-2.htm> 2004-09-27
# <URL:http://www.itscj.ipsj.or.jp/ISO-IR/2-3.htm> 2004-09-27
# <URL:http://www.itscj.ipsj.or.jp/ISO-IR/2-8-1.htm> 1999-04-19
# <URL:http://www.itscj.ipsj.or.jp/ISO-IR/2-8-2.htm> 2001-05-10
# iBCS2 description in ESR's termtypes.master version 10.2.7
# Reflection Terminal Reference Manual for ADDS, ANSI, DG, VT, WYSE, and
# Unisys Hosts; Version 7.0; September 1998; published by WRQ Inc.
# DEC Terminals and Printers Handbook 1985 EB 26291-56 (Appendices C, E, and G)
# OpenServer 5.0.6 screen(HW)
# X Consortium Compound Text Encoding Version 1.1
无论出于何种原因,他们不喜欢直接参考 Linux 和 xterm 文档的想法,而是使用二手资源。
PuTTY 识别的标题字符串以以下选项之一开头:
- ANSI 7 位 OSC ( escape]),或
- ANSI 8 位 OSC(八进制
235
)
后跟0, 1, 2, 21(ASCII 数字)或L,
一个分号,
和标题文本,
并以以下选择之一结束:
- ANSI 7 位字符串终止符 ( escape\),或
- ANSI 8 位字符串终止符(八进制
234
),或 - ASCII BEL(7,由 xterm 使用)
顺便说一句,如果它看到 ASCII 回车或换行,它将停止处理标题转义。
虽然“大”文件可能看起来足够随机,但您的文件很可能包含表格等形式的一些偏差。否则它不会反复按照描述更新标题。
构建一个检测潜在标题字符串的程序可能会很有趣,这样您就可以找到这些字符串,而无需重置终端(或者可能完全停止它)。
进一步阅读:
答案2
它不会单独显示,strace
因为它是带内控件。
在 PuTTY 之外,这通常被认为会破坏提示符。例子:显示二进制文件后修复终端
它们被称为转义序列 - 以字符序列表示的命令,以字符“转义”开头。 clear
是一个使用它们的简单示例。
- https://en.wikipedia.org/wiki/Escape_sequence
- https://en.wikipedia.org/wiki/Escape_sequence#ASCII_video_data_terminals
带内控制可被视为设计缺陷;它为严重问题打开了大门。https://www.proteansec.com/linux/blast-past-executing-code-terminal-emulators-via-escape-sequences/ (更一般地说 - 早期的自动电话网络使用带内控制进行路由,这允许黑客进行控制;参见例如http://www.mit.edu/hacker/hacker.html)。
记住终端窗口的全名是“终端模拟器”可能会有所帮助。物理终端并不真正具有带外控制。物理串行线路传递字节流(7 或 8 位)。
有一个串行信号称为“休息”。然而,“中断条件”通常仅用于一种目的。照其描述,听起来传输时间比普通字符要长。
(设计缺陷可以解决,例如如果非可打印默认情况下不传递字符。无需额外控件即可模拟打印机。比较将一段文本插入 HTML 模板:您需要&<>
专门处理字符以避免它们消失并作为代码运行)。
请注意,物理串行端口的缺点是无法传达终端的宽度和高度:)。物理终端的大小是固定的,我认为它们不会倾向于实现这样的任何查询。终端窗口为此实现了一个解决方法(它们发送 SIGWINCH,我认为这是一个检查某些内容的信号)PTY扩大)。 SSH 也有一些功能可以传递这一点。有趣的是远程登录协议对此的控制被描述为带内控制。这是通过定义许多 8 位代码来完成的。它假定仅使用 ASCII,即显然与 UTF-8 不兼容。来源:终端长度和宽度如何通过 SSH 和 telnet 转发?
答案3
发生的情况是,您的二进制文件恰好包含用于设置窗口标题的转义序列(在xterm
s 中,它是<esc>]2
,我不知道它在 putty 中是否不同)。