Mac、Linux完美解决SSH连接GBK服务器

目前我们开发的项目最终都是部署到服务器上,而服务器一般而言都是Linux的操作系统。大部分情况下,服务器字符编码都是UTF-8的,开发环境也基本都是UTF-8。然鹅,最近待的公司,一些服务器字符编码是GBK,我本地默认的UTF-8登录上去中文直接乱码。

本文介绍了如何快速无痛地解决本地UTF-8环境登录GBK的服务器。由于现在是Mac的重度使用者,所以本文也就介绍了Mac下如何完美解决SSH连接GBK服务器,Windows的机器SecureCRT可以完美解决这个问题,自行谷歌一下。

我一直使用的是iterm2终端(当然,Mac自带的terminal终端也很好用)。

一开始的时候,我是使用创建不同的profile来指定iterm2的编码方式,用着也还算OK,唯一蛋疼的就是,每当需要GBK编码时候,都得右键重新开一个iterm2的窗口,而且通过command+t新开出来的页面还是采用了default profile

所以就需要浓重地推出本文的主角——luit

luit介绍

luit 命令是一个过滤器,在任意应用程序和UTF-8终端仿真器之间运行。luit命令将应用程序输出从语言环境的编码转换为UTF-8,并将终端输入从UTF-8转换为语言环境的编码。

多语言应用程序必须设置为仅生成UTF-8代码。不得使用命令生成UTF-8之外的输出。

luit命令由终端以透明方式调用。有关从命令行运行luit命令的信息,请参见示例。

SSH执行过程图示

在终端中执行命令,通信过程示意图如图1或者图2所示。

SSH通信过程示例1

SSH通信过程示例2

执行命令时,使用终端模拟器配置的编码方案,对原命令字符串进行编码,将得到的字节流传递给“命令执行单元”;

展现命令执行结果时,获取字节流形式的命令执行结果,使用终端模拟器配置的编码方案,对其进行解码,得到字符串形式的命令执行结果。

使用luit后的执行过程

通过使用luit命令,现在在终端模拟器中执行命令,通信过程示意图如图3或者图4所示。

SSH通信过程示例3

SSH通信过程示例4

此时执行命令时,使用终端模拟器配置的编码方案,对原命令字符串进行编码,得到字节流,再使用UTF-8编码方案进行解码得到字符流,最后使用luit命令中指定的编码方案(比如luit -encoding GBK program [args]中的GBK)进行编码,将得到的字节流传递给“命令执行单元” ;

展现命令执行结果时,获取字节流形式的命令执行结果,使用luit命令中指定的编码方案进行解码得到字符流,再使用UTF-8编码方案进行编码得到字节流,最后对得到的字节流使用终端模拟器配置的编码方案进行解码,得到字符串形式的命令执行结果。

安装

上面介绍了一堆SSHluit的原理,下面抓紧进入正题,安装使用luit

luit官网下载相应的源码,然后解压编译安装

1
2
3
4
5
6
7
8
9
10
11
12
# 解压
tar zxvf luit.tar.gz
# 进入源码文件夹,可能版本会不一样
cd luit-20180508
# 配置
./configure
# 编译
make
# 安装
make install
# 卸载
make uninstall

安装完成后,最简单的使用方式就是luit -encoding gbk ssh了,这已经能满足我们目前的需求了,当然为了学深学透,我们还是在下一章节介绍一下luit命令的全部语法

使用

语法

1
luit [ options ] [ -- ] [ program [ args ] ]

options

项目 描述
-h 显示帮助摘要。
-list 列示受支持的字符集和编码。
-v 详细。
-c 将标准输入转换为标准输出。
-x 在子函数终止时立即退出。这可能会导致 luit 命令在子函数的输出结束时丢失数据。
-argv0 name 设置随 argv[0] 命令传递的子代的名称。
-encoding encoding 指定 luit 命令使用当前语言环境编码之外的编码。
+oss 禁止在应用程序输出中解释单个 shift。
+ols 禁止在应用程序输出中解释锁定 shift。
+osl 禁止在应用程序输出中解释字符集选择序列。
+ot 禁止解释所有序列并将应用程序输出中的所有序列原样传递到终端。
-k7 为键盘输入生成 7 位字符。
+kss 禁止为键盘输入生成单个 shift。
+kssgr 在键盘输入的单个 shift 后使用 GL 代码。缺省情况下,会在生成 8 位键盘输入时在单个 shift 后生成 GR 代码。
-kls 为键盘输入生成锁定 shift (SO/SI)。
-gl gn 设置 GL 的初始分配。参数必须为 g0、g1、g2 或 g3。缺省值取决于语言环境,通常为 g0。
-gr gk 设置 GR 的初始分配。缺省值取决于语言环境,通常为 g2(EUC 语言环境除外,这种语言环境的缺省值为 g1)。
-g0 charset 设置在 G0 中最初选择的 charset 的值。缺省值取决于语言环境,但通常为 ASCII。
-g1 charset 设置在 G1 中最初选择的 charset 的值。缺省值取决于语言环境。
-g2 charset 设置在 G2 中最初选择的 charset 的值。缺省值取决于语言环境。
-g3 charset 设置在 G3 中最初选择的 charset 的值。缺省值取决于语言环境。
-ilog filename 将从子代接收的所有字节记录到 filename 文件中。
-olog filename 将发送到终端仿真器的所有字节记录到 filename 文件中。