为什么 iftop 显示“b”字符而不是行?

为什么 iftop 显示“b”字符而不是行?

我正在通过 SSH 连接到我的 Raspberry Pi 4。虽然我看到伊夫托普在所有捕获中都有一个很好的框架,我的显示'b' 字符而不是行。奇怪的是,角件和所有其他输出都显示得很好。这与 OS X 内置的 SSH 客户端有关吗?这是伊夫托普

通过 SSH 进行的 iftop 进程的屏幕截图

通过 SSH 进行的 iftop 进程的屏幕截图

答案1

检查环境变量TERM( echo $TERM)。tmux 及其朋友将其设置为 ncurses 库可能不知道的“屏幕”或类似内容。此运行时库由 iftop 用来绘制装饰和 ascii 窗口。

将其设置为iftop可以接受的数值并调用iftop

TERM=xterm iftop

您可以像上面一样在命令行中设置环境变量,它将仅用于此次“iftop”调用。这是一种简单的测试方法。

如果您使用的是 OSX,则可以使用xterm-256color,对于 Linux 来说也是如此xcfe-terminal。我正在使用老旧的/usr/bin/xterm,所以TERM=xterm对我来说很管用。

要查看所有可能的终端,只需使用toe“(terminfo)条目表”。

更多man/google 关键字:ncurses,,,terminfoticls -l /usr/share/terminfo/?/*

答案2

这些尝试替代TERM类型的建议似乎都不适用于 Ubuntu 20.x 和 21.x,无论是在文本控制台还是通过 SSH(我的服务器上没有 X)。但是,更改LANG确实奏效了:

LANG=C iftop

答案3

iftop 使用 VT100“特殊图形”备用字符集模式来显示这些方框绘制字符 - 它不使用纯 Unicode 符号。(从技术上讲,ncurses 管理屏幕和所有绘制,但 iftop 似乎特别要求使用 ACS 字符,因此即使 $NCURSES_NO_UTF8_ACS 处于活动状态,它仍然不会强制使用 UTF-8。)

其工作方式是\e(0切换到替代字符;普通 ASCII 字母(如)qwqvqk被绘制为符号(如)└─┬─┴─┐,最后\e(B切换回正常字符。

但我不知道为什么这个问题只会影响一些图形,因为 iftop 通常一次打印整行 – 似乎没有任何东西会强制终端中途切换回 ASCII。这可能是由服务器上使用的 ncurses 和/或 iftop 版本引起的。

(当您使用 tmux/Mosh/Screen 时,它们会自行充当终端仿真器,并在从程序接收数据时在内部将 ACS 转换为 Unicode,因此 Terminal.app 会收到 iftop 尝试发送的“清理”版本,从而消除阻抗不匹配。)

答案4

最后一个适用于 OpenWRT 22.03.3。其他都不起作用。抱歉,现在是 2023 年。但我遇到了这个问题。export NCURSES_NO_UTF8_ACS=1。我把它放在我的 shell 脚本中来运行 IFTOP。

在上述版本的 OpenWRT 中,在 SSH 会话中。

#!/bin/bash
if [ -z $1 ]; then
        echo "usage $0 <interface>"
        exit 1
else
        # The below needed, or else lines are letters like qqqqqqqq
        export NCURSES_NO_UTF8_ACS=1
                iftop -i $1
fi

相关内容