有任何想法吗?

有任何想法吗?

背景

我这里有一个 Wyse WY-50 终端,出于各种怀旧和生产力原因(真的!),我想将其连接到我的 Macbook 并用作登录终端。我使用的是 OSX 10.10 El Capitan。

终端本身背面有两个端口,一个标有 MODEM,一个标有 AUX。从手册上看,通常您要连接的设备使用 MODEM 端口,而另一个辅助设备(如打印机)使用 AUX 端口。这两个都是 DB25 端口。

MODEM 端口通过 DB25-DB9 转换器连接到我的 Mac,然后使用 Prolific 芯片组通过 USB-DB9 适配器连接到 Mac。

我必须安装驱动程序才能使用转换器。完成此操作后,我在 中创建了两个设备/dev/,分别是cu.usbserialtty.usbserial

我关注了指南在这里设置一个 LaunchDaemon Plist 来生成getty连接到终端的会话,因为显然你不能在现代 OSX 中手动编辑/etc/ttys或运行。getty

终端本身设置为 VT100 仿真模式,波特率为 19200,接收时使用 DTR 流控制,发送时无流控制(发送流控制的唯一选项是XON/XOFF

困难

事实证明,这种设置很难排除故障,因为与串行设备的错误通信往往会使其“挂起”,需要重新启动才能再次使用。

getty在所有情况下,无论是在文件中还是手动调用,都是采用以下形式:/usr/libexec/getty std.19200 cu.usbserial

每当您看到“无输出”时,这都意味着终端处于静音状态,什么都没有显示,并且对按键没有反应。

  • 手动运行getty:无输出。(似乎验证了指南)
  • 添加一行到/etc/ttys:无输出。(再次验证指南)

从这里开始,我尝试了 plist 方法,通过向其添加一个/Library/LaunchDaemons名为console.plist以下内​​容的文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>serialconsole</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/libexec/getty</string>
        <string>std.19200</string>
        <string>cu.usbserial</string>
    </array>
    <key>StandardErrorPath</key>
    <string>/tmp/serialconsole.err</string>
    <key>StandardOutPath</key>
    <string>/tmp/serialconsole.out</string>
</dict>
</plist>

加载并运行作业后,尝试了以下操作,每次都按顺序尝试停止、编辑、卸载、重新加载和运行作业:

  • 终端上的流量控制设置为NONE:无输出。
  • getty命令和终端上设置的波特率不同(从 9600 到 19200):无输出。
  • 使用该tty.usbserial设备而不是cu.usbserial与上述设备结合使用:无输出。
  • 将终端上的串行线移至 AUX 端口并重新配置它以使用 AUX 端口进行通信:发生了一些事情!

在另一个端口上

因此,如果计算机通过 AUX 端口连接到终端,我就可以进行基本通信。设置如下:

  • gettylaunchd使用上面的 plist运行
  • 终端个性设置为VT100
  • 禁用流量控制

然而,这会导致终端屏幕上出现大量垃圾字符。登录提示本身很干净,但按回车键总会生成少量垃圾。登录后,这些垃圾往往会连接到命令的末尾,使会话几乎不可靠且不可用。

使用上面描述的设置,下面是我在终端输出上所指的示例:

终端屏幕呈绿色且杂色较多

端口初始化后,您会看到一些噪音,然后是“干净”的登录显示。我输入用户名并按下终端键盘上的 Return 键。您不会看到一行一行地输入密码,而是看到出现UTHx,然后在同一行上出现密码提示。

输入我的密码(密码没有正确回显)会显示“上次登录”消息,然后 shell 会完全崩溃。这几乎就像换行符不知为何被弄乱了一样。

如果我按下终端上的Ctrl+ 键l,最后一行会自行重置,然后我会看到一个干净的提示符(未显示)。但是,当我下次按下return终端上的 + 键时,垃圾信息又回来了。

我的终端设置为/bin/sh

我读到的另一个建议是尝试使用reset命令将显示清除为已知良好的设置。输入 reset 并点击它,return我得到了干净的错误“未知的终端类型:su (-1)”。并提示Terminal type?

将终端上的“个性”设置(与上面的重置相关)更改为其他有希望的选项只会修改我看到的垃圾的“种类” - 没有一个是干净的。

  • VT100(如图所示)
  • UNIX 控制台(大量高位 ASCII 符号)
  • WY-50(终端的实际型号:大量高 ASCII 符号喷洒在整个屏幕上

硬件?

我不这么认为。将完全相同的适配器/终端/等设置连接到 Ubuntu Linux 机器,并getty按照所述进行配置,它就可以正常工作®,屏幕上没有噪音或垃圾。

此外,使用第三方应用程序串行只需将纯文本写入终端即可正常工作 - 没有垃圾,并且换行符也能正确处理。

Mac OS 的配置存在一些问题,getty导致该终端出现问题。

有任何想法吗?

更新 1

我找到了一种获得可用终端会话的方法。运行screen,指向串行端口,如下所示:

screen /dev/cu.usbserial 57600

然后在屏幕内按ctrl+ a:然后输入:

exec ::: /usr/libexec/getty std.57600

瞧!终端上出现了一个干净、可用的登录 shell!

但这种方法仍然存在一些缺点。

提示行加倍。也就是说,只要您在提示符下按回车键,就会出现提示符、换行符和另一个提示符。提示行上仍然有大量噪音 - 任何一次性转储大量文本的命令都会导致ls乱码输出。

如下图所示:

乱码的“ls”和嘈杂的屏幕

程序确信终端类型设置为screen,即使我做了export term='vt100'- 这意味着大多数全屏终端应用程序都喜欢vimmutt放弃大量终端无法处理的控制代码,通常将其挂起到需要重置才能再次获得输入的地步。

我仍在寻找让终端在登录时正常工作的方法。

答案1

经过一番折腾,我终于找到了正确的组合,可以用于完全可用的终端

tl;dr:基于 FTDI 的 USB/串行适配器,终端设置为 VT220,双向流量控制,特殊设置/etc/gettytab

细节

硬件

我买了一条新的 USB/串行电缆。这根电缆使用的​​是 FTDI,而不是 Prolific 芯片组。这一点很重要,因为OSX 自带 FTDI 驱动程序,而不必安装第三方 Prolific 驱动程序。这使得故障排除变得容易得多,因为串行端口在每次实验后都不再卡住,这意味着不再需要重新启动才能再次使用。

如果你想自己尝试一下,我使用的电缆是StarTech 工业 USB RS232 串行适配器。这是与随机 DB9/DB25 适配器和性别转换器结合使用的,因为终端背面的端口是母的。

注意:本指南的先前版本建议使用不同的电缆 - 这种特殊的电缆将让我们使用终端上的调制解调器端口,纠正一些不同的显示故障!

该电缆应连接到调制解调器终端上的端口。

系统配置

忽略任何建议您使用的指南/etc/ttys,因为该文件在现代版本的 OS X 中会被忽略。这在 Linux/BSD 上适用,但在这里不适用。

我一直想知道如何设置登录的终端类型,因为如上所述,仅使用std.19200所提供的/etc/gettytab终端设置su为出于某种原因,但什么都不起作用。

我添加了一行如下:

std.ttyUSB:\
    :np:im=\r\n:sp#57600:tt=vt220:

这会将登录标语设置为简单的 CRLF,将线路速度设置为 57600 波特,最重要的是,将终端设置为vt220。这在后面会变得很重要。

现在我们需要真正启动它。如其他地方所述,您不能只运行getty,因为这仅限于launchd。我们必须创建并加载守护进程 plist。

在 中/Library/LaunchDaemons,我添加了 ,serialconsole.plist其内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>serialconsole</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/libexec/getty</string>
        <string>std.ttyUSB</string>
        <string>cu.usbserial-AI02GVBH</string>
    </array>
</dict>
</plist>

如果您自己执行此操作,则第三个字符串几乎肯定会有所不同,因为这是适配器的序列号。第二行引用了我们刚刚添加到 to 的行。还请注意to/etc/gettytab的设置- 这意味着当进程退出时(例如,我们注销),将生成一个新实例。如果没有这个,您必须手动启动该作业。KeepAlivetrue

终端设置

最后,终端本身必须进行配置。这是 Wyse WY50,但它可以模拟许多其他终端类型。我发现 VT220 模式提供了最佳体验。

要从出厂设置进入终端的设置模式,请按Shift+ Setup

按下F1进入DISP菜单,我设置:

  • 列数为 132
  • 到 42 号线,
  • 自动分页关闭
  • 80/132 CLR ON。(如果字符模式改变则清除屏幕)

F2到常规屏幕。

  • 个性设置为 VT220-8重要的!
  • Scrl 设置为 Jump(在其他设置下,屏幕滚动会变得非常慢)
  • RCV CR 设置为 CR(仅传输 CR,而不是 CRLF)
  • 增强设置为 ON(接受增强控制代码)
  • Autoscrl 设置为 ON(不言自明 - 滚动屏幕而不是覆盖它)
  • 显示器设置为关闭
  • 识别 DEL 设置为 ON

F3进入 KEYCODE 屏幕

  • 键码设置为 ASCII
  • 角键设置为 META(也称为 Alt)

F4进入 COMM 屏幕

更多极其重要的事情:

  • 通信设置为 FDX(全双工)
  • MDM RC HSK 设置为 Both(接收流控制)
  • 发送确认设置为开启
  • MDM XMT HSK 设置为 Xon-Xoff

再来一个 -F5进入 PORTS 屏幕

  • MDM 波特率设置为 57600
  • AUX 数据/奇偶校验设置为 8/无
  • AUX 停止位设置为 1

其余一切都保留为出厂默认设置。

点击F12,然后Space将“保存”设置为“是”,然后F12再次保存设置。

综合起来

我们已准备就绪。确保终端已打开并插入端口,验证设置是否如上所述gettytab以及您创建的 plist 文件。

我们将创建的plist加载到launchd中:

launchctl load -w /Library/LaunchDaemons/serialconsole.plist

最后启动它:

launchctl start serialconsole.plist

一会儿,您的终端上就会出现登录提示!以下是一些照片:

在登录

跑步上衣

显示故障

您可能会注意到某些应用程序仍然会在屏幕上显示乱码,尤其是当它们执行任何花哨的操作(例如粗体文本或某些 ASCII 字符)时。大多数最新的机器(包括 Mac)都使用 UTF-8 作为其字符集。但是这个古老的玻璃终端不知道那是什么!您需要将区域设置为适合您所在地区的旧代码页。在美国,这是en_US.ISO-8859-1。查看 的输出locale,并将命令export LC_ALL='en_US.ISO-8859-1'放入检查变量的登录脚本中$TERM。您真的不想在整个系统范围内设置这个,而只想在使用玻璃终端的会话中设置。

答案2

当我使用 Prolific Device 时,乱码非常多,后来我使用 FTDI 串行电缆解决了这个问题。连接后,默认的 Mac OS shell 是 zsh,默认情况下支持“括号内粘贴”。它显示为 ^[[?2004hI。这对较旧的终端来说很麻烦,要消除它,请在终端上使用命令“unset zle_bracketed_pa​​ste”。

答案3

接受的答案非常有帮助。我还发现http://www.club.cc.cmu.edu/~mdille3/doc/mac_osx_serial_console.html非常有用。

相关内容