expect 会干扰 ssh 期间的字符编码

expect 会干扰 ssh 期间的字符编码

在我的公司,我们在进入其他系统expect时使用自动化任务。我们所有的旧系统都运行 ISO-8859-1 字符编码,而我们的桌面系统运行 UTF-8 编码。这当然在从我们的某个桌面进入我们的旧系统时带来了一定的挑战。sshssh

SendEnv只需在启动会话之前删除行/etc/ssh/ssh_config并将 Gnome 终端字符编码设置为 ISO-8859-1 即可轻松解决此问题ssh。从命令提示符或脚本手动执行此操作时,此方法可行bash。但从脚本内部执行此操作时,expect此方法会失败。似乎字符编码根本没有处理,或者从内部处理不正确expect,导致我们输入特殊字符时出现乱码。

可以运行的基本bash脚本:

#!/bin/bash
ssh user@server

expect产生错误的基本脚本:

#!/usr/bin/expect --
spawn ssh user@server
interact

在执行这两个脚本之前,已手动正确设置了 Gnome 终端字符编码。这两个脚本的工作方式应该相同,即ssh进入服务器并让用户输入密码。但是bash脚本可以正确处理字符编码,而expect脚本会产生混乱的特殊字符。

我认为我遗漏了一些明显的东西,但我不知道我遗漏了什么。

编辑:我们已经尝试过了luit,但没用。它只会导致不同的字符混乱。

答案1

expect是用这种tcl语言写的,你可以看看这里了解它如何处理国际化。在内部,tcl 将字符转换为 utf-8,但假定所有输入和输出都使用系统编码,即你的终端的语言环境。

要为特定数据流覆盖此设置,您可以fconfigure在通道 ID 上使用它来指定要使用的编码。产卵命令通过设置变量来公开创建的通道spawn_id。(请注意,有一个常见的错误有时您需要将此变量声明为全局变量,例如在过程中)。

对于您的简单示例,您需要告诉 tcl ssh i/o 流的编码,它会为您完成必要的转换,而无需您以任何方式更改 gnome 终端区域设置。

#!/usr/bin/expect --
spawn ssh user@server
fconfigure $spawn_id -encoding iso8859-1
interact

相关内容