在我的公司中,当进入其他系统时,我们使用expect
自动化任务。ssh
我们所有的旧系统都运行 ISO-8859-1 字符编码,而我们的桌面系统运行 UTF-8 编码。ssh
当从我们的一个桌面进入我们的遗留系统时,这当然会带来某些挑战。
这很容易解决,方法是在开始会话之前删除SendEnv
行并将 Gnome 终端字符编码设置为 ISO-8859-1。从命令提示符或脚本手动执行此操作时效果很好。但是,当从脚本内部执行此操作时,它会失败。看起来字符编码要么根本没有处理,要么从内部处理不正确,这会导致我们在输入特殊字符时出现错误的字符。/etc/ssh/ssh_config
ssh
bash
expect
expect
有效的裸骨bash
脚本:
#!/bin/bash
ssh user@server
产生错误的基本expect
脚本:
#!/usr/bin/expect --
spawn ssh user@server
interact
在执行这两个脚本之前,已经手动正确设置了 Gnome 终端字符编码。这两个脚本应该工作相同,通过ssh
进入服务器并让用户输入密码。但是bash
脚本正确处理字符编码,而expect
脚本会产生损坏的特殊字符。
我假设我遗漏了一些明显的东西,但我无法弄清楚我遗漏了什么。
编辑:我们已经尝试过luit
,但没有帮助。它只会导致不同的错位字符。
expect
如您所知,它是用该tcl
语言编写的,您可以在此处查找有关它如何处理国际化的信息。在内部,tcl 将字符转换为 utf-8,但假定所有输入和输出都使用系统编码,即终端的语言环境。要为特定数据流覆盖它,您可以
fconfigure
在通道 id 上使用来指定要使用的编码。spawn命令通过设置变量来公开创建的通道spawn_id
。(请注意,有时需要将此变量声明为全局变量,例如在过程中)。对于您的简单示例,您需要告诉 tcl ssh i/o 流的编码,它应该为您进行必要的转换,而无需以任何方式更改 gnome 终端语言环境。