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