隐藏远程终端上的光标
Posted
技术标签:
【中文标题】隐藏远程终端上的光标【英文标题】:Hide cursor on remote terminal 【发布时间】:2011-02-08 15:14:06 【问题描述】:我有一个连接到远程终端的开放式套接字。使用“Force telnet client into character mode”的答案,我能够将该终端置于字符模式。
我的问题是,如何使用这种方法在远程终端隐藏光标?
【问题讨论】:
【参考方案1】:如果这是使用“telnet”应用程序,那么您的应用程序应发送“IAC WILL ECHO”以禁用其远程端的回显。这对于输入密码或您的应用正在执行回显很有用。
#define TEL_IAC "\377"
#define TEL_WILL "\373"
#define TEL_ECHO "\001"
char buf[4];
snprintf(buf, sizeof(buf), "%c%c%c" TEL_IAC, TEL_WILL, TEL_ECHO);
write(sock, buf, sizeof(buf));
或者
write(sock, TEL_IAC TEL_WILL TEL_ECHO, 3);
希望这会有所帮助。
【讨论】:
问题似乎是关于隐藏光标,而不是隐藏用户输入。【参考方案2】:这是ncurses 库可以为您做的事情。
curs_set()
函数可以使光标不可见。
【讨论】:
【参考方案3】:如果您使用的终端支持 ANSI 格式,您应该可以发送以下escape codes:
隐藏光标:0x9B 0x3F 0x32 0x35 0x6C 显示光标:0x9B 0x3F 0x32 0x35 0x68【讨论】:
我知道这已经有几年了,但你从哪里得到这个命令?里面有其他转义码的链接吗? 除非别无选择,否则不要对终端控制代码进行硬编码。使用 ncurses 查找当前$TERM
值的相应代码,除非由于某种原因不能使用 ncurses。
就像我的代码运行在带有 8KB ROM 的 PIC 微处理器上?【参考方案4】:
为了扩展 mjh2007 的答案,以下 c/c++ 代码将实现将转义码发送到终端,并且比原始十六进制数字更具可读性。
void showCursor(bool show) const
#define CSI "\e["
if (show)
fputs(CSI "?25h", stdout);
else
fputs(CSI "?25l", stdout);
#undef CSI
【讨论】:
除非别无选择,否则不要对终端控制代码进行硬编码。使用 ncurses 查找当前$TERM
值的相应代码,除非由于某种原因不能使用 ncurses。
我同意 ncursrs 是最好的,但如果由于某种原因您无法访问它,这在某些情况下可能是一个“足够好”的解决方案。
Powershell 似乎尊重这个序列,如果它前面有一个 SGR 转义序列或一个光标移动序列,但如果它前面有一些其他序列,包括 ?25
的另一个实例,则不是! \e[0m\e[?25h
似乎工作正常。以上是关于隐藏远程终端上的光标的主要内容,如果未能解决你的问题,请参考以下文章
linux 如何从远程终端下载文件到本地磁盘? 我的系统也是linux的,想从远程终端(ssh.)上复制文件到本地