OSX 上的串行控制台登录

Kar*_*aru 7 terminal command-line serial-port macos

背景

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

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

MODEM 端口通过 DB25-DB9 转换器连接到我的 mac,然后通过 USB-DB9 适配器使用 Prolific 芯片组从那里连接到 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/LaunchDaemonsconsole.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>
Run Code Online (Sandbox Code Playgroud)

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

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

在另一个港口

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

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

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

使用上述设置,以下是我对终端输出的含义的示例:

有很多噪音的绿色终端屏幕

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

输入我的密码(正确地没有回显)显示“上次登录”消息,然后是一个完全废弃的外壳。几乎就好像换行符以某种方式被破坏了。

如果我在终端上按Ctrl+ l,最后一行会自行重置,并且我会看到一个干净的提示(未显示)。但是,下次我按下return终端时,垃圾会返回。

我的终端设置为/bin/sh.

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

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

  • VT100(如图)
  • UNIX CONSOLE(大量高位 ASCII 符号)
  • WY-50(终端实际型号:大量高ascii符号喷在屏幕上

硬件?

我不这么认为。完全相同的适配器/终端/等设置连接到 Ubuntu Linux 机器,getty配置如所述,并且它 Just Worked®,屏幕上没有噪音或垃圾。

此外,使用第三方应用程序Serial将纯文本写入终端工作没有问题 - 没有垃圾,并且换行符得到正确处理。

Mac OS 的一些配置getty导致此终端出现问题。

有任何想法吗?

更新 1

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

screen /dev/cu.usbserial 57600
Run Code Online (Sandbox Code Playgroud)

然后从屏幕内,点击ctrl+ a:然后输入:

exec ::: /usr/libexec/getty std.57600
Run Code Online (Sandbox Code Playgroud)

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

然而,这种方法仍然有一些缺点。

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

如下图:

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

程序深信,终端类型设置为screen,即使我做的export term='vt100'-这意味着,最喜欢的全屏幕终端应用vimmutt下降很多的控制代码的终端不能处理,通常它挂到一个点复位需要再次获得输入。

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

Kar*_*aru 11

经过多次摆弄之后,我终于找到了用于完全可用终端的正确组合。

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

细节

硬件

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

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

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

此电缆应连接到终端上的MODEM端口。

系统配置

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

我想知道如何设置登录的终端类型,因为如上所述,出于某种原因,只使用终端左侧std.19200提供/etc/gettytab的设置su,但没有任何效果。

我添加了一行如下:

std.ttyUSB:\
    :np:im=\r\n:sp#57600:tt=vt220:
Run Code Online (Sandbox Code Playgroud)

这会将登录横幅设置为简单的 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>
Run Code Online (Sandbox Code Playgroud)

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

终端设置

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

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

F1进入DISP菜单,我设置:

  • 列到 132
  • 行到 42,
  • 自动翻页关闭
  • 80/132 CLR 开启。(如果字符模式改变则清除屏幕)

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
Run Code Online (Sandbox Code Playgroud)

最后启动它:

launchctl start serialconsole.plist
Run Code Online (Sandbox Code Playgroud)

稍后,您的终端上应该会出现登录提示!一些照片:

在登录

跑步上衣

显示故障

您可能会注意到某些应用程序仍然在屏幕上写入垃圾,尤其是当它们执行诸如粗体文本或某些 ASCII 字符之类的花哨操作时。最近的机器,包括 mac,使用 UTF-8 作为其字符集。但是这个古老的玻璃终端不知道那是什么!您需要将区域设置为您所在地区的相应旧代码页。在美国,这是en_US.ISO-8859-1。查看 的输出locale,并将该命令处理export LC_ALL='en_US.ISO-8859-1'为检查$TERM变量的登录脚本。您真的不想在系统范围内设置此系统,而只是在使用玻璃终端的会话中设置。