答案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
,,,terminfo
tic
ls -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