我有一个设备,/var/iot/data
我正在尝试从远程获取数据。
在机器本身上:
# cat /var/iot/data | xxd -ps -c 32
80de004a030270055678013ac591e5c6abac2185f4319c8088e3
这是正确的数据。
如果我远程运行同样的事情,它看起来是正确的:
$ ssh -T -x dragino 'cat /var/iot/data | xxd -ps -c 32'
80de004a030270055678013ac591e5c6abac2185f4319c8088e3
但它实际上是通过一堆转义序列实现的:
$ ssh -T -x dragino 'cat /var/iot/data | xxd -ps -c 32' | xxd
00000000: 1b5d 3131 3b23 3138 3464 3666 0738 3064 .]11;#184d6f.80d
00000010: 6530 3034 6130 3330 3237 3030 3535 3637 e004a03027005567
00000020: 3830 3133 6163 3539 3165 3563 3661 6261 8013ac591e5c6aba
00000030: 6332 3138 3566 3433 3139 6338 3038 3865 c2185f4319c8088e
00000040: 330a 1b5d 3131 3b23 3139 3139 3730 07 3..]11;#191970.
.]11;#184d6f.
一开始的这一切是什么?
答案1
序列是
OSC 1 1 ; # 1 8 4 d 6 f BEL
OSC 1 1 ; # 1 9 1 9 7 0 BEL
这是xterm 控制序列请求设置终端文本背景颜色。可能是由编写错误的 shell 初始化文件引起的,该文件导致输出这些文件以试图区分命令的输出与 shell 提示符,但无条件地这样做
答案2
您很可能被 bash 的奇怪行为所困扰初始化文件。 Bash.bashrc
在两种完全不同的情况下加载:
- 如果它是一个交互式非登录 shell。
- 如果它是由
sshd
.
因此,当您通过 SSH 登录时,.bash_profile
如果 shell 是交互式的,则bash 会加载.bashrc
,如果不是的话。传递-T
tossh
不会影响这一点,而且实际上对您的情况没有什么影响,因为如果您不传递命令或传递到 ,SSH 只会创建一个-t
终端ssh
。
你的.bashrc
显然包含一些通过发出一些转义序列与终端进行交互的代码(具体来说,设置背景颜色)。为了避免这造成严重破坏,不要运行任何东西.bashrc
为了避免造成严重破坏,如果 bash 没有以交互方式运行,把这个放在顶部.bashrc
:
if [[ $- != *i* ]]; then return; fi
答案3
我有一个名为的函数,ssh
它在 ssh 之前设置终端背景,以便我始终知道哪个终端是远程的。抱歉浪费了大家的时间。
答案4
-T
的选项将ssh
导致远程 SSH 服务器为会话分配虚拟终端,因此程序(例如 shell)将采取相应的操作。
对于传输任意数据,请忽略该-T
选项。